Vercel にデプロイした Next.js のアプリで 本番環境 (production) と 開発環境 (development) / プレビュー (preview) とで アナリティクスなどを出し分けけしたく NODE_ENV で判別していたのですが、プレビュー時に本番環境と同じになってしまう問題にハマったのでメモ
Vercel の preview 環境の NODE_ENV は production
Vercel の preview 環境の NODE_ENV は production
とおいう仕様のようです。
なので下記のように process.env.NODE_ENV === 'production'
で判定しているとプレビュー時に本番環境と同じになってしまいます
const IS_PRODUCTION = process.env.NODE_ENV === 'production'; if (IS_PRODUCTION) { return 'Production 用の何か'; // BUG preview 時にも実行される }
VERCEL_ENV
を使って判定する
VERCEL_ENV
The Environment that the app is deployed and running on. The value can be eitherproduction
,preview
, ordevelopment
.
cf. System Environment Variables Overview | Vercel Docs
Next.js でクラアンサイドで判定するのであれば NEXT_PUBLIC_VERCEL_ENV
を使えばよい
const getVercelEnv = () => { const env = process.env.NEXT_PUBLIC_VERCEL_ENV ?? 'development'; switch (env) { case 'production': { return 'production'; } case 'preview': { return 'preview'; } default: { return 'development'; } } }; const VERCEL_ENV = getVercelEnv(); export const IS_PRODUCTION = process.env.NODE_ENV === 'production' && VERCEL_ENV === 'production'; if (IS_PRODUCTION) { return 'Production 用の何か'; // preview 時には実行されない }
まさか Preview の NODE_ENV
が production
になっていると思わずハマりました
Vercel がいい感じの環境変数を用意してくれていたので助かりました
おわり
[参考]
船の方は Vessel だった