Ste*_*eve 15 javascript google-tag-manager reactjs next.js next.js13
从这个答案和这篇文章中,我添加了一个,<Script>以便将 Google 跟踪代码管理器添加到我的 NextJS 网站:
components/layout.tsx:
 import React from "react";
 import Head from "next/head";
 import Script from 'next/script'
 <!-- skip some code -->
 <Head>
    <link rel="preconnect" href="https://cdn.sanity.io/" />
    <link rel="dns-prefetch" href="https://cdn.sanity.io//" />
  </Head>
  <Script id="google-tag-manager" strategy="afterInteractive">
    {
      (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
      new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
      j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
      'https://www.googletagmanager.com/gtm.js?id=%27+i+dl;f.parentNode.insertBefore(j,f);
      })(window,document,'script','dataLayer','GTM-xxxx');
    }
  </Script>
Run Code Online (Sandbox Code Playgroud)
但是,该脚本不存在于前端。
components/layout.tsx<Head>是我的网站上唯一带有或 的文件<head>。
Google 跟踪代码管理器<noscript>位于前端,用于app/layout.tsx:
 <body className="antialiased text-gray-800 dark:bg-black dark:text-gray-400">
    <noscript
      dangerouslySetInnerHTML={{
        __html: <iframe src="https://www.googletagmanager.com/ns.html?id=xxxx" height="0" width="0" style="display: none; visibility: hidden;" />,
      }}
    />
Run Code Online (Sandbox Code Playgroud)
所以我知道我已经保存了所有更改。
帮助表示赞赏。
更新
我是 NextJS 的新手,所有这些代码都来自 NextJS/Sanity 模板,该模板在本地和 Vercel 临时站点上运行。
我唯一的问题是在发布到我的域之前无法正确加载 Google 跟踪代码管理器。
_app.js项目中没有。
有/app/(website)/layout.tsx:
import "@/styles/tailwind.css";
import { Providers } from "./providers";
import { cx } from "@/utils/all";
import { Inter, Lora } from "next/font/google";
const inter = Inter({
  subsets: ["latin"],
  variable: "--font-inter"
});
const lora = Lora({
  subsets: ["latin"],
  variable: "--font-lora"
});
export default function RootLayout({
  children
}: {
  children: React.ReactNode;
}) {
  return (
    <html
      lang="en"
      suppressHydrationWarning
      className={cx(inter.variable, lora.variable)}>
       <body className="antialiased text-gray-800 dark:bg-black dark:text-gray-400" >
        <noscript
          dangerouslySetInnerHTML={{
            __html: `<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-xxxx" height="0" width="0" style="display: none; visibility: hidden;" />`,
          }}
        />
        <Providers>{children}</Providers>
      </body>
    </html>
  );
}
Run Code Online (Sandbox Code Playgroud)
这是/app/(website)/providers.tsx:
"use client";
import { ThemeProvider } from "next-themes";
    export function Providers({ children }) {
      return (
        <ThemeProvider attribute="class" defaultTheme="light">
          {children}
        </ThemeProvider>
      );
    }
Run Code Online (Sandbox Code Playgroud)
如果我在 VSCode 中搜索RootLayout,没有任何内容调用它,所以我对哪个是主文件有点困惑。
如果您想访问 Github 存储库,我可以提供。
小智 16
查看新的NextJs第三方组件
在观看NextJS Conf2023后,他们发布了@next/third-parties,因为人们在过去几个月遵循Google Analytics 文档后报告,它在 Lighhouse 上造成了糟糕的性能问题。
遵循NextJs文档指南后,我能够在 NextJs 14 上完全设置 Google Analytics。
1. 要为所有路由加载 Google 跟踪代码管理器,请将该组件直接包含在根布局中:
app/layout.tsx
import { GoogleTagManager } from '@next/third-parties/google'
export default function RootLayout({children}: {children: React.ReactNode}) {
    return (
        <html lang="en">
            <body>{children}</body>
            <GoogleTagManager gtmId="GTM-XYZ" />
        </html>
     )
}
Run Code Online (Sandbox Code Playgroud)
2. 要加载单个路由的 Google 跟踪代码管理器,请将该组件包含在您的页面文件中:
app/page.js
import { GoogleTagManager } from '@next/third-parties/google'
export default function Page() {
    return <GoogleTagManager gtmId="GTM-XYZ" />
}
Run Code Online (Sandbox Code Playgroud)
注意: 这是官方NextJs文档。
在位于 /pages 目录中的_document.js文件中添加以下代码。另外,如果没有任何_document.js文件,请创建它。
现在添加 Google 跟踪代码管理器的功能:
import Document, { Html, Head, Main, NextScript } from "next/document";
function MyDocument() {
  return (
    <Html>
      <Head>
        <script
          dangerouslySetInnerHTML={{
            __html: `
              (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
              new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
              j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
              'https://www.googletagmanager.com/gtm.js?id=%27+i+dl;f.parentNode.insertBefore(j,f);
              })(window,document,'script','dataLayer','GOOGLE_TAG_MANAGER_ID');
            `,
          }}
        />
      </Head>
      <body>
        <noscript
          dangerouslySetInnerHTML={{
            __html: `
              <iframe src="https://www.googletagmanager.com/ns.html?id=GTM-xxxx"
              height="0" width="0" style="display:none;visibility:hidden"></iframe>
            `,
          }}
        />
        <Main />
        <NextScript />
      </body>
    </Html>
  );
}
export default MyDocument;
Run Code Online (Sandbox Code Playgroud)
现在您可以检查该功能是否正常工作,如果不起作用请告诉我。我一定会帮忙的。
确保您实际上在_app.js文件中使用布局:
// _app.js
import '../styles/globals.css';
import Layout from './layout';
function MyApp({ Component, pageProps }) {
  return (
    <Layout>
      <Component {...pageProps} />
    </Layout>
  );
}
export default MyApp;
Run Code Online (Sandbox Code Playgroud)
在您的layout.tsx中,您可以按如下方式加载脚本:
// layout.js
import Head from 'next/head';
export default function Layout({ children }) {
  return (
    <>
      <Head>
        <link rel="preconnect" href="https://cdn.sanity.io/" />
        <link rel="dns-prefetch" href="https://cdn.sanity.io//" />
      </Head>
      <script
        id="google-tag-manager"
        dangerouslySetInnerHTML={{
          __html: `(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id=%27+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-xxxx');`,
        }}
      />
      <main>{children}</main>
    </>
  );
}
Run Code Online (Sandbox Code Playgroud)
请注意,我没有使用NextScript组件,因为文档似乎没有提及有关在该组件中使用子组件的任何内容。
另请确保您没有启用任何删除跟踪相关脚本的浏览器扩展。您可以在不同的浏览器或隐身模式下进行测试。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           15795 次  |  
        
|   最近记录:  |