Edge Runtime vs Node Runtime の使い分け#
Vercel(や Cloudflare Workers)の Edge Runtime は起動が速くグローバル分散できるが、Node.js API の大半が使えない。Node Runtime との使い分けを誤ると、運用時に詰む。
使い分け判断#
flowchart TD
Q[エンドポイント新規作成] --> A{Node.js 固有 API<br/>を使う?}
A -->|はい fs, crypto<br/>native addon| N[Node Runtime]
A -->|いいえ| B{処理時間は?}
B -->|5 秒以内| E[Edge Runtime]
B -->|長時間| N
B -->|ストリーミング| E
制約比較#
| 観点 | Edge Runtime | Node Runtime |
|---|---|---|
| 起動時間 | 数 ms | 数百 ms |
| グローバル分散 | ◎ | △ |
| メモリ上限 | 128 MB | 1024 MB+ |
| 実行時間上限 | 短い(プラン依存) | 長い |
| Node.js API | 制限あり | 全て使える |
| native モジュール | 使えない | 使える |
| ファイルシステム | 読み込みのみ | 読み書き可 |
| HTTP Streaming | ◎ | ○ |
Edge Runtime で動かないもの#
fs/pathの書き込み系- native binding(sharp, canvas, node-sqlite 等)
Bufferの一部 API(基本は polyfill あり)- 重いライブラリ(puppeteer, Prisma の一部機能 等)
典型的な使い分け#
Edge 向き
- LLM のストリーミング API プロキシ
- 認証トークン検証だけのミドルウェア
- A/B テストの振り分け
- 軽量な JSON API(読み取り中心)
- 地理的に近い応答が欲しい API
Node 向き
- 画像処理(sharp 等)
- PDF 生成(puppeteer 等)
- Prisma を使う API(Edge 対応もあるが機能限定)
- 長時間バッチ処理
- 複雑な依存を持つライブラリを使う処理
注意点#
1. 同じコードが両方で動くとは限らない
ライブラリが Edge 対応していないと、ビルドは通っても実行時にエラー。ドキュメントで edge-runtime compatible を明記しているか確認する。
2. リクエスト単位で切り替える
Next.js では route ごとに export const runtime = 'edge' または 'nodejs' を指定する。
export const runtime = 'edge'
export async function POST(req: Request) {
// ...
}
3. テストが難しい
ローカル開発では Node で動いて、本番(Edge)で動かないケースがある。vercel dev でローカル確認するか、プレビューデプロイで確認する。
まとめ#
原則: 迷ったら Node Runtime。Edge Runtime は「軽量・ストリーミング・低レイテンシ」が明確に必要な場合に限定して使う。