19

标题可能看起来有点模糊,但那是因为我目前在我们的 React / Next.js 项目中集成 Google Optimize 时遇到了多个问题。我将尝试尽可能详细地解释我的问题和行动。但是,如果有不清楚的地方,请告诉我。

问题:

  1. 虽然在头顶添加了谷歌优化,但我们总是会遇到页面闪烁的情况。这意味着用户首先看到我们的页面,然后什么都没有(异步隐藏功能启动),然后页面再次发生变化。
  2. 我创建了一个实验,它重新排序导航链接、删除一个导航链接并更改我们的 CTA 文本。出于测试目的,我已将变体设置为 100%。发生的情况(与问题 1 相关)是我们首先看到我们的原始网页,然后是更改,然后再次看到删除了一个导航链接的原始网页。这意味着它添加了变体,但删除了一些更改。
  3. 在动态页面上添加实验时,无法应用更改。当我运行实验时,没有任何变化,当我重新打开可视化编辑器时,它说更改存在问题。即使更改只是简单的文本更改。

我试过的:

  1. 默认情况下在 html 上添加“async-hide”类名。默认情况下,这会将网页设置为隐藏。如果我使用谷歌优化同步,这很好。但是,如果我将其设置为异步,则需要 1 到 2 秒才能显示页面,这不是很好的性能。
  2. 我按照谷歌在此处提到的确切步骤在谷歌标签管理器中添加了谷歌优化。是的,我确实将我的 async-hide 函数中的 Google Optimize 容器 ID 更改为 GTM 容器 ID。
  3. 我取消了上面的第 2 部分,并像这样手动添加了 Google Optimize。
<Html lang="en" className="async-hide">
<Head>
  {/* 
    Google Optimize Ant-Flicker Snippet
    https://support.google.com/optimize/answer/9692472?ref_topic=6197443
  */}
  <style
    dangerouslySetInnerHTML={{
      __html: `.async-hide { opacity: 0 !important}`,
    }}
  />
  <script
    dangerouslySetInnerHTML={{
      __html: `
      (function(a,s,y,n,c,h,i,d,e){s.className+=' '+y;h.start=1*new Date;
      h.end=i=function(){s.className=s.className.replace(RegExp(' ?'+y),'')};
      (a[n]=a[n]||[]).hide=h;setTimeout(function(){i();h.end=null},c);h.timeout=c;
      })(window,document.documentElement,'async-hide','dataLayer',4000,
      {'OPT-OPTIMIZE_ID':true});
    `,
    }}
  />
  <script src="https://www.googleoptimize.com/optimize.js?id=OPT-OPTIMIZE_ID"></script>

  {/* Google Tag Manager */}
  <script async src="https://www.googletagmanager.com/gtm.js?id=GTM-TAGMANAGER_ID"></script>
  <script
    dangerouslySetInnerHTML={{
      __html: `
        (function(w,l){w[l]=w[l]||[];w[l].push({'gtm.start':
        new Date().getTime(),event:'gtm.js'});
        })(window,'dataLayer');
      `,
    }}
  ></script>
...
[rest of code]

我遇到的问题

  1. 这个问题与 Next.js 有关吗?我们在反应应用程序中使用静态多页而不是单页的事实
  2. 在 React / Next.js 项目中实施 Google Optimize 的最佳方法是什么:通过 Google Tag Manager 或 Google Optimize
  3. 在 React / Next.js 项目中,Google Optimize 的最佳加载方法是什么:异步还是同步?
4

1 回答 1

13

这是您在这里遇到的一个很常见的问题。Google Optimize 和其他通过 Javascript 在客户端更改网站内容的 A/B 测试解决方案会产生闪烁效果,因为必须先下载脚本才能更改任何内容。

要回答您的问题:

  1. 当您使用 next.js 时,会出现一些特殊问题。Next.js 在服务器上使用服务器(或静态渲染阶段)以及在客户端使用水合阶段。当您在水合作用开始之前放置谷歌优化工具(并加载)时,它将呈现正确的实验,但一旦水合作用开始就会被覆盖。

  2. 您如何将其与 Tagmanger 正确集成:在最外部的组件中,例如,<App/>您可以使用useEffect()抛出 tagmanager 事件的钩子来触发优化实验的插入。

    !请注意!通过这种方式,您将获得闪烁效果或减慢您的网站速度,因为您必须等到所有东西都补水,这在慢速设备上可能需要几秒钟,然后才会重新呈现您的内容。

    这是 Jamstack Pages 的一个常见问题——可以通过将实验 api 直接集成到代码中来解决,这肯定更复杂。

  3. 同步加载会减慢您的网站速度,因为它会阻止渲染,直到加载 JS 和内容,异步加载会使网站闪烁。这是使用基于标签的 A/B 测试时的两个选项 - 您必须选择较小的邪恶。

于 2020-12-03T17:14:48.140 回答