Next.js で環境変数 (process.env) が読み込めない
Next.js の環境変数はビルド時にインライン化される。
ブラウザに露出する値は NEXT_PUBLIC_ プレフィックスが必須で、.env ファイルの優先順位とビルドの再実行も意識する必要がある。
#nextjs#env#process.env#NEXT_PUBLIC#build
公開:
要約
Next.js の環境変数はサーバ側とブラウザ側で扱いが違う。
ブラウザに渡したい値は NEXT_PUBLIC_ プレフィックス必須で、付け忘れると process.env.FOO は undefined になる。
.env.local を変更した後は dev サーバの再起動が必要、本番ビルド時はビルド実行シェルに値があることを確認する。
仕様は Environment Variables に明記されている。
よくある原因
- NEXT_PUBLIC_ 付け忘れ: ブラウザに露出させる値は明示的に
NEXT_PUBLIC_を付ける必要がある。
付けない値はクライアント側でundefined - dev サーバ未再起動:
.env*ファイルはプロセス起動時に読み込まれる。
編集後は Ctrl+C で停止して再起動しないと反映されない - ビルド時に未定義:
next buildの時点で値が無いと、その値はundefinedとしてバンドルされ、実行時の env を変えても上書きされない - ファイル優先順位の誤解:
.env.production.local>.env.local>.env.production>.envの順で読まれる。
上位ファイルで意図せず空文字を入れていないか確認
解決策
1. NEXT_PUBLIC_ プレフィックスを付ける
# .env.local
DATABASE_URL=postgres://... # サーバ専用
NEXT_PUBLIC_API_URL=https://api.example.com # クライアントから参照可// app/page.tsx (Server Component なら両方読める)
console.log(process.env.DATABASE_URL);
// app/components/Client.tsx ("use client")
console.log(process.env.NEXT_PUBLIC_API_URL); // OK
console.log(process.env.DATABASE_URL); // undefined2. dev サーバを再起動
# Ctrl+C で止めて
npm run devホットリロードは .env* の変更を検出しない。
3. 本番ビルドのシェルで export
export NEXT_PUBLIC_API_URL=https://api.example.com
export DATABASE_URL=postgres://...
npm run buildCI ではビルドステップの環境に値を渡す。
Vercel / Cloud Run / Amplify などは UI で設定する。
4. ファイル優先順位を確認
.env.development.local ← dev 時のローカル上書き(git ignore 推奨)
.env.development ← dev のデフォルト
.env.local ← 全環境のローカル上書き(git ignore 推奨)
.env ← ベース複数ファイルがある場合、上のファイルの値が下を上書きする。
空文字を書くと「未設定」ではなく「空文字」になるので注意。