在 Next.js 中加载外部脚本的两种解决方案似乎是:
- 使用 _document.js 和 next.config.js 的组合加载它们
_document.js
<script
type="text/javascript"
dangerouslySetInnerHTML={{ __html: process.env.jquery }}
></script>
next.config.js
const fs = require("fs")
module.exports = ({
env: {
jquery: fs.readFileSync("./public/js/jquery.js").toString(),
}
})
参考:https://stackoverflow.com/a/65349130/2167762
- 使用 React 的 useEffect 钩子加载它们,就像使用自定义 useScript 钩子一样
/pages/index.js
import { useEffect } from "react"
const useScript = (url) => {
useEffect(() => {
const script = document.createElement("script")
script.src = url
script.async = true
document.body.appendChild(script)
return () => {
document.body.removeChild(script)
}
}, [url])
}
//export default function Home({ posts }) {
export default function Home() {
useScript("js/jquery.js")
return <p>Component</p>
}
参考:https://stackoverflow.com/a/34425083/2167762
那么你应该使用哪个?
第一个看起来“很好”,但实际上有很多错误——我有时只是在开发中刷新后才能让 JavaScript 工作,而在生产中从来没有。
(这与您使用<Link> 导航时脚本未加载的问题相对应。)
后者似乎工作得更好,尽管有时当我在 dev 中刷新时,脚本似乎无序加载,可能导致运行时错误。
但是,在生产环境中,脚本似乎可以始终如一地加载和运行。我没有明确测试过<Link>,但它应该可以与useEffect() 方法一起使用。