Edge and Node.js Runtimes
Next.jsのコンテキストでは、ランタイムとは、実行中にコードが利用できるライブラリ、API、および一般的な機能のセットを指す。
サーバー上には、アプリケーション・コードの一部がレンダリングされる2つのランタイムがある。
- Node.jsランタイム(デフォルト)は、エコシステムのすべてのNode.js APIと互換性のあるパッケージにアクセスできる
- EdgeランタイムはWeb APIをベースにしている
Runtime Differences
ランタイムを選択する際に考慮すべき点は多い。
この表は主な違いを一目でわかるように示したものである。
違いをより詳しく分析したい場合は、以下のセクションを確認。
Node | Serverless | Edge | |
---|---|---|---|
Cold Boot | / | Normal | Low |
HTTP Streaming | YES | YES | YES |
IO | ALL | ALL | fetch |
Scalability | / | High | Highest |
Security | Normal | High | High |
Latency | Normal | Low | Lowest |
npm Packages | ALL | ALL | A smaller subset |
Static Rendering | YES | YES | No |
Dynamic Rendering | YES | YES | YES |
Data Revalidation w/ fetch | YES | YES | YES |
Edge Runtime
Next.jsでは、軽量のEdgeランタイムは、利用可能なNode.js APIのサブセット。
Edgeランタイムは、ダイナミックでパーソナライズされたコンテンツを、
小さくシンプルな機能で低遅延に配信する必要がある場合に最適。
Edgeランタイムのスピードは、
リソースの使用を最小限に抑えていることから生まれるが、
多くのシナリオではそれが制限になる可能性がある。
例えば、Vercel上のEdgeランタイムで実行されるコードは、
1MBから4MBを超えることはできない。
この制限には、インポートされたパッケージ、フォント、ファイルが含まれ、
デプロイメントインフラストラクチャによって異なります。
さらに、EdgeランタイムはすべてのNode.js APIをサポートしているわけではない。たとえば、"Module not found: Can't resolve 'fs'」などのエラーが発生する。
これらのAPIやパッケージを使用する必要がある場合は、
Node.jsランタイムを使用することがお勧め。
Node.js Runtime
Node.jsランタイムを使用すると、すべてのNode.js APIと、それに依存するすべてのnpmパッケージにアクセスできる。
ただし、Edgeランタイムを使用するルートほど起動が速くない。
Next.jsアプリケーションをNode.jsサーバーにデプロイするには、
インフラの管理、スケーリング、設定が必要です。
あるいは、Vercelのようなサーバーレスプラットフォームに、
Next.jsアプリケーションをデプロイすることもできます。
Serverless Node.js
サーバーレスは、Edgeランタイムよりも複雑な計算負荷を処理できるスケーラブルなソリューションが必要な場合に最適。
例えば、Vercel上のServerless Functionsでは、
インポートされたパッケージ、フォント、ファイルを含めてコード全体のサイズは50MB。
エッジを使用するルートと比較した場合の欠点は、
サーバーレスファンクションがリクエストの処理を開始するまでに、
起動に数百ミリ秒かかる可能性があること。
サイトのトラフィック量によっては、ファンクションが頻繁に "ウォーム "にならないため、これが頻繁に発生する可能性がある。
利用可能なAPIの一覧は、Node.js DocsとEdge Docsを参照。
どちらのランタイムも、デプロイのインフラに応じてストリーミングをサポートすることができる。