静的エクスポート
Next.jsは静的サイトまたはSingle-Page Application (SPA)として開始し、後でサーバーを必要とする機能にオプションでアップグレードすることを可能にします。
next build
を実行すると、Next.jsは各ルートに対してHTMLファイルを生成します。厳密なSPAを個々のHTMLファイルに分解することで、Next.jsはクライアント側で不要なJavaScriptコードの読み込みを回避し、バンドルサイズを削減し、高速なページ読み込みを実現できます。
Next.jsはこの静的エクスポートをサポートしているため、HTML/CSS/JSの静的アセットを提供できる任意のウェブサーバーにデプロイおよびホスティングできます。
設定
静的エクスポートを有効にするには、next.config.js
内の出力モードを変更します:
next build
を実行すると、Next.jsはアプリケーションのHTML/CSS/JSアセットを含むout
フォルダを生成します。
サポートされている機能
Next.jsのコアは静的エクスポートをサポートするように設計されています。
サーバーコンポーネント
next build
を実行して静的エクスポートを生成する際、app
ディレクトリ内で使用されるサーバーコンポーネントは、従来の静的サイト生成と同様に、ビルド中に実行されます。
結果のコンポーネントは、最初のページ読み込み時に静的HTMLにレンダリングされ、ルート間のクライアントナビゲーション用に静的ペイロードになります。動的サーバー関数を使用しない限り、静的エクスポートを使用する際にサーバーコンポーネントに変更は必要ありません。
クライアントコンポーネント
クライアント側でデータフェッチを行う場合は、SWRを使用するクライアントコンポーネントでリクエストをメモ化できます。
ルート遷移はクライアント側で発生するため、従来のSPAのように動作します。例えば、以下のインデックスルートでは、クライアント上で異なる投稿にナビゲートできます:
画像最適化
next.config.js
でカスタム画像ローダーを定義することで、静的エクスポートで画像最適化を使用できます。例えば、Cloudinaryなどのサービスで画像を最適化できます:
このカスタムローダーは、リモートソースから画像をフェッチする方法を定義します。例えば、以下のローダーはCloudinaryのURLを構築します:
その後、アプリケーション内でnext/image
を使用し、Cloudinaryの画像への相対パスを定義できます:
ルートハンドラー
next build
実行時、ルートハンドラーは静的レスポンスをレンダリングします。サポートされるのはGET
HTTPメソッドのみです。これは、キャッシュありまたはなしのデータから静的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()
のない動的ルート- リクエストに依存するルートハンドラ
- クッキー
- リライト
- リダイレクト
- ヘッダー
- ミドルウェア
- インクリメンタル静的再生成
- デフォルトの
loader
での画像最適化 - ドラフトモード
- サーバーアクション
next dev
でこれらの機能のいずれかを使用しようとすると、ルートレイアウトでdynamic
オプションをerror
に設定するのと同様のエラーが発生します。
デプロイ
静的エクスポートでは、Next.jsはHTML/CSS/JS静的アセットを提供できる任意のウェブサーバーにデプロイおよびホスティングできます。
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" に置き換えられました |