首頁  >  問答  >  主體

使用Script組件在Next.js中向頭部插入腳本

<p>我想在我的Next.js應用程式的每個頁面的Head部分中插入來自名為Zoho的應用程式的追蹤程式碼。我使用的是一個名為_document.tsx的文件,它正常工作。對於一個傾斜的腳本,Next.js建議使用Next.js Script元件(https://nextjs.org/docs/messages/no-script-tags-in-head-component)。我按照說明將腳本插入到括號中,但它被忽略了,沒有錯誤訊息。我可以在_document.tsx檔的Head部分輸入這段程式碼嗎?是否最好將其拆分為一個單獨的組件?</p> <p>任何建議都會有所幫助</p> <pre class="brush:php;toolbar:false;">導入文檔,{ 網頁, 頭, 主要的, 下一個腳本, 文檔上下文, 文檔初始道具, } 來自「下一個/文檔」; 從“next/script”導入腳本; 類別 MyDocument 擴充文檔 { 靜態異步 getInitialProps( ctx:文檔上下文 ): Promise; { const initialProps = 等待 Document.getInitialProps(ctx); 回傳 { ...initialProps }; } 使成為() { 返回 ( <頭> > <連結 href=“https://fonts.googleapis.com/css?family=PT Sans&display=可選” rel="樣式表" >> <元名稱=“msapplication-TileColor”內容=“#596285” >> <元 name=“msapplication-config”; 內容=“/favicon/browserconfig.xml” >> <元名稱=“主題顏色”內容=“#ffffff” >> {/* 對於 Zoho Marketing Automation */} <腳本 id=“zoho-ma”> {`var w = 視窗; var p = w.location.protocol; if (p.indexOf(“http”) < 0) { p =“http”; 「:」; } var d = 文檔; var f = d.getElementsByTagName(“腳本”)[0], s = d.createElement(“腳本”); s.type = “文字/javascript”; s.async = false; 如果(s.readyState){ s.onreadystatechange = 函數 () { if (s.readyState == "已載入" || s.readyState == "完成") { s.onreadystatechange = null; 嘗試 { 載入waprops( “我的 ID#”, “我的 ID#”, “我的 ID#”, “我的 ID#”, “0.0” ); } 捕捉 (e) {} } }; } 別的 { s.onload = 函數 () { 嘗試 { 載入waprops( “我的 ID#”, “我的 ID#”, “我的 ID#”, “我的 ID#”, “0.0” ); } 捕捉 (e) {} }; }s.src = p“//ma.zoho.com/hub/js/WebsiteAutomation.js”; f.parentNode.insertBefore(s, f);`} </腳本> {/* 結束 Zoho 行銷自動化 */} </頭> <正文> <主要>> >
</正文> </Html> ); } } 導出預設MyDocument;</pre>
P粉458913655P粉458913655442 天前503

全部回覆(1)我來回復

  • P粉818125805

    P粉8181258052023-08-26 00:03:41

    我重新閱讀了之前的帖子Next 11 and adding Script tags not working. No scripts are rendered enter link description here,意識到你不能把< Script>元件放在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} />
       </>
      );
    }

    回覆
    0
  • 取消回覆