【问题标题】:Inserting script in head section of Next.js using Script component使用脚本组件在 Next.js 的头部插入脚本
【发布时间】:2022-11-29 06:11:32
【问题描述】:

我想将来自名为 Zoho 的应用程序的跟踪代码插入到我的 Next.js 应用程序每个页面的 Head 部分。我使用的是工作正常的 _document.tsx。对于倾斜脚本,Next.js 推荐使用 Next.js 脚本组件 (https://nextjs.org/docs/messages/no-script-tags-in-head-component)。我按照说明在脚本中插入了括号,但它被忽略了,没有错误消息。我可以在 _document.tsx 文件的 Head 部分输入此代码吗?以某种方式将它作为一个单独的组件分解出来会更好吗?

任何意见将是有益的

import Document, {
Html,
Head,
Main,
NextScript,
DocumentContext,
DocumentInitialProps,
} from "next/document";
import Script from "next/script";

class MyDocument extends Document {
 static async getInitialProps(
   ctx: DocumentContext
 ): Promise<DocumentInitialProps> {
  const initialProps = await Document.getInitialProps(ctx);
  return { ...initialProps };
}
render() {
  return (
    <Html lang="en">
      <Head>
        <meta charSet="utf-8" />
        <link
          href="https://fonts.googleapis.com/css?family=PT+Sans&display=optional"
          rel="stylesheet"
        />
        <meta name="msapplication-TileColor" content="#596285" />
        <meta
          name="msapplication-config"
          content="/favicon/browserconfig.xml"
        />
        <meta name="theme-color" content="#ffffff" />
        {/* for Zoho Marketing Automation */}
        
        <Script id="zoho-ma">
          {`var w = window;
          var p = w.location.protocol;
          if (p.indexOf("http") < 0) {
            p = "http" + ":";
          }
          var d = document;
          var f = d.getElementsByTagName("script")[0],
            s = d.createElement("script");
          s.type = "text/javascript";
          s.async = false;
          if (s.readyState) {
            s.onreadystatechange = function () {
              if (s.readyState == "loaded" || s.readyState == "complete") {
                s.onreadystatechange = null;
                try {
                  loadwaprops(
                    "myid#",
                    "myid#",
                    "myid#",
                    "myid#",
                    "0.0"
                  );
                } catch (e) {}
              }
            };
          } else {
            s.onload = function () {
              try {
                loadwaprops(
                  "myid#",
                  "myid#",
                  "myid#",
                  "myid#",
                  "0.0"
                );
              } catch (e) {}
            };
          }
          s.src = p + "//ma.zoho.com/hub/js/WebsiteAutomation.js";
          f.parentNode.insertBefore(s, f);`}
        </Script>
        {/* end Zoho marketing automation */}
      </Head>
      <body>
        <Main />
        <NextScript />
        <div id="notifications"></div>
      </body>
    </Html>
  );
 }
}

export default MyDocument;

【问题讨论】:

    标签: javascript html reactjs next.js


    【解决方案1】:

    我重读了早先的帖子Next 11 and adding Script tags not working. No scripts are renderedenter link description here,意识到不能将组件放在 Head 标签中。此外,它不应该在 _document.tsx 中,而应该在 _app.tsx 中。 (除非你使用 beforeInteractive 我相信,请参阅上面的链接)

    因为我还想包含一个 Google Analytics 脚本,所以我创建了一个名为 TrackingCode 的组件作为一个单独的 js 文件

    import Script from "next/script";
    
    function TrackingCode() {
      return (
       <>
      {/* Global site tag (gtag.js) - Google Analytics */}
      <Script src="https://www.googletagmanager.com/gtag/js?id=G-GOOGLEID" />
      <Script id="google-analytics" strategy="afterInteractive">
        {`
      window.dataLayer = window.dataLayer || [];
      function gtag(){window.dataLayer.push(arguments);}
      gtag('js', new Date());
    
      gtag('config', 'G-GOOGLEID');
      `}
      </Script>
    
      {/* for Zoho Marketing Automation */}
    
      <Script id="zoho-ma">
        {`var w = window;
    var p = w.location.protocol;
    if (p.indexOf("http") < 0) {
      p = "http" + ":";
    }
    var d = document;
    var f = d.getElementsByTagName("script")[0],
      s = d.createElement("script");
    s.type = "text/javascript";
    s.async = false;
    if (s.readyState) {
      s.onreadystatechange = function () {
        if (s.readyState == "loaded" || s.readyState == "complete") {
          s.onreadystatechange = null;
          try {
            loadwaprops(
              "mycode",
              "mycode",
              "mycode",
              "mycode",
              "0.0"
            );
          } catch (e) {}
        }
      };
    } else {
      s.onload = function () {
        try {
          loadwaprops(
            "mycode",
            "mycode",
            "mycode",
             "mycode",
            "0.0"
          );
        } catch (e) {}
      };
    }
    s.src = p + "//ma.zoho.com/hub/js/WebsiteAutomation.js";
    f.parentNode.insertBefore(s, f);`}
      </Script>
      {/* end Zoho marketing automation */}
    </>
     );
    }
    
    export default TrackingCode;
    

    我的 _app.tsx 文件是:

    import "../assets/scss/material-kit.scss";
    import "../node_modules/bootstrap/scss/bootstrap.scss";
    import "../styles/globals.scss";
    import { useEffect } from "react";
    import type { ReactElement, ReactNode } from "react";
    import type { NextPage } from "next";
    import type { AppProps } from "next/app";
    import TrackingCode from "../components/tracking-code";
    
    import store from "../app/store";
    
    
    export type NextPageWithLayout = NextPage & {
      getLayout?: (page: ReactElement) => ReactNode;
    };
    
    type AppPropsWithLayout = AppProps & {
      Component: NextPageWithLayout;
    };
    
    export default function MyApp({ Component, pageProps }: AppPropsWithLayout) 
    {
     const getLayout = Component.getLayout ?? ((page) => page);
      useEffect(() => {
       typeof document !== undefined
          ? require("../node_modules/bootstrap/dist/js/bootstrap")
         : null;
      }, []);
    
    return getLayout(
       <>
         <TrackingCode />
         <Component {...pageProps} />
       </>
      );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 2012-10-10
      • 2023-04-08
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多