<Script>
此 API 参考将帮助您了解如何使用<a href="#props">属性</a>,这些属性可用于 Script 组件。有关功能和用法,请参阅<a href="/docs/app/building-your-application/optimizing/scripts">优化脚本</a>页面。
import Script from 'next/script'
export default function Dashboard() {
return (
<>
<Script src="https://example.com/script.js" />
</>
)
}
属性
以下是 Script 组件可用的属性摘要
属性 | 示例 | 类型 | 必需 |
---|---|---|---|
src | src="http://example.com/script" | 字符串 | 除非使用内联脚本,否则为必需 |
strategy | strategy="lazyOnload" | 字符串 | - |
onLoad | onLoad={onLoadFunc} | 函数 | - |
onReady | onReady={onReadyFunc} | 函数 | - |
onError | onError={onErrorFunc} | 函数 | - |
必需属性
<Script /> 组件需要以下属性。
src
指定外部脚本 URL 的路径字符串。这可以是绝对外部 URL 或内部路径。除非使用内联脚本,否则 src
属性是必需的。
可选属性
<Script /> 组件除了必需的属性之外,还可以接受许多其他属性。
strategy
脚本的加载策略。可以使用四种不同的策略
beforeInteractive
:在任何 Next.js 代码和任何页面水合发生之前加载。afterInteractive
:(**默认**)尽早加载,但在页面发生一些水合后加载。lazyOnload
:在浏览器空闲时间加载。worker
:(实验性)在 Web Worker 中加载。
beforeInteractive
使用 beforeInteractive
策略加载的脚本会从服务器注入到初始 HTML 中,在任何 Next.js 模块之前下载,并在发生任何水合之前按其放置的顺序执行。
使用此策略表示的脚本会在任何第一方代码之前预加载和获取,但其执行不会阻止页面水合的发生。
beforeInteractive
脚本必须放置在根布局 (app/layout.tsx
) 内,并且旨在加载整个站点所需的脚本(即,当应用程序中的任何页面已在服务器端加载时,该脚本将加载)。
此策略仅应用于在页面任何部分变得可交互之前需要获取的关键脚本。
import Script from 'next/script'
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>
{children}
<Script
src="https://example.com/script.js"
strategy="beforeInteractive"
/>
</body>
</html>
)
}
了解一下:带有
beforeInteractive
的脚本将始终注入到 HTML 文档的head
中,无论它在组件中的位置如何。
以下是一些应该使用beforeInteractive
尽快加载的脚本示例:
- 机器人检测器
- Cookie 同意管理器
afterInteractive
使用afterInteractive
策略的脚本将注入到 HTML 客户端,并在页面上发生某些(或所有)水合后加载。这是 Script 组件的默认策略,应用于任何需要尽快加载但不要在任何第一方 Next.js 代码之前加载的脚本。
afterInteractive
脚本可以放置在任何页面或布局中,并且仅在浏览器中打开该页面(或页面组)时加载和执行。
import Script from 'next/script'
export default function Page() {
return (
<>
<Script src="https://example.com/script.js" strategy="afterInteractive" />
</>
)
}
以下是一些适合使用afterInteractive
的脚本示例:
- 标签管理器
- 分析
lazyOnload
使用lazyOnload
策略的脚本在浏览器空闲时间注入到 HTML 客户端,并在页面上所有资源都已获取后加载。此策略应用于任何不需要尽早加载的后台或低优先级脚本。
lazyOnload
脚本可以放置在任何页面或布局中,并且仅在浏览器中打开该页面(或页面组)时加载和执行。
import Script from 'next/script'
export default function Page() {
return (
<>
<Script src="https://example.com/script.js" strategy="lazyOnload" />
</>
)
}
以下是一些不需要立即加载并可以使用lazyOnload
获取的脚本示例:
- 聊天支持插件
- 社交媒体小部件
worker
警告:
worker
策略尚不稳定,并且尚不适用于app
目录。谨慎使用。
使用worker
策略的脚本被卸载到 Web Worker 中,以释放主线程并确保仅在主线程上处理关键的第一方资源。虽然此策略可用于任何脚本,但它是一个高级用例,不能保证支持所有第三方脚本。
要使用worker
作为策略,必须在next.config.js
中启用nextScriptWorkers
标志。
module.exports = {
experimental: {
nextScriptWorkers: true,
},
}
worker
脚本**目前只能在pages/
目录中使用**
import Script from 'next/script'
export default function Home() {
return (
<>
<Script src="https://example.com/script.js" strategy="worker" />
</>
)
}
onLoad
警告:
onLoad
暂不支持服务器组件,只能在客户端组件中使用。此外,onLoad
不能与beforeInteractive
一起使用 - 请考虑使用onReady
。
某些第三方脚本要求用户在脚本加载完成后运行 JavaScript 代码以实例化内容或调用函数。如果使用 afterInteractive 或 lazyOnload 作为加载策略加载脚本,则可以使用 onLoad 属性在脚本加载后执行代码。
以下是如何在库加载后仅执行 lodash 方法的示例。
'use client'
import Script from 'next/script'
export default function Page() {
return (
<>
<Script
src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js"
onLoad={() => {
console.log(_.sample([1, 2, 3, 4]))
}}
/>
</>
)
}
onReady
警告:
onReady
暂不支持服务器组件,只能在客户端组件中使用。
某些第三方脚本要求用户在脚本加载完成后以及每次组件挂载时(例如,在路由导航之后)运行 JavaScript 代码。可以使用 onReady 属性在脚本首次加载时的加载事件之后以及每个后续组件重新挂载后执行代码。
以下是如何在每次组件挂载时重新实例化 Google Maps JS 嵌入的示例
'use client'
import { useRef } from 'react'
import Script from 'next/script'
export default function Page() {
const mapRef = useRef()
return (
<>
<div ref={mapRef}></div>
<Script
id="google-maps"
src="https://maps.googleapis.com/maps/api/js"
onReady={() => {
new google.maps.Map(mapRef.current, {
center: { lat: -34.397, lng: 150.644 },
zoom: 8,
})
}}
/>
</>
)
}
onError
警告:
onError
暂不支持服务器组件,只能在客户端组件中使用。onError
不能与beforeInteractive
加载策略一起使用。
有时捕获脚本加载失败的情况会很有帮助。可以使用 onError 属性处理这些错误
'use client'
import Script from 'next/script'
export default function Page() {
return (
<>
<Script
src="https://example.com/script.js"
onError={(e: Error) => {
console.error('Script failed to load', e)
}}
/>
</>
)
}
版本历史
版本 | 更改 |
---|---|
v13.0.0 | beforeInteractive 和 afterInteractive 已修改为支持app 。 |
v12.2.4 | 添加了onReady 属性。 |
v12.2.2 | 允许在_document 中使用带有beforeInteractive 的next/script 。 |
v11.0.0 | 引入next/script 。 |
这对您有帮助吗?