できない.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#nodejs#runtime#nextjs

公開:

要約

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 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 公式 にまとまっている。

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