メインコンテンツまでスキップ

Edge and Node.js Runtimes

Next.js の文脈では、ランタイムとは、実行中のコードが利用できるライブラリ、API、および一般的な機能の集合を指します。

サーバーには、アプリケーションの一部がレンダリングされる 2 つのランタイムがあります。

  • Node.js Runtime(デフォルト)は、エコシステムのすべての Node.js API と互換性のあるパッケージにアクセスできます
  • Edge RuntimeWeb APIをベースとします

ランタイムの違い

ランタイムを選択する際には多くの考慮するべき点があります。この表は、主な違いを一目で確認できます。違いについてより詳しく分析したい場合は、以下のセクションをチェックしてください。

NodeServerlessEdge
Cold Boot/NormalLow
HTTP StreamingYesYesYes
IOAllAllfetch
スケーラビリティ/HighHighest
セキュリティNormalHighHigh
レイテンシーNormalLowLowest
npm パッケージAllAllA smaller subset
静的レンダリングYesYesNo
動的レンダリングYesYesYes
fetchによるデータの再検証YesYesYes

Edge Runtime

Next.js では、軽量な Edge Runtime は Node.js API の一部を提供します。

Edge ランタイムは、小さくシンプルな関数を使って低レイテンシーで動的でパーソナライズされたコンテンツを提供する必要がある場合に理想的です。Edge Runtime の高速性は、リソースの使用が最小化されていることに由来しますが、多くのシナリオではそれが制約になる可能性があります。

例えば、Vercel 上の Edge Runtime で実行されるコードは、1MB から 4MB を超えることはできません。この制限には、インポートされたパッケージ、フォント、ファイルが含まれ、デプロイメントインフラストラクチャによって異なります。

Node.js Runtime

Node.js Runtime を使用すると、すべての Node.js API と、それに依存するすべての npm パッケージにアクセスできます。ただし、Edge Runtime を使用するルートほど起動が速くありません。

Next.js アプリケーションを Node.js サーバーにデプロイするには、インフラの管理、スケーリング設定が必要です。あるいは、Vercel のようなサーバーレスプラットフォームに Next.js アプリケーションをデプロイできます。

Serverless Node.js

サーバーレスは、Edge Runtime よりも複雑な計算負荷を処理できるスケーラブルなソリューションが必要な場合に最適です。例えば、Vercel 上の Serverless Functions では、インポートされたパッケージ、フォント、ファイルを含めて、コード全体のサイズは50MBです。

Edgeを使用するルートと比較した場合の欠点は、サーバーレスファンクションがリクエストの処理を開始するまでに、起動に数百ミリ秒かかる可能性があることです。サイトのトラフィック量によっては、ファンクションが頻繁に"warm"にならないため、この現象が頻繁に発生する可能性があります。

Segment のランタイムオプション

Next.js アプリケーションでは、個々のルート Segment に対してランタイムを指定できます。そのためには、runtimeという変数を宣言してそれをエクスポートします。この変数は文字列で、'nodejs' または 'edge' ランタイムのどちらかの値でなければなりません。

次の例は、edgeという値のruntimeをエクスポートするページルート Segment を示しています。

app/page.tsx
export const runtime = 'edge' // 'nodejs' (default) | 'edge'

レイアウトレベルでruntimeを定義すると、その場合、レイアウト配下のすべてのルートが edge ランタイムで実行されます:

app/layout.tsx
export const runtime = 'edge' // 'nodejs' (default) | 'edge'

Segment ランタイムが設定されていない場合、デフォルトのnodejsランタイムが使用されます。Node.js ランタイムから変更する予定がない場合は、runtimeオプションを使用する必要はありません。

利用可能な API の一覧は、Node.js ドキュメントEdge ドキュメントを参照してください。どちらのランタイムも、デプロイのインフラに応じてストリーミングをサポートすることができます。