React / Next.js 中使用 Google Optimize 的一般问题

20

标题可能有点模糊,因为我目前正在尝试在我们的React / Next.js项目中集成Google Optimize时遇到了多个问题。我会尽可能详细地说明我的问题和行动。但是,如果有什么不清楚的,请告诉我。

问题:

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

我已经尝试过的内容:

  1. 默认在html上添加“async-hide”className。这将网页默认隐藏。如果我使用Google Optimize同步,这很有效。如果我将其设置为异步,则需要1到2秒才会显示页面,这不利于性能。
  2. 我按照Google在这里提到的确切步骤,在Google Tag Manager中添加了Google Optimize。是的,我确实将Google Optimize容器ID更改为我的async-hide函数中的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有关?我们在React应用程序中使用静态多页而不是单页。
  2. 在React/Next.js项目中实现Google Optimize的最佳方法是什么:通过Google标签管理器还是Google Optimize。
  3. 在React/Next.js项目中,Google Optimize的最佳加载方法是什么:异步还是同步?

你是否正在使用Next.js提供的任何路由器事件?例如:router.events.on('routeChangeStart'。如果需要示例,请告诉我。 - Kal
不,我们的项目中没有使用路由器。我们只使用页面文件夹来定义我们的页面。https://nextjs.org/docs/routing/introduction 在我们的情况下,它位于src/pages中。 - Cédric Bloem
您不需要使用额外的第三方路由器 - 只需使用内置的下一个路由器即可。这些是由Next.js提供的事件。您只需要在_app.js中进行一些更改即可。您可以继续在pages文件夹中使用自动路由。Next.js可以告诉您何时将页面从pages文件夹更改为其他页面以及何时加载完成。您可以利用它来避免页面闪烁。 - Kal
我会查阅这些路由器事件的文档,并看看如何利用它来帮助自己。谢谢你的建议。 - Cédric Bloem
我可以发一个答案作为示例,但也许有人会有更好的解决方案,所以我会把它留未答。祝你好运,但如果你需要一个完整的appjs代码,请告诉我。 - Kal
1个回答

15
这是一个非常普遍的问题。Google Optimize和其他通过客户端JavaScript更改网站内容的A/B测试解决方案会产生闪烁效果,因为脚本必须下载后才能进行任何更改。
回答您的问题:
1. 由于您正在使用next.js,因此会出现一些特殊的问题。Next.js在服务器上使用渲染阶段(或静态渲染阶段)以及在客户端使用hydration阶段。当您将Google Optimize放在hydration开始之前(并且它加载时),它将呈现正确的实验,但一旦hydration启动,它将被覆盖。
2. 您应该如何正确地集成Tagmanger:在最外层组件中,例如,您可以使用useEffect() hook来抛出tagmanager事件以触发插入优化实验。
请注意!通过这种方式,您将会出现闪烁效果或减慢网站速度,因为您必须等待直到所有内容都被hydration,这可能需要在较慢的设备上花费几秒钟,然后重新渲染您的内容。
这是Jamstack页面的常见问题-可以通过直接在代码中集成实验API来解决,这肯定更加复杂。
  • 同步加载会拖慢您的网站,因为它会阻塞呈现,直到JS和内容加载完成。异步加载会使网站闪烁。这是在基于标签的A/B测试中工作时的两个选项 - 您必须选择较小的罪恶。


  • 网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接