同一个 .env 文件,web 里 import.meta.env.VITE_API_URL 有值,admin 里 process.env.VITE_API_URL 是 undefined,两个包用的构建工具不同。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,只有 VITE_ 前缀的变量会被 vite 注入到客户端代码,webpack 走的是 DefinePlugin,process.env 在浏览器里本来就不存在。各包读 env 的方式不同,同一份配置就有了两套结果。

「多包环境变量」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

grep -rn 'process.env.VITE_' apps/ packages/
grep -rn 'import.meta.env' apps/ packages/
cat .env

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。

具体做法是,统一走一层 config 包 由它读 env 再导出;vite 项目只用 import.meta.env 不要混 process.env;webpack 项目显式配 DefinePlugin 映射需要的键;把 .env 的键列进文档 标明哪些是构建期注入。

最后用这个标准收尾,两个包打印出的 API 地址一致 构建产物里不再出现 undefined 的接口域名。

作者 9823189