Open2

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を参照。
どちらのランタイムも、デプロイのインフラに応じてストリーミングをサポートすることができる。