Vercel でビルドが失敗してデプロイできない
Vercel のビルド失敗はローカルでは出ない原因に集中する。
Vercel と手元の Node バージョン差、Project Settings の Build Command / Output ズレ、build-time 環境変数不足、lockfile 不整合、monorepo Root Directory 誤りの 5 系統を順に切り分ける。
公開:
要約
Vercel の build 失敗は、ローカルでは見えない要因が中心になる。Node メジャー版の差、Build Command / Output Directory のズレ、build-time 環境変数の不足、lockfile 不整合、monorepo の Root Directory 誤り の 5 項目を順に確認すれば、Vercel 側で再現する build エラーの大半は片付く。
よくある原因
- Node.js バージョン差: ローカル 20 系で書いた構文や API が Vercel 側 18 系に無く落ちる、あるいはその逆。
- Build Command / Output Directory 違い: フレームワーク自動検出を上書きした設定が残り、
next buildを呼べていない・出力先がフレームワーク既定と異なる。 - build-time env 不足:
NEXT_PUBLIC_*など build 中に文字列展開される値が Vercel 側に未登録、または Preview 環境にチェックが入っていない。 - lockfile 不整合: Vercel は
npm ci相当で依存をインストールするため、lockfile とpackage.jsonが食い違うと即失敗する。 - monorepo の Root Directory: 別アプリのルートをビルドしようとして該当アプリが見つからず失敗する。
解決策
1. ローカルで Vercel と同じビルドを再現する
npx vercel build # Vercel CLI でローカルに同条件ビルドを実行
node -v # Vercel 設定の Node メジャー版と一致しているか確認Troubleshoot a Build 公式ガイド でも、最初の確認手順としてバージョン整合と env のチェックが挙げられている。
2. Build Command / Output Directory / Node 版を合わせる
Vercel ダッシュボードの Project Settings → General で、フレームワーク既定から外れた上書きが残っていないか確認する。package.json に "engines": { "node": ">=20.0.0" } を書いた上で、Node.js Version を 20.x に揃える。
3. 環境変数を Production / Preview それぞれに登録する
Project Settings → Environment Variables の追加画面で Production / Preview / Development 各環境のチェックを入れて保存する。
Preview 用の登録漏れで「プルリクの build だけ落ちる」パターンが多い。
4. lockfile を最新化してコミット
rm -rf node_modules package-lock.json
npm install
git add package-lock.json
git commit -m "chore: refresh lockfile"Project Configuration 公式 でも、Vercel が lockfile を厳格に扱うため lockfile のコミットが必須と明記されている。
5. monorepo の Root Directory を設定する
Project Settings → General → Root Directory を該当アプリのパス(例 apps/web)に設定する。
複数アプリを持つリポジトリでは Project ごとに Root Directory を分けるのが基本。