uni-app 中 process.env.NODE_ENV 总是 development,因其由构建系统编译时静态注入且默认设为 development;应使用 UNI_ 开头的环境变量(如 UNI_API_BASE_URL)并通过 .env 文件配置,在 main.js 或 App.vue 中读取。

uni-app 的 process.env.NODE_ENV 为什么总是 development
因为 uni-app 默认不走 Node.js 环境,process.env 是编译时注入的静态值,不是运行时读取的。你改 webpack 配置或在代码里直接写 process.env.NODE_ENV,大概率不会生效——uni-app 的构建系统(vue-cli-service + @dcloudio/uni-cli-shared)有自己的环境变量注入逻辑。
- 真正生效的是
UNI_PLATFORM(如h5、mp-weixin)和UNI_APP_ID这类预定义变量,它们由 CLI 在编译阶段写死进代码 -
process.env.NODE_ENV只有在使用vue.config.js自定义 webpack 配置并显式配置DefinePlugin时才可能被覆盖,但会破坏 HBuilderX 兼容性 - 推荐做法:别依赖
process.env.NODE_ENV,改用 uni-app 官方支持的uni.getSystemInfoSync().platform或更稳妥的编译期变量
如何正确定义和读取自定义环境变量(.env 文件方式)
uni-app 支持标准的 .env、.env.development、.env.production,但必须满足两个硬条件:变量名以 UNI_ 开头,且只在 main.js 或 App.vue 的 onLaunch 等生命周期中通过 process.env 访问。
- 在项目根目录建
.env.development:UNI_API_BASE_URL=https://dev.api.com
- 在
.env.production中写:UNI_API_BASE_URL=https://api.com
- 变量必须以
UNI_开头,否则编译时会被忽略(这是 uni-app 的安全限制) - 只能在非
static目录下的 JS 文件中读取,static下的 JS 不参与编译,读不到process.env - 注意:HBuilderX 2.7+ 才完整支持多环境
.env文件,旧版需手动触发「发行」→「原生App-云打包」才会注入
运行时判断开发/生产环境的可靠方式(uni.getSystemInfoSync + 编译条件)
单纯靠 JS 运行时判断不可靠,比如开发者工具里 uni.getSystemInfoSync().platform 返回 devtools,但真机调试时又变成 ios 或 android。最稳的组合是:编译期变量兜底 + 运行时特征辅助。
- 优先用编译期变量:
process.env.UNI_PLATFORM === 'h5' && process.env.NODE_ENV === 'production'—— 注意这里NODE_ENV能用,是因为 CLI 内部已把它映射为UNI_NODE_ENV并注入 - 真机调试时,
uni.getSystemInfoSync().environment在微信小程序里返回develop或trial,可配合判断 - H5 端可通过 URL 判断:
location.hostname === 'localhost' || location.port === '8080',但上线后要记得删掉或加开关 - 避免用
console.log输出的有无来判断环境——有些平台(如支付宝小程序)即使在生产环境也会保留部分日志
环境变量在不同平台的兼容性差异(h5 vs mp-weixin vs app-plus)
同一套 .env 配置,在不同平台的行为可能不一致。比如 app-plus 的云打包流程会忽略 .env.development,而只认 .env;微信小程序基础库 2.25.0+ 才支持 process.env 注入,低版本直接 undefined。
-
h5:完全支持.env.*,变量在window.__uniConfig里也能看到(调试用) -
mp-weixin:仅支持UNI_*前缀变量,且必须在project.config.json的setting.minified为false时才能在开发者工具里调试到 -
app-plus:云打包时只读取.env(不区分 development/production),本地打包需在 HBuilderX → 运行 → 运行到手机或模拟器时手动选择「使用当前环境变量」 - 所有平台都不支持动态修改
process.env,赋值语句会被编译器直接删除
最麻烦的其实是调试阶段:你以为切到了 production,其实只是 HBuilderX 没刷新缓存,或者云打包用了旧的 env 文件。每次改完 .env,务必清空 unpackage 目录再重新发行。










