Vite で「process is not defined」が解決できない
ブラウザには Node のグローバル `process` が無いため、`process.env` を参照するコードが実行時に落ちる。
Vite では `import.meta.env` を使うか、`define` で `process.env` を置き換える。
#vite#env#process#browser
公開: 更新:
要約
Uncaught ReferenceError: process is not defined は、Node.js のグローバル変数 process をブラウザで参照したときに出ます。process は Node のランタイムが提供するもので、ブラウザには存在しません。
Vite はバンドル時に Node の process.env を自動でブラウザ用に置き換えたりしないため、環境変数は Vite の流儀である import.meta.env から読みます。
自分のコードは import.meta.env に直し、ライブラリ都合でどうしても process が必要なときは define で補います。
Uncaught ReferenceError: process is not definedよくある原因
- 自前コードの
process.env: Node の感覚でprocess.env.FOOを書いている。 - 依存ライブラリ: ライブラリが内部で
process.env.NODE_ENVを読んでおり、それがブラウザに混ざっている。 - CRA からの移行:
process.env.REACT_APP_*の参照が移行後も残っている。 - プレフィックス違い: Vite は
VITE_で始まる変数だけをクライアントに露出するため、それ以外はimport.meta.envに現れない。
解決策
1. import.meta.env に書き換える
自分のコードでは process.env をやめ、import.meta.env を使います。
クライアントへ露出させる変数名は VITE_ で始める必要があります。
// const url = process.env.API_URL →
const url = import.meta.env.VITE_API_URL;.env ファイル側も合わせます。
VITE_API_URL=https://api.example.comなお VITE_ を付けた変数はバンドルに含まれてブラウザから見えるため、API キーなどの秘匿情報は入れないでください。
2. ライブラリ都合の process.env を define で補う
自分では直せないライブラリが process.env を読む場合は、vite.config の define でビルド時に値を埋め込みます。define は文字列を「そのままコードに置換」するので、値は JSON.stringify で囲みます。
// vite.config.ts
export default defineConfig({
define: {
"process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV),
// 参照だけ通したい最低限のフォールバック
"process.env": {},
},
});