Next.jsアプリケーションを静的エクスポートする方法
Next.jsでは、静的サイトまたはシングルページアプリケーション(SPA)として開始し、後でサーバーが必要な機能を使用するようにアップグレードすることが可能です。
next build
を実行すると、Next.jsは各ルートごとにHTMLファイルを生成します。厳密なSPAを個別のHTMLファイルに分割することで、Next.jsはクライアントサイドで不要なJavaScriptコードの読み込みを避け、バンドルサイズを削減し、ページの読み込みを高速化できます。
Next.jsはこの静的エクスポートをサポートしているため、HTML/CSS/JSの静的アセットを提供できる任意のWebサーバーにデプロイしてホストできます。
設定
静的エクスポートを有効にするには、next.config.js
内のoutputモードを変更します:
next build
を実行後、Next.jsはアプリケーションのHTML/CSS/JSアセットを含むout
フォルダを作成します。
サポートされる機能
Next.jsのコアは静的エクスポートをサポートするように設計されています。
サーバーコンポーネント
next build
を実行して静的エクスポートを生成する際、app
ディレクトリ内で使用されるサーバーコンポーネントは、従来の静的サイト生成と同様にビルド中に実行されます。
結果のコンポーネントは、初期ページロード用の静的HTMLと、ルート間のクライアントナビゲーション用の静的ペイロードとしてレンダリングされます。動的サーバー機能を使用しない限り、静的エクスポートを使用する際にサーバーコンポーネントを変更する必要はありません。
クライアントコンポーネント
クライアント側でデータ取得を行いたい場合は、SWRを使用してリクエストをメモ化するクライアントコンポーネントを使用できます。
ルート遷移はクライアント側で行われるため、これは従来のSPAのように動作します。例えば、次のインデックスルートでは、クライアント側で異なる投稿にナビゲートできます:
画像最適化
next/image
による画像最適化は、next.config.js
でカスタム画像ローダーを定義することで静的エクスポートと共に使用できます。例えば、Cloudinaryのようなサービスで画像を最適化できます:
このカスタムローダーは、リモートソースから画像を取得する方法を定義します。例えば、次のローダーはCloudinaryのURLを構築します:
その後、アプリケーションでnext/image
を使用し、Cloudinary内の画像への相対パスを定義できます:
ルートハンドラ
ルートハンドラは、next build
を実行すると静的レスポンスをレンダリングします。サポートされるHTTP動詞はGET
のみです。これは、キャッシュされたデータまたは非キャッシュデータから静的HTML、JSON、TXT、またはその他のファイルを生成するために使用できます。例えば:
上記のファイルapp/data.json/route.ts
は、next build
中に静的ファイルとしてレンダリングされ、{ name: 'Lee' }
を含むdata.json
が生成されます。
受信リクエストから動的な値を読み取る必要がある場合は、静的エクスポートを使用できません。
ブラウザAPI
クライアントコンポーネントは、next build
中にHTMLにプリレンダリングされます。Web API(window
、localStorage
、navigator
など)はサーバーで利用できないため、ブラウザで実行されている場合にのみこれらのAPIに安全にアクセスする必要があります。例えば:
サポートされない機能
Node.jsサーバーを必要とする機能、またはビルドプロセス中に計算できない動的ロジックはサポートされていません:
dynamicParams: true
を指定した動的ルートgenerateStaticParams()
なしの動的ルート- Requestに依存するルートハンドラ
- Cookie
- リライト
- リダイレクト
- ヘッダー
- ミドルウェア
- 増分的静的再生成
- デフォルト
loader
を使用した画像最適化 - ドラフトモード
- サーバーアクション
- インターセプティングルート
これらの機能をnext dev
で使用しようとすると、ルートレイアウトでdynamic
オプションをerror
に設定した場合と同様のエラーが発生します。
デプロイ
静的エクスポートを使用すると、Next.jsはHTML/CSS/JS静的アセットを提供できる任意のWebサーバーにデプロイしてホストできます。
next build
を実行すると、Next.jsは静的エクスポートをout
フォルダに生成します。例えば、次のルートがある場合:
/
/blog/[id]
next build
を実行後、Next.jsは次のファイルを生成します:
/out/index.html
/out/404.html
/out/blog/post-1.html
/out/blog/post-2.html
Nginxのような静的ホストを使用している場合、受信リクエストから正しいファイルへのリライトを設定できます:
バージョン履歴
バージョン | 変更内容 |
---|---|
v14.0.0 | next export が削除され、"output": "export" に置き換えられました |
v13.4.0 | App Router(安定版)が追加され、Reactサーバーコンポーネントとルートハンドラを使用した静的エクスポートのサポートが強化されました |
v13.3.0 | next export が非推奨となり、"output": "export" に置き換えられました |