如何将 Google 跟踪代码管理器添加到 NextJS 网站

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文档。

  • @DanielAviv 我还遇到了导入错误 - 这里还有另一个带有附加信息的未决问题(在撰写本文时尚未解决):https://github.com/vercel/next.js/issues/58697 (2认同)

Jag*_*oop 7

在位于 /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)

现在您可以检查该功能是否正常工作,如果不起作用请告诉我。我一定会帮忙的。


bor*_*kur 2

确保您实际上在_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组件,因为文档似乎没有提及有关在该组件中使用子组件的任何内容。

这是 Stackblitz 上的完整工作示例。

另请确保您没有启用任何删除跟踪相关脚本的浏览器扩展。您可以在不同的浏览器或隐身模式下进行测试。