如何加载和优化脚本
布局脚本
要为多个路由加载第三方脚本,请导入 next/script
并将脚本直接包含在您的布局组件中:
当用户访问文件夹路由(例如 dashboard/page.js
)或任何嵌套路由(例如 dashboard/settings/page.js
)时,第三方脚本将被获取。Next.js 会确保脚本仅加载一次,即使用户在同一布局中的多个路由之间导航。
应用脚本
要为所有路由加载第三方脚本,请导入 next/script
并将脚本直接包含在您的根布局中:
当访问应用程序中的任何路由时,此脚本将被加载并执行。Next.js 会确保脚本仅加载一次,即使用户在多个页面之间导航。
推荐:我们建议仅在特定页面或布局中包含第三方脚本,以尽量减少对性能的不必要影响。
加载策略
尽管 next/script
的默认行为允许您在任何页面或布局中加载第三方脚本,但您可以使用 strategy
属性微调其加载行为:
beforeInteractive
:在 Next.js 代码和页面水合之前加载脚本。afterInteractive
:(默认)在页面部分水合后尽早加载脚本。lazyOnload
:在浏览器空闲时间较晚加载脚本。worker
:(实验性)在 Web Worker 中加载脚本。
参考 next/script
API 参考文档,了解更多关于每种策略及其用例的信息。
将脚本卸载到 Web Worker(实验性)
警告:
worker
策略尚未稳定,且尚不适用于应用路由。请谨慎使用。
使用 worker
策略的脚本会被卸载并通过 Partytown 在 Web Worker 中执行。这可以通过将主线程专用于应用程序的其余代码来提高网站性能。
此策略仍处于实验阶段,只有在 next.config.js
中启用了 nextScriptWorkers
标志时才能使用:
然后运行 next
(通常是 npm run dev
或 yarn dev
),Next.js 将指导您完成安装所需软件包以完成设置:
您将看到类似以下的说明:请通过运行 npm install @builder.io/partytown
安装 Partytown。
设置完成后,定义 strategy="worker"
将自动在您的应用程序中实例化 Partytown,并将脚本卸载到 Web Worker。
在 Web Worker 中加载第三方脚本时需要考虑许多权衡。请参阅 Partytown 的 权衡 文档以了解更多信息。
内联脚本
内联脚本,或不是从外部文件加载的脚本,也受 Script 组件支持。可以通过将 JavaScript 放在花括号中来编写:
或者使用 dangerouslySetInnerHTML
属性:
警告:必须为内联脚本分配
id
属性,以便 Next.js 跟踪和优化脚本。
执行额外代码
事件处理程序可以与 Script 组件一起使用,以在特定事件发生后执行额外代码:
onLoad
:脚本加载完成后执行代码。onReady
:脚本加载完成后以及每次组件挂载时执行代码。onError
:脚本加载失败时执行代码。
这些处理程序仅在 next/script
被导入并用于 客户端组件 中时有效,其中 "use client"
被定义为代码的第一行:
参考 next/script
API 参考,了解更多关于每个事件处理程序的信息并查看示例。
附加属性
有许多 DOM 属性可以分配给 <script>
元素,但 Script 组件未使用,例如 nonce
或 自定义数据属性。包含任何附加属性将自动将其转发到最终优化的 <script>
元素,该元素包含在 HTML 中。