デプロイ
おめでとうございます。本番環境にリリースする時が来ました。
Vercelでマネージドされた Next.js でデプロイするか、Node.jsサーバー、Dockerイメージ、または静的HTMLファイルで自己ホストできます。next start
を使用してデプロイする場合、すべての Next.js 機能がサポートされます。
本番ビルド
next build
を実行すると、本番用に最適化されたアプリケーションが生成されます。ページに基づいて、HTML、CSS、JavaScriptファイルが作成されます。JavaScriptは Next.js コンパイラを使用してコンパイルされ、ブラウザバンドルはミニファイされ、最高のパフォーマンスを達成し、すべての最新ブラウザをサポートします。
Next.js は、マネージドおよび自己ホストされた Next.js の両方で使用される標準的なデプロイメント出力を生成します。これにより、両方のデプロイ方法で全機能がサポートされることを保証します。次のメジャーバージョンでは、この出力を Build Output API 仕様に変換する予定です。
Vercelでマネージドされた Next.js
Vercelは、Next.jsの作成者および保守者で、Next.jsアプリケーション用の管理インフラストラクチャと開発者エクスペリエンスプラットフォームを提供します。
Vercelへのデプロイは設定不要で、グローバルでのスケーラビリティ、可用性、パフォーマンスに関する追加の拡張機能を提供します。ただし、自己ホストする場合でもすべての Next.js 機能がサポートされます。
Vercel上のNext.jsについて詳しく学ぶか、無料でテンプレートをデプロイして試してみてください。
自己ホスト
Next.jsは3つの異なる方法で自己ホストできます:
🎥 視聴: Next.jsの自己ホストについてさらに学ぶ → YouTube (45分)。
Node.jsサーバー
Next.jsは、Node.jsをサポートする任意のホスティングプロバイダーにデプロイできます。package.json
に "build"
と "start"
スクリプトがあることを確認してください:
次に、npm run build
を実行してアプリケーションをビルドします。最後に、npm run start
を実行してNode.jsサーバーを起動します。このサーバーはすべての Next.js 機能をサポートします。
Dockerイメージ
Next.jsは、Dockerコンテナをサポートする任意のホスティングプロバイダーにデプロイできます。Kubernetesなどのコンテナオーケストレーターにデプロイする場合や、任意のクラウドプロバイダーでコンテナ内で実行する場合に、このアプローチを使用できます。
- マシンにDockerをインストール
- サンプルをクローン(またはマルチ環境サンプル)
- コンテナをビルド:
docker build -t nextjs-docker .
- コンテナを実行:
docker run -p 3000:3000 nextjs-docker
Docker経由のNext.jsは、すべてのNext.js機能をサポートします。
静的HTMLエクスポート
Next.jsは、静的サイトまたはSingle-Page Application(SPA)として開始し、後でサーバーを必要とする機能を任意でアップグレードすることを可能にします。
Next.jsは静的エクスポートをサポートしているため、HTML/CSS/JS静的アセットを提供できる任意のWebサーバーにデプロイおよびホストできます。これにはAWS S3、Nginx、Apacheなどのツールが含まれます。
静的エクスポートとして実行すると、サーバーを必要とするNext.js機能はサポートされません。詳細はこちら。
補足:
- サーバーコンポーネントは静的エクスポートでサポートされます。
機能
画像最適化
next/image
による画像最適化は、next start
を使用してデプロイする場合、追加設定なしで自己ホストされます。画像を最適化するための別のサービスを使用する場合は、画像ローダーを設定できます。
画像最適化は、next.config.js
でカスタム画像ローダーを定義することで、静的エクスポートで使用できます。画像は構築時ではなく、実行時に最適化されることに注意してください。
補足:
ミドルウェア
ミドルウェアは、next start
を使用してデプロイする場合、追加設定なしで自己ホストされます。着信リクエストへのアクセスを必要とするため、静的エクスポートを使用する場合はサポートされません。
ミドルウェアは、アプリケーション内の各ルートまたはアセットの前で実行される可能性があるため、低遅延を確保するために、利用可能なすべてのNode.js APIのサブセットであるランタイムを使用します。このランタイムは「エッジで」実行する必要はなく、単一リージョンのサーバーで動作します。複数のリージョンでミドルウェアを実行するには、追加の設定とインフラストラクチャが必要です。
すべてのNode.js APIを必要とするロジック(または外部パッケージを使用する)を追加したい場合、このロジックをサーバーコンポーネントとしてレイアウトに移動できる場合があります。例えば、ヘッダーをチェックし、リダイレクトすることなどです。また、next.config.js
を通じて、ヘッダー、Cookie、クエリパラメータを使用してリダイレクトまたはリライトできます。それでも対応できない場合は、カスタムサーバーを使用できます。
環境変数
Next.jsは、ビルド時と実行時の両方の環境変数をサポートできます。
デフォルトでは、環境変数はサーバー上でのみ利用可能です。環境変数をブラウザに公開するには、NEXT_PUBLIC_
プレフィックスを付ける必要があります。ただし、これらの公開環境変数は next build
中にJavaScriptバンドルにインライン展開されます。
実行時の環境変数を読み取るには、getServerSideProps
またはアプリルーターへの段階的な移行をお勧めします。
これにより、異なる値を持つ複数の環境を通じて昇格できる単一のDockerイメージを使用できます。
補足:
register
関数を使用して、サーバー起動時にコードを実行できます。- スタンドアロン出力モードで機能しないため、runtimeConfigオプションの使用は推奨しません。代わりに、漸進的にApp Routerを採用することをお勧めします。
キャッシングとISR
Next.jsは、レスポンス、生成された静的ページ、ビルド出力、画像、フォント、スクリプトなどの静的アセットをキャッシュできます。
キャッシングとページの再検証(インクリメンタル静的再生成を使用)は、同じ共有キャッシュを使用します。デフォルトでは、このキャッシュはNext.jsサーバーのファイルシステム(ディスク)に保存されます。これは、PagesルーターとApp Routerの両方を使用する自己ホスティング時に自動的に動作します。
キャッシュされたページとデータを耐久性のあるストレージに永続化したり、Next.jsアプリケーションの複数のコンテナまたはインスタンス間でキャッシュを共有したい場合は、Next.jsのキャッシュ場所を構成できます。
自動キャッシング
- Next.jsは、完全に変更不可能なアセットに対して
Cache-Control
ヘッダーをpublic, max-age=31536000, immutable
に設定します。これは上書きできません。これらの変更不可能なファイルには、ファイル名にSHA-ハッシュが含まれているため、無期限に安全にキャッシュできます。例えば、静的画像のインポートなどです。画像のTTLを設定できます。 - インクリメンタル静的再生成(ISR)は、
Cache-Control
ヘッダーをs-maxage: <getStaticPropsの再検証>, stale-while-revalidate
に設定します。この再検証時間は、getStaticProps
関数で秒単位で定義されます。revalidate: false
に設定すると、デフォルトで1年のキャッシュ期間になります。 - 動的にレンダリングされるページは、ユーザー固有のデータがキャッシュされないように、
Cache-Control
ヘッダーをprivate, no-cache, no-store, max-age=0, must-revalidate
に設定します。これはApp RouterとPages Routerの両方に適用されます。これにはドラフトモードも含まれます。
静的アセット
静的アセットを別のドメインやCDNでホストする場合は、next.config.js
でassetPrefix
設定を使用できます。Next.jsは、JavaScriptまたはCSSファイルを取得する際にこのアセットプレフィックスを使用します。アセットを別のドメインに分離すると、DNSとTLSの解決に余分な時間がかかるというデメリットがあります。
キャッシングの設定
デフォルトでは、生成されたキャッシュアセットはメモリ(デフォルトで50MB)とディスクに保存されます。Kubernetesなどのコンテナオーケストレーションプラットフォームを使用してNext.jsをホスティングする場合、各ポッドにキャッシュのコピーがあります。デフォルトでキャッシュがポッド間で共有されないため、古いデータが表示されるのを防ぐために、Next.jsキャッシュのハンドラーを設定し、メモリ内キャッシュを無効にできます。
自己ホスティング時にISR/データキャッシュの場所を設定するには、next.config.js
ファイルにカスタムハンドラーを設定できます:
次に、プロジェクトのルートにcache-handler.js
を作成します。例:
カスタムキャッシュハンドラーを使用すると、Next.jsアプリケーションをホスティングするすべてのポッド間で一貫性を確保できます。例えば、RedisやAWS S3など、任意の場所にキャッシュされた値を保存できます。
補足:
revalidatePath
はキャッシュタグの上位にある便利なレイヤーです。revalidatePath
を呼び出すと、指定されたページの特別なデフォルトタグを使用してrevalidateTag
関数が呼び出されます。
ビルドキャッシュ
Next.jsはnext build
中にIDを生成し、どのバージョンのアプリケーションが提供されているかを識別します。同じビルドを使用して複数のコンテナを起動する必要があります。
環境の各ステージで再ビルドする場合、コンテナ間で使用する一貫したビルドIDを生成する必要があります。next.config.js
のgenerateBuildId
コマンドを使用します:
バージョンスキュー
Next.jsは、バージョンスキューのほとんどのインスタンスを自動的に軽減し、検出された際に新しいアセットを取得するためにアプリケーションを自動的に再読み込みします。例えば、deploymentId
に不一致がある場合、ページ間の遷移はプリフェッチされた値ではなく、ハードナビゲーションを実行します。
アプリケーションが再読み込みされると、ページ遷移間で状態を保持するように設計されていない場合、アプリケーションの状態が失われる可能性があります。例えば、URLの状態またはローカルストレージを使用すると、ページリフレッシュ後も状態が保持されます。ただし、useState
のようなコンポーネントの状態は、そのような遷移で失われます。
Vercelは、新しいバージョンがデプロイされた後も、古いクライアントに対して前のバージョンのアセットと関数を引き続き利用できるように、Next.jsアプリケーションに追加のスキュー保護を提供します。
next.config.js
ファイルでdeploymentId
プロパティを手動で設定して、各リクエストが?dpl
クエリ文字列またはx-deployment-id
ヘッダーを使用するようにできます。
手動のグレースフル シャットダウン
セルフホスティング時に、サーバーがSIGTERM
またはSIGINT
シグナルでシャットダウンする際に実行するコードがある場合があります。
環境変数NEXT_MANUAL_SIG_HANDLE
をtrue
に設定し、_document.js
ファイル内でそのシグナルのハンドラーを登録できます。環境変数は.env
ファイルではなく、直接package.json
スクリプトに登録する必要があります。
補足: 手動シグナルハンドリングは
next dev
では利用できません。