Script Optimization
应用程序脚本
要为所有路由加载第三方脚本,请导入 next/script
并直接在自定义 _app
中包含该脚本:
当访问应用程序中的任何路由时,这个脚本都会加载并执行。即使用户在多个页面之间导航,Next.js 也会确保脚本只加载一次。
建议:我们建议只在特定页面或布局中包含第三方脚本,以尽量减少对性能的不必要影响。
策略
虽然 next/script
的默认行为允许你在任何页面或布局中加载第三方脚本,但你可以通过使用 strategy
属性来微调其加载行为:
beforeInteractive
:在任何 Next.js 代码之前以及在任何页面水合作用发生之前加载脚本。afterInteractive
:(默认) 在页面上发生一些水合作用之后,但较早地加载脚本。lazyOnload
:在浏览器空闲时间稍后加载脚本。worker
:(实验性) 在 Web Worker 中加载脚本。
请参考 next/script
API 参考文档,了解每种策略及其用例的更多信息。
将脚本卸载到 Web Worker (实验性)
警告:
worker
策略尚不稳定,目前还不能与app
目录一起使用。请谨慎使用。
使用 worker
策略的脚本会被卸载并在 Web Worker 中使用 Partytown 执行。这可以通过将主线程专用于应用程序的其余代码来提高网站的性能。
该策略仍处于实验阶段,只有在 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 的 权衡 文档以获取更多信息。
在 web worker 中加载第三方脚本时需要权衡考虑许多因素。请查看 Partytown 的权衡文档以了解更多信息。
使用自定义 Partytown 配置
虽然 worker
策略不需要任何额外配置就能工作,但 Partytown 支持使用配置对象来修改其部分设置,包括启用 debug
模式以及转发事件和触发器。
如果你想添加其他配置选项,可以在自定义 _document.js
中的 <Head />
组件内包含这些选项:
要修改 Partytown 的配置,必须满足以下条件:
- 必须使用
data-partytown-config
属性来覆盖 Next.js 使用的默认配置 - 除非你决定将 Partytown 的库文件保存在单独的目录中,否则必须在配置对象中包含
lib: "/_next/static/~partytown/"
属性和值,以让 Partytown 知道 Next.js 在哪里存储必要的静态文件。
注意:如果你使用了资源前缀并想修改 Partytown 的默认配置,你必须将其作为
lib
路径的一部分包含进来。
查看 Partytown 的配置选项以了解可以添加的其他属性的完整列表。
内联脚本
Script 组件也支持内联脚本,即不从外部文件加载的脚本。它们可以通过将 JavaScript 放在大括号内来编写:
或者使用 dangerouslySetInnerHTML
属性:
警告:内联脚本必须分配一个
id
属性,以便 Next.js 能够跟踪和优化脚本。
执行额外代码
可以使用 Script 组件的事件处理程序在某个事件发生后执行额外的代码:
onLoad
:在脚本加载完成后执行代码。onReady
:在脚本加载完成后以及每次组件挂载时执行代码。onError
:在脚本加载失败时执行代码。
这些处理程序只有在 next/script
被导入并在 客户端组件 中使用时才会起作用,其中 "use client"
被定义为代码的第一行:
请参考 next/script
API 参考以了解每个事件处理程序的更多信息并查看示例。
额外属性
有许多 DOM 属性可以分配给 <script>
元素,但 Script 组件并未使用,如 nonce
或 自定义数据属性。包含任何额外的属性将自动转发到最终优化的 <script>
元素中,该元素包含在 HTML 中。