使用 Angular universal 加载 Google Analytics 代码的正确方法是什么?

What is the proper way to load the Google Analytics tag with Angular universal?

我正在为我的 Angular 应用程序设置服务器端渲染。我按照 article 中的步骤和 运行 命令启动应用程序。我收到由 windowdocument 等浏览器特定对象引起的 document is not defined。我发现错误是由于 index.html 中的 Google Analytics 站点标记引起的。评论分析代码有应用 运行 确认它是问题的根源。

 <script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXX"></script>
  <script>
    window.dataLayer = window.dataLayer || [];

    function gtag() {
      dataLayer.push(arguments);
    }
    gtag('js', new Date());

    gtag('config', 'UA-XXXX');

  </script>
  <!--Google global site tag-->

我发现解决这个问题的方法之一是将代码包装在 isPlatformBrowser if 块周围。如何在 for index.html 中实现?什么是合适的解决方案?

注意:这不是特定于分析标签,我还有其他标签,例如导致问题的聊天小部件标签

您可以从 index.html 中删除脚本,而是在您的应用程序加载时注入它们,例如来自您的 AppComponent,并且仅当它加载客户端时

constructor(private renderer: Renderer2, @Inject(DOCUMENT) private _document: any,  @Inject(PLATFORM_ID) private platformId: Object)
{
    if(isPlatformBrowser(this.platformId)) //Client side execution
    {
        this.injectScripts();
    }   
}

injectScripts()
{
    
    const gtmScriptTag = this.renderer.createElement('script');
    gtmScriptTag.type = 'text/javascript';
    gtmScriptTag.src = 'https://www.googletagmanager.com/gtag/js?id=UA-XXXX';
    this.renderer.appendChild(this._document.body, gtmScriptTag);
    
    
    const gtagInitScript = this.renderer.createElement('script');
    gtagInitScript.type = 'text/javascript';
    gtagInitScript.text = `
    window.dataLayer = window.dataLayer || [];

    function gtag() {
      dataLayer.push(arguments);
    }
    gtag('js', new Date());

    gtag('config', 'UA-XXXX');
    `;
    this.renderer.appendChild(this._document.body, gtagInitScript);
}