Script
このAPIリファレンスは、Scriptコンポーネントで利用可能なpropsの使用方法を理解するのに役立ちます。機能と使用方法については、スクリプトの最適化ページを参照してください。
import Script from 'next/script'
export default function Dashboard() {
return (
<>
<Script src="https://example.com/script.js" />
</>
)
}
Props
Scriptコンポーネントで利用可能なpropsの概要です
Prop | 例 | 型 | 必須 |
---|---|---|---|
src | src="http://example.com/script" | 文字列 | インラインスクリプトが使用されない限り必須 |
strategy | strategy="lazyOnload" | 文字列 | - |
onLoad | onLoad={onLoadFunc} | 関数 | - |
onReady | onReady={onReadyFunc} | 関数 | - |
onError | onError={onErrorFunc} | 関数 | - |
必須Props
<Script />
コンポーネントには、以下のプロパティが必要です。
src
外部スクリプトのURLを指定するパス文字列です。絶対外部URLまたは内部パスのいずれかです。インラインスクリプトが使用されない限り、src
プロパティは必須です。
オプションProps
<Script />
コンポーネントは、必須プロパティ以外にも多くの追加プロパティを受け入れます。
strategy
スクリプトの読み込み戦略です。以下の4つの異なる戦略を使用できます
beforeInteractive
: Next.jsのコードやページのハイドレーションが発生する前に読み込みます。afterInteractive
: (デフォルト) ページのハイドレーションが一部完了した後に早期に読み込みます。lazyOnload
: ブラウザのアイドル時に読み込みます。worker
: (実験的) Web Workerで読み込みます。
beforeInteractive
beforeInteractive
戦略で読み込まれるスクリプトは、サーバーから初期HTMLに挿入され、Next.jsのモジュールが読み込まれる前にダウンロードされ、配置された順序で実行されます。
この戦略で指定されたスクリプトは、ファーストパーティコードよりも前にプリロードされ、フェッチされますが、その実行はページのハイドレーションの発生をブロックしません。
beforeInteractive
スクリプトはDocument
コンポーネント (pages/_document.js
) 内に配置する必要があり、サイト全体で必要なスクリプトを読み込むように設計されています(つまり、アプリケーションのいずれかのページがサーバーサイドで読み込まれるとスクリプトが読み込まれます)。
この戦略は、できるだけ早くフェッチする必要があるクリティカルなスクリプトにのみ使用すべきです。
import { Html, Head, Main, NextScript } from 'next/document'
import Script from 'next/script'
export default function Document() {
return (
<Html>
<Head />
<body>
<Main />
<NextScript />
<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 Routerではまだ動作しません。注意して使用してください。
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マップJSの埋め込みを再インスタンス化する方法の例です。
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
プロパティで処理できます。
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 propが追加されました。 |
v12.2.2 | beforeInteractive を持つnext/script を_document に配置できるようになりました。 |
v11.0.0 | next/script が導入されました。 |
この情報は役に立ちましたか?