首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何卸载next.js中页面更改上的next/script?

如何卸载next.js中页面更改上的next/script?
EN

Stack Overflow用户
提问于 2022-01-18 15:48:46
回答 2查看 2.2K关注 0票数 7

我只想在某些页面上加载脚本。Next.js建议对其使用下一个/脚本标记。但是,当我导航到一些不同的页面时,我仍然可以看到body末尾的脚本。

代码语言:javascript
复制
import Script from "next/script";

const Comments = () => {
  return (
    <div className="giscus mt-16">
      <Script
        src="https://giscus.app/client.js"
        data-repo="GorvGoyl/Personal-Site-Gourav.io"
        data-repo-id="MDEwOlJlcG9zaXRvcnkyOTAyNjQ4MTU="
        data-category="Announcements"
        data-category-id="DIC_kwDOEU0W784CAvcn"
        data-mapping="pathname"
        data-reactions-enabled="0"
        data-emit-metadata="0"
        data-theme="light"
        data-lang="en"
        crossOrigin="anonymous"
        strategy="lazyOnload"
        onError={(e) => {
          console.error("giscus script failed to load", e);
        }}
      ></Script>
    </div>
  );
};

我怀疑Next.js没有清理路由更改操作中的脚本。如何确保在页面更改时删除脚本?

EN

回答 2

Stack Overflow用户

发布于 2022-03-09 14:35:37

我也面临着同样的问题。唯一适用于我的解决方案是重新加载页面作为routeChangeStart。我也是在一个定制的钩子中制作的,这样就可以轻松地重用了。

定制钩

代码语言:javascript
复制
import { useRouter } from "next/router";
import { useEffect } from "react";

export default function useScript(url) {
    const router = useRouter();
    useEffect(() => {
        const script = document.createElement("script");
        script.src = url;
        script.async = true;
        document.body.appendChild(script);

        // Needed for cleaning residue left by the external script that can only be removed by reloading the page
        const onRouterChange = () => {
            router.reload();
        };
        router.events.on("routeChangeStart", onRouterChange);

        return () => {
            router.events.off("routeChangeStart", onRouterChange);

            document.body.removeChild(script);
        };
    }, [router]);
}

用法:

代码语言:javascript
复制
import useScript from "../utils/useScript"

export default function index(){
    useScript("<script-ulr>");
}
票数 2
EN

Stack Overflow用户

发布于 2022-09-15 09:15:34

您可以为每次渲染提供唯一的url。例如

代码语言:javascript
复制
<Script key={i} className='script-tag-js' src={`/path/to/script?v=${Math.random() * 999}`} type='module' />`

你也可以用这个钩子。

代码语言:javascript
复制
import React, { ReactNode, useState, useEffect } from "react"
import { useRouter } from "next/router"
import Script from "next/script"

const useScript = (paths: string[]) => {
 const [scriptTag, setScriptTag] = useState<ReactNode>(<></>)
    const router = useRouter()


    useEffect(() => {
        if (!router.isReady) return

        router.events.on("routeChangeStart", () => {
            setScriptTag(<></>)
        })

        setScriptTag(<>
            {paths.map((x, i) => {
                return <Script key={i} className='script-tag-js' src={`${x}?v=${Math.random() * 999}`} type='module' />
            })}
        </>)


        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, [router.asPath, router.isReady])

    return { scriptTag }

}

export default useScript
代码语言:javascript
复制
const Container: FC<ContainerProps> = ({ children, headerType, scripts = [] }) => {

    const { scriptTag } = useScript(['/assets/scripts/helpers/header.js', '/assets/scripts/helpers/modal.js', ...scripts])

    return <>
        <Header type={headerType} />
        {children}
        {scriptTag}
        <Footer />
    </>
}

export default Container
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70758485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档