Edge と Node.js ランタイム
Next.js におけるランタイムとは、コードの実行中に利用可能なライブラリ、API、および一般的な機能のセットを指します。
サーバーサイドでは、アプリケーションコードの一部をレンダリングできる2つのランタイムがあります:
- Node.js ランタイム(デフォルト)は、すべての Node.js API と互換性のあるエコシステムパッケージにアクセスできます。
- Edge ランタイムは Web API に基づいています。
ランタイムの違い
ランタイムを選択する際には多くの考慮事項があります。この表では主要な違いを一目で確認できます。より詳細な分析が必要な場合は、以下のセクションを参照してください。
Node | Serverless | Edge | |
---|---|---|---|
コールドブート | / | ~250ms | 即時 |
HTTP ストリーミング | 可能 | 可能 | 可能 |
IO | すべて | すべて | fetch のみ |
スケーラビリティ | / | 高い | 最高 |
セキュリティ | 標準 | 高い | 高い |
レイテンシ | 標準 | 低い | 最低 |
npm パッケージ | すべて | すべて | 限定的なサブセット |
静的レンダリング | 可能 | 可能 | 不可 |
動的レンダリング | 可能 | 可能 | 可能 |
データ再検証 (fetch 使用) | 可能 | 可能 | 可能 |
Edge ランタイム
Next.js の軽量な Edge ランタイムは、利用可能な Node.js API のサブセットです。
Edge ランタイムは、低レイテンシで動的かつパーソナライズされたコンテンツを配信する必要がある場合や、小さくシンプルな関数を使用する場合に最適です。Edge ランタイムの速度はリソース使用量の最小化に由来しますが、多くのシナリオでは制限となる可能性があります。
例えば、Vercel 上の Edge ランタイムで実行されるコードは 1 MB から 4 MB を超えることはできません。この制限にはインポートされたパッケージ、フォント、ファイルが含まれ、デプロイインフラによって異なります。
Node.js ランタイム
Node.js ランタイムを使用すると、すべての Node.js API とそれらに依存するすべての npm パッケージにアクセスできます。ただし、Edge ランタイムを使用したルートほど起動は迅速ではありません。
Next.js アプリケーションを Node.js サーバーにデプロイする場合、インフラの管理、スケーリング、設定が必要になります。あるいは、Vercel などのサーバーレスプラットフォームに Next.js アプリケーションをデプロイすることも検討できます。これにより、これらの作業が自動化されます。
サーバーレス Node.js
サーバーレスは、Edge ランタイムよりも複雑な計算負荷を処理できるスケーラブルなソリューションが必要な場合に理想的です。例えば Vercel の Serverless Functions では、インポートされたパッケージ、フォント、ファイルを含む全体のコードサイズが 50MB まで可能です。
Edge を使用したルートと比較した場合の欠点は、Serverless Functions がリクエストの処理を開始する前に数百ミリ秒の起動時間がかかる可能性があることです。サイトのトラフィック量によっては、関数が頻繁に「ウォーム」状態にならないため、この現象が頻繁に発生する可能性があります。
利用可能な API の完全なリストについては、Node.js ドキュメント と Edge ドキュメント を参照してください。どちらのランタイムも、デプロイインフラに応じて ストリーミング をサポートできます。