别用 process.env.NODE_ENV 切环境,必须用 VITE_ 或 UNI_ 开头的变量通过 .env 文件+构建时注入;因 uni-app 不支持运行时读取 process.env,且 import.meta.env 值在构建时已固化。

直接结论:别用 process.env.NODE_ENV 切环境,它在 uni-app 里不可靠;必须用以 VITE_ 或 UNI_ 开头的变量,通过 .env 文件 + 构建时注入来生效。
为什么 process.env.NODE_ENV 总是 development
uni-app 的构建系统(Vite 或 @dcloudio/uni-cli-shared)不走标准 Node.js 环境,process.env.NODE_ENV 是编译时静态写死的常量,默认为 development。你在代码里改它、在 vue.config.js 里用 DefinePlugin 覆盖它,大概率导致 HBuilderX 打包异常或小程序平台报错。
真正能区分环境的是构建命令触发的变量注入时机——比如运行 npm run dev:h5 时注入开发变量,执行 npm run build:mp-weixin 时才把生产变量打进包里。
- 小程序逻辑层(如
uni.request)根本读不到process.env,只能用import.meta.env -
manifest.json是纯静态 JSON,无法引用任何环境变量 - 运行时判断
location.hostname或uni.getSystemInfoSync().platform只能辅助,不能作为主逻辑,尤其在真机调试和体验版中结果不稳定
怎么写 .env 文件才有效
变量名必须以 VITE_ 或 UNI_ 开头,否则 Vite 或 uni-app CLI 会直接忽略。
推荐统一用 VITE_ 前缀(uni-app 3.0+ 默认基于 Vite),文件放在项目根目录:
VITE_API_BASEURL="https://dev.api.com" VITE_WS_URL="wss://dev-ws.example.com"
对应生产环境:
VITE_API_BASEURL="https://api.com" VITE_WS_URL="wss://ws.example.com"
- 文件命名要规范:
.env.development、.env.production,Vite 会自动根据NODE_ENV(仅用于选文件)加载对应文件 - 不要在
static/目录下的 JS 中读取这些变量——它们不参与编译,import.meta.env为空 - 微信小程序平台不支持
process.env,但支持import.meta.env.VITE_API_BASEURL,放心用
在代码里怎么安全读取和使用
不能在任意模块(尤其是 utils/ 或 api/)里直接写 import.meta.env.VITE_API_BASEURL——Vite 会把它内联为字符串常量,但如果该模块被多处 import,且构建目标平台不同(如 H5 和小程序共用同一份 api.ts),可能因环境变量未注入而 fallback 到 undefined。
稳妥做法是在 main.js(或 App.vue 的 onLaunch)里做一次提取并挂载:
const apiBase = import.meta.env.VITE_API_BASEURL || 'https://fallback.com' // Vue 3 app.config.globalProperties.$apiBase = apiBase // Vue 2 Vue.prototype.$apiBase = apiBase
- 所有 API 请求都通过
this.$apiBase拼接 URL,避免散落多处硬编码 - 不要在
manifest.json或pages.json里试图引用环境变量——它们不解析 JS 表达式 - H5 的代理配置(
vite.config.ts中的server.proxy)和小程序合法域名是两套机制,不能混用;代理只对 H5 有效,小程序必须填真实域名
常见错误现象和排查点
打包后接口 404、请求发到 localhost、小程序报“request:fail url not in domain list”,八成是环境变量没生效。
- 检查变量名是否漏了
VITE_前缀(API_BASEURL❌,VITE_API_BASEURL✅) - 确认你执行的是
build命令而非dev命令——dev模式下默认读.env.development - 在微信开发者工具里改了
.env文件后没重新 build,旧值还在缓存里 - 跨平台构建时(如同时打 H5 和小程序包),确保各平台构建命令都指定了正确环境,例如
npm run build:mp-weixin -- --mode production
最易被忽略的一点:环境变量只在构建时注入,不是运行时动态读取。一旦打包完成,import.meta.env 的值就固定了,改 .env 文件也不会影响已生成的 dist 包。


















