我们正在使用nextJs应用程序。我们需要对所有现有的脚本标签应用async。我试了很多次。任何一次都可以帮我。
<script src="/_next/static/chunks/webpack.js?ts=1634913314210"></script>
<script src="/_next/static/chunks/main.js?ts=1634913314210"></script>
<script src="/_next/static/chunks/pages/_app.js?ts=1634913314210"></script>
修改后
<script src="/_next/static/chunks/webpack.js?ts=1634913314210" async></script>
<script src="/_next/static/chunks/main.js?ts=1634913314210" async></script>
<script src="/_next/static/chunks/pages/_app.js?ts=1634913314210" async></script>
如果您正在运行NextJS v10.2.1或更新版本,你可以告诉NextJS用defer
而不是async
来渲染这些资源,通过在你的next.config.js
中设置以下标志:
module.exports = {
experimental: { disableOptimizedLoading: true },
}
注意,这只会禁用生产构建的async
标记,而不是开发构建。此外,它还改变了一些与脚本加载相关的其他机制。
要了解更多细节,请查看_document的实现。tsx getScripts,它将此方法公开为NextScript
组件。如果您希望对这些脚本标签有更细粒度的控制,您可以通过实现您自己的NextScript
版本来提供您自己的getScripts
方法的实现。
下面是我从NextJS GitHub项目中提取的相关问题的示例。你可能还想读一下这个线程,以便更好地理解async
在这种情况下是如何工作的。
class DeferredNextScript extends NextScript {
getScripts() {
return super.getScripts().map(script => {
return React.cloneElement(script, {
key: script.props.src,
defer: true,
async: false,
})
})
}
getDynamicChunks() {
return super.getDynamicChunks().map(script => {
return React.cloneElement(script, {
key: script.props.src,
defer: true,
async: false,
})
})
}
}