できない.dev

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 に切り替えれば解消する。

よくある原因

  1. Route Handler に export const runtime = 'edge' を付けたまま、内部で fs.readFile 等を呼んでいる
  2. 依存パッケージ(例: 暗号化ライブラリの一部、ネイティブビルドが必要な sharp の設定、bcrypt)が裏で Node API を参照している
  3. process 全体や Buffer を Web 標準的でない使い方をしている
  4. ネイティブビルドが必要な 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 APIWeb 標準の代替
fs.readFile で静的ファイルデプロイ時に import で取り込みバンドルに含める
crypto.createHashcrypto.subtle.digest
Node 18 未満の fetchグローバル fetch(Edge は標準対応)
BufferUint8Array / 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 公式(新しいタブで開く) にまとまっている。

この記事は役立ちましたか?