Vercel で環境変数が反映されない
Vercel の環境変数は `Production` / `Preview` / `Development` の 3 環境で別管理される。
環境チェック漏れ、`NEXT_PUBLIC_` 接頭辞不足、変更後の再デプロイ忘れ、build-time / runtime の混同が反映されない典型原因。
#vercel#environment#deploy#runtime#build
公開:
要約
Vercel で env が反映されない原因は 環境のチェック漏れ、NEXT_PUBLIC_ 接頭辞忘れ、追加後の再デプロイ忘れ の 3 つにほぼ集約される。
env は Production / Preview / Development の 3 環境ごとに別保存される点を理解すれば、大半は解決する。
よくある原因
- 環境別チェック漏れ:
Productionだけにチェックを入れて、Preview(プルリク用デプロイ)に入れ忘れる。
プルリクからの動作確認だけ env が undefined になる。 NEXT_PUBLIC_接頭辞忘れ: クライアント JS からprocess.env.API_URLを読もうとしても undefined。
Next.js は build 時にこの接頭辞のみクライアントへ文字列置換する。- 再デプロイ未実施: env を変えても既存デプロイの build artifact には焼き込まれた古い値が残るため、再ビルドしないと反映されない。
- build-time vs runtime: build 時に展開される
NEXT_PUBLIC_*を、runtime しか持たない.env経由で渡そうとしている。 .env.local依存: ローカルだけ.env.localで動かしていて、Vercel 側に登録していないため本番だけ落ちる。
解決策
1. 3 環境ともチェックして登録する
公式の Environment Variables ドキュメント のとおり、Project Settings → Environment Variables の追加画面で Production / Preview / Development を必要に応じて全てチェックする。
サーバー専用なら Sensitive も併用する。
2. クライアント参照は NEXT_PUBLIC_ を付ける
# サーバー専用(API ルート / RSC からのみアクセス)
DATABASE_URL=postgres://...
# クライアントへ露出してよい値(build 時に文字列置換される)
NEXT_PUBLIC_API_URL=https://api.example.com接頭辞が無い値はブラウザに渡らない。
API キーのようなサーバー専用にしたい値はむしろ接頭辞を 付けない。
3. env 変更後は必ず再デプロイ
# CLI から再デプロイ
npx vercel --prodダッシュボードからは Deployments 画面で対象を選び Redeploy をクリックする。
Redeploy を行わない限り、既存 build にはどれだけ env を更新しても反映されない。
4. ローカルと同期する
npx vercel link
npx vercel env pull .env.localCLI ドキュメント の vercel env pull でリモートの env をローカルに取得できる。.env.local は .gitignore に入れる前提。