Vercel Edge Runtime で Node.js API(fs / child_process 等)が使えない
Edge Runtime は V8 isolate 上で動く Web 標準 API のみのサンドボックスで Node.js ではない。
fs / child_process / net / ネイティブモジュールは使えない。
Node API が必要なら runtime を nodejs に切り替える。
公開:
要約
Vercel Edge Runtime は Node.js ではなく V8 isolate 上で動く Web 標準 API のみのサンドボックス。fs, child_process などの Node コア API、ネイティブモジュールはすべて使えない。
デプロイ時の「Module not supported in Edge Runtime」エラーは、ランタイムを Node に切り替えれば解消する。
よくある原因
- Route Handler に
export const runtime = 'edge'を付けたまま、内部でfs.readFile等を呼んでいる - 依存パッケージ(例: 暗号化ライブラリの一部、ネイティブビルドが必要な
sharpの設定、bcrypt)が裏で Node API を参照している process全体やBufferを Web 標準的でない使い方をしている- ネイティブビルドが必要な NPM パッケージを import している
解決策
1. ランタイムを切り替える
最も単純な解決は Node ランタイムに戻すこと:
// app/api/foo/route.ts
export const runtime = "nodejs"; // 'edge' を外すこれで Node API が使えるようになる。
Edge の低レイテンシが必要な経路だけを Edge に残し、それ以外は Node に分けるのが基本戦略。
詳細な対応 API 一覧は Vercel Edge Functions 公式ドキュメント を参照。
2. Web 標準 API に置き換える
| Node API | Web 標準の代替 |
|---|---|
| fs.readFile で静的ファイル | デプロイ時に import で取り込みバンドルに含める |
| crypto.createHash | crypto.subtle.digest |
| Node 18 未満の fetch | グローバル fetch(Edge は標準対応) |
| Buffer | Uint8Array / TextEncoder |
3. 依存ライブラリの Edge 対応版を探す
ライブラリの README に「Edge runtime support」「Cloudflare Workers compatible」と書かれているものを選ぶ。
例えば JWT は jose、暗号は @noble/hashes のようなピュア JS 実装を使う。
4. ジョブを分離する
Edge は「低遅延でリクエストを受け、軽い処理だけ」、Node は「重い処理・ファイル I/O・ネイティブ依存」と役割分担を明確にする。
Edge 経路から Node 経路へ fetch で内部呼び出しするのが定石。
Next.js 利用時の指針は Next.js Edge Runtime 公式 にまとまっている。