Céd*_*oem 17 google-tag-manager reactjs next.js google-optimize
标题可能看起来有点含糊,但这是因为我目前在将 Google Optimize 集成到我们的 React / Next.js 项目中时遇到了多个问题。我将尝试尽可能详细地解释我的问题和行动。但是,如果有不清楚的地方,请告诉我。
<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]
Run Code Online (Sandbox Code Playgroud)
小智 11
这是您在这里遇到的一个很常见的问题。Google Optimize 和其他通过客户端上的 Javascript 更改网站内容的 A/B 测试解决方案会产生闪烁效果,因为必须先下载脚本才能更改任何内容。
回答您的问题:
当您使用 next.js 时,会出现一些特殊问题。Next.js 在服务器上使用服务器(或静态渲染阶段)以及在客户端使用水化阶段。当您在水合作用开始之前放置 Google Optimize(并加载)时,它会呈现正确的实验,但会在水合作用开始时立即被覆盖。
您如何将其与 Tagmanger 正确集成:在最外部的组件中,ex<App/>您可以使用一个useEffect()钩子来引发 tagmanager 事件来触发优化实验的插入。
!请注意!通过这种方式,您将获得闪烁效果或减慢您的网站速度,因为您必须等到一切都水合起来,这在慢速设备上可能需要几秒钟的时间,然后会重新呈现您的内容。
这是 Jamstack Pages 的一个常见问题 - 可以通过将实验 api 直接集成到代码中来解决,这肯定会更复杂。
同步加载会减慢您的站点速度,因为它会阻止渲染,直到加载 JS 和内容为止,异步加载会使站点闪烁。这是使用基于标签的 A/B 测试时的两个选项 - 您必须选择较小的邪恶。