Nuxt re-rendering 无缘无故 - 内容从一个版本跳到另一个版本

Nuxt re-rendering for no reason - content popping from one version to another

我正在尝试 运行 在我的着陆页上进行 A/B 测试,它是 statically-generated Nuxt (v2.15.7) 站点的一部分。对于 50% 的用户,我们在表单上显示不同的标题和描述。

问题是当页面加载时,内容有时会从 A 测试版本弹出到 B 测试版本(没有刷新页面,或任何其他手动导致 re-render) .

这是我的代码,减少了问题的最准系统再现:

我的着陆页组件:

<template>
  <div>
    <SliceMinimalFormHeader
      :locale="locale"
      v-bind="formContent"
      :experiments="experiments"
    />
  </div>
</template>

<script>
import SliceMinimalFormHeader from '@/components/SliceMinimalFormHeader.vue'
import { EXPERIMENTS } from '@/data/consts.js'

export default {
  components: {
    SliceMinimalFormHeader,
  },
  props: {
    locale: {
      type: String,
      default: 'en-us'
    }
  },
  data() {
    const testGroup = Math.random() > 0.5 ? 'A' : 'B'
    return {
      experiments:
        this.locale === 'en-us' && testGroup === 'A'
          ? [EXPERIMENTS.CALCULATOR]
          : [],
      formContent: {
        'form-heading': '',
        'form-description': ''
      },
    }
  },
  created() {
    const newFormContent = { 
      'form-heading': 'Heading for the B test version', 
      'form-description': 'Description for the B test version' 
    }
    if (this.experiments.includes(EXPERIMENTS.CALCULATOR)) {
      newFormContent['form-heading'] =
        'Heading for the A test version'
      newFormContent['form-description'] =
        'Description for the A test version'
    }
    this.formContent = newFormContent
  }
}
</script>

然后,在 child SliceMinimalFormHeader 组件中:

<template>
  <section class="grid-12 content-wrapper">
    <h4 class="heading-2" :class="$style['form-heading']">
      {{ formHeading }}
    </h4>
    <div :class="$style['form-description']">
      {{ formDescription }}
    </div>
  </section>
</template>

<script>
export default {
  props: {
    formHeading: {
      type: String,
      default: ''
    },
    formDescription: {
      type: String,
      default: ''
    }
  }
}
</script>

我已经无计可施了!!任何帮助将不胜感激。

Vue 是一个客户端框架。所有的HTML都是浏览器内部的JS生成的。这意味着典型的 Vue 应用程序只是非常简单的 HTMl 文件,几乎没有 HTML 和一些 CSS 和 Javascript <script> 标签...

这是 SEO 的问题,因为大多数爬虫(Google、FB、Twitter)不执行 JS,只是扫描从服务器返回的 HTML...

为了解决这个问题,像 Nuxt 这样的框架应运而生。他们通过在服务器上执行 Vue 应用程序并在服务器上渲染 HTML 来解决问题 - 在请求时(Nuxt 经典​​ - 每次请求到来时都会生成新的 HTML)或在构建时( Nuxt generate - HTML 被生成到一个文件并且相同的 HTML 为每个请求返回)

在所有情况下,服务器返回的 HTML 是不同的,但其他一切都是一样的。它仍然是一个 Vue 应用程序,它在客户端上执行,一旦启动,它就会覆盖从服务器返回的任何 HTML...

所以在你的情况下你 generate 一些 HTML 为所有用户(所以 A 或 B 是随机选择的),这个 HTML 是为所有用户加载的,但是一旦Vue 应用程序已加载,它获取控制权并(随机)呈现 A 或 B 变体...