Script 最適化
レイアウト・スクリプト
複数のルートにサードパーティのスクリプトを読み込むには、next/script
をインポートして、レイアウト・コンポーネントに直接スクリプトを含めます:
import Script from 'next/script'
export default function DashboardLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<>
<section>{children}</section>
<Script src="https://example.com/script.js" />
</>
)
}
サードパーティのスクリプトは、フォルダルート(例:dashboard/page.js
)またはネストされたルート(例:dashboard/settings/page.js
)にユーザーがアクセスしたときにフェッチされます。Next.js は、ユーザーが同じレイアウト内の複数のルート間を移動しても、スクリプトが1 回しかロードされないようにします。
アプリケーション・スクリプト
すべてのルートにサードパーティのスクリプトをロードするには、next/script
をインポートし、ルートレイアウトに直接スクリプトを含めます:
import Script from 'next/script'
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en">
<body>{children}</body>
<Script src="https://example.com/script.js" />
</html>
)
}
このスクリプトは、アプリケーション内の任意のルートへアクセスしたときにロードされ、実行されます。Next.js は、ユーザーが複数のページ間を移動しても、スクリプトが1 回しかロードされないようにします。
推奨: パフォーマンスへの不要な影響を最小限に抑えるため、特定のページやレイアウトにのみサードパーティのスクリプトを含めることをお勧めします。
ストラテジー
next/script
のデフォルトの動作では、どのページやレイアウトでもサードパーティのスクリプトを読み込むことができますが、strategy
属性を使用することで、その読み込み動作を微調整できます:
beforeInteractive
:スクリプトを、Next.js コードの前、およびページのハイドレーションが発生する前にロードするafterInteractive
: (デフォルト) スクリプトを早期に読み込みますが、ページのハイドレーションが発生した後に読み込むlazyOnload
:ブラウザのアイドル時間中にスクリプトをロードするworker
:(実験的機能)スクリプトを Web Worker で読み込む
各ストラテジーの詳細や使用例については、next/script
API リファレンス ドキュメントを参照してください。
スクリプトを Web Worker にオフロードする(実験的な機能)
注意:
worker
ストラテジーはまだ安定しておらず、app
ディレクトリではまだ動作しません。注意して使用してください。
worker
ストラテジーを使用するスクリプトはオフロードされ 、Partytownを利用して Web Worker で実行されます。メインスレッドをアプリケーションコードに割り当てることで、サイトのパフォーマンスを向上させることができます。
このストラテジーはまだ実験的なもので、next.config.js
でnextScriptWorkers
フラグが有効になっている場合のみ使用できます:
module.exports = {
experimental: {
nextScriptWorkers: true,
},
}
次にnext
を実行すると(通常はnpm run dev
かyarn dev
)、セットアップを完了するために Next.js が必要なパッケージのインストールを案内します:
npm run dev
次のような指示が表示されます:Please install Partytown by running npm install @builder.io/partytown
セットアップが完了したら、strategy="worker"
を定義することで、自動的に Partytown がアプリケーションにインスタンス化され、スクリプトが Web ワーカーにオフロードされます。
import Script from 'next/script'
export default function Home() {
return (
<>
<Script src="https://example.com/script.js" strategy="worker" />
</>
)
}
Web Worker でサードパーティのスクリプトをロードする場合、考慮すべきトレードオフがいくつかあります。詳細については、Partytown のトレードオフに関するドキュメントを参照してください。
インライン・スクリプト
インラインスクリプト、つまり外部ファイルから読み込まれないスクリプトも Script コンポーネントでサポートされています。中括弧の中に JavaScript を記述します:
<Script id="show-banner">
{`document.getElementById('banner').classList.remove('hidden')`}
</Script>