デプロイ
おめでとうございます!Next.jsアプリケーションをデプロイする準備が整いましたね。このページではNext.js Build APIを使用して、マネージドまたはセルフホスティングでデプロイする方法を紹介します。
Next.js Build API
next build
は本番環境向けに最適化されたアプリケーションを生成します。この標準出力には以下が含まれます:
getStaticProps
または自動静的最適化を使用するページのHTMLファイル- グローバルスタイルまたは個別にスコープされたスタイルのCSSファイル
- Next.jsサーバーから動的コンテンツをプリレンダリングするJavaScript
- Reactを通じてクライアントサイドでインタラクティブ性を実現するJavaScript
この出力は.next
フォルダ内に生成されます:
.next/static/chunks/pages
- このフォルダ内の各JavaScriptファイルは同じ名前のルートに関連します。例えば、.next/static/chunks/pages/about.js
はアプリケーションで/about
ルートを表示する際に読み込まれるJavaScriptファイルです.next/static/media
-next/image
から静的にインポートされた画像がハッシュ化されてここにコピーされます.next/static/css
- アプリケーション内の全ページに対するグローバルCSSファイル.next/server/pages
- サーバーからプリレンダリングされたHTMLとJavaScriptのエントリポイント。出力ファイルトレーシングが有効な場合、.nft.json
ファイルが作成され、特定のページに依存する全てのファイルパスが含まれます.next/server/chunks
- アプリケーション全体で複数の場所で使用される共有JavaScriptチャンク.next/cache
- ビルドキャッシュとNext.jsサーバーからのキャッシュされた画像、レスポンス、ページの出力。キャッシュを使用するとビルド時間を短縮し、画像の読み込みパフォーマンスを向上させます
.next
内の全てのJavaScriptコードはコンパイルされ、ブラウザバンドルは最適なパフォーマンスを達成し全てのモダンブラウザをサポートするためにミニファイされています。
VercelによるマネージドNext.js
Vercelは設定不要でNext.jsアプリケーションを最速でデプロイする方法です。
Vercelにデプロイすると、プラットフォームが自動的にNext.jsを検出し、next build
を実行し、以下のようなビルド出力を最適化します:
- 変更されていないアセットをデプロイ間で永続化
- コミットごとに一意のURLを持つ不変デプロイ
- 可能であればページが自動的に静的に最適化
- アセット(JavaScript、CSS、画像、フォント)が圧縮されグローバルエッジネットワークから配信
- APIルートが無限にスケール可能な分離されたサーバーレス関数として自動最適化
- ミドルウェアがコールドスタートなしで即時起動するエッジ関数として自動最適化
さらに、Vercelは以下の機能を提供します:
- Next.js Speed Insightsによる自動パフォーマンス監視
- 自動HTTPSとSSL証明書
- (GitHub、GitLab、Bitbucketなどを通じた)自動CI/CD
- 環境変数のサポート
- カスタムドメインのサポート
next/image
による画像最適化のサポートgit push
による即時グローバルデプロイ
Next.jsアプリケーションをVercelに無料でデプロイして試してみてください。
セルフホスティング
Node.jsまたはDockerを使用して、全ての機能をサポートしたNext.jsをセルフホスティングできます。いくつかの制限がある静的HTMLエクスポートも可能です。
Node.jsサーバー
Next.jsはNode.jsをサポートする任意のホスティングプロバイダーにデプロイできます。例えばAWS EC2やDigitalOcean Dropletなどです。
まず、package.json
に"build"
と"start"
スクリプトがあることを確認してください:
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
}
}
次に、npm run build
を実行してアプリケーションをビルドします。最後に、npm run start
を実行してNode.jsサーバーを起動します。このサーバーはNext.jsの全ての機能をサポートします。
next/image
を使用している場合、本番環境でより高性能な画像最適化のために、プロジェクトディレクトリでnpm install sharp
を実行してsharp
を追加することを検討してください。Linuxプラットフォームでは、sharp
が追加設定を必要とする場合があり、過剰なメモリ使用を防ぎます。
Dockerイメージ
Next.jsはDockerコンテナをサポートする任意のホスティングプロバイダーにデプロイできます。KubernetesやHashiCorp Nomadなどのコンテナオーケストレータにデプロイする場合や、任意のクラウドプロバイダーの単一ノード内で実行する場合にこのアプローチを使用できます。
- マシンにDockerをインストール
- with-dockerの例をクローン
- コンテナをビルド:
docker build -t nextjs-docker .
- コンテナを実行:
docker run -p 3000:3000 nextjs-docker
複数の環境で異なる環境変数を使用する必要がある場合は、with-docker-multi-envの例を確認してください。
静的HTMLエクスポート
Next.jsアプリの静的HTMLエクスポートを行いたい場合は、静的HTMLエクスポートドキュメントの手順に従ってください。
その他のサービス
以下のサービスはNext.js v12+
をサポートしています。各サービスにNext.jsをデプロイするための例やガイドを紹介します。
マネージドサーバー
豆知識: 上記の例で示したように、Dockerfileを使用できるマネージドプラットフォームもあります。
静的のみ
以下のサービスはoutput: 'export'
を使用したNext.jsのデプロイのみサポートしています。
また、output: 'export'
からの出力を、GitHub Actions、Jenkins、AWS CodeBuild、Circle CI、Azure PipelinesなどのCI/CDパイプラインを通じて、任意の静的ホスティングプロバイダーに手動でデプロイすることもできます。
サーバーレス
豆知識: 全てのサーバーレスプロバイダーが
next start
からのNext.js Build APIを実装しているわけではありません。サポートされている機能についてはプロバイダーに確認してください。
自動更新
Next.jsアプリケーションをデプロイする際、リロードせずに最新バージョンを確認したいでしょう。
Next.jsはルーティング時にバックグラウンドでアプリケーションの最新バージョンを自動的に読み込みます。クライアントサイドナビゲーションの場合、next/link
は一時的に通常の<a>
タグとして機能します。
豆知識: 新しいページ(古いバージョン)がすでに
next/link
によってプリフェッチされている場合、Next.jsは古いバージョンを使用します。プリフェッチされていない(かつCDNレベルでキャッシュされていない)ページにナビゲートすると、最新バージョンが読み込まれます。
手動のグレースフルシャットダウン
セルフホスティング時、SIGTERM
またはSIGINT
シグナルでサーバーがシャットダウンする際にコードを実行したい場合があります。
環境変数NEXT_MANUAL_SIG_HANDLE
をtrue
に設定し、_document.js
ファイル内でそのシグナルのハンドラを登録できます。この環境変数は.env
ファイルではなく、package.json
スクリプトに直接登録する必要があります。
豆知識: 手動シグナルハンドリングは
next dev
では利用できません。
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "NEXT_MANUAL_SIG_HANDLE=true next start"
}
}
if (process.env.NEXT_MANUAL_SIG_HANDLE) {
// これはカスタム_documentに追加する必要があります
process.on('SIGTERM', () => {
console.log('Received SIGTERM: ', 'cleaning up')
process.exit(0)
})
process.on('SIGINT', () => {
console.log('Received SIGINT: ', 'cleaning up')
process.exit(0)
})
}