process.env.uni_platform 是编译期注入的稳定平台标识,值为 "h5"、"mp-weixin" 等严格对应目标平台,优于运行时 uni.getsysteminfosync().platform 或 navigator.useragent,推荐优先用于条件编译和平台差异化逻辑。

用 process.env.UNI_PLATFORM 做编译期平台判断,最稳
运行时读取的 uni.getSystemInfoSync().platform 或 navigator.userAgent 都不可靠——前者在 App 热更新后可能缓存旧值,后者在 H5 场景下被微信、支付宝、Safari 混用,根本分不清是「微信内 H5」还是「微信小程序」。
process.env.UNI_PLATFORM 是 Webpack 编译时注入的常量,打包那一刻就固化了,不会被运行时篡改。它只可能是以下值之一:"h5"、"mp-weixin"、"mp-alipay"、"app-plus"、"mp-baidu" 等,每个都严格对应目标平台。
实际用法建议:
- 所有平台差异化逻辑(比如 API 路径、组件封装、埋点 SDK 加载)优先用条件编译,而不是运行时 if 判断
- 在
.vue文件的<script></script>中写// #ifdef MP-WEIXIN,在<template></template>中写<!-- #ifdef APP-PLUS -->,编译后对应平台代码才存在,体积小、无兼容风险 - 不要在
main.js顶层直接用if (process.env.UNI_PLATFORM === 'h5')做全局分支——这会让所有平台都打包进 H5 相关逻辑,白占体积
运行时要区分 iOS/Android?得结合 navigator.userAgent 和 UNI_PLATFORM
process.env.UNI_PLATFORM === 'app-plus' 只能告诉你现在跑的是 5+ App,但无法知道是 iOS 还是 Android。这时候必须看 UA,但单独看 UA 会误判(比如 H5 在 iPhone Safari 里也有 iPhone)。
正确姿势是双重校验:
isIOS: /iPhone|iPad|iPod/.test(navigator.userAgent) && process.env.UNI_PLATFORM === 'app-plus'isAndroid: /Android/.test(navigator.userAgent) && process.env.UNI_PLATFORM === 'app-plus'- 避免写成
/iPhone/.test(navigator.userAgent)就认为是 iOS——H5 在微信里打开也会匹配,但你并不想给 H5 加 iOS 专属样式或逻辑 - 注意:iOS 17+ Safari 的 UA 可能隐藏设备标识,真机测试务必覆盖 iOS 16/17/18,别只信模拟器
怎么判断「H5 是否在微信里打开」而不是「微信小程序」?
这是最容易踩坑的点。process.env.UNI_PLATFORM === 'h5' 只说明当前是 H5 构建产物,但它可能运行在微信内置浏览器、QQ 浏览器、Safari、甚至桌面 Chrome 里。
关键区别在于:微信小程序的 UNI_PLATFORM 是 "mp-weixin";而微信内 H5 的 UNI_PLATFORM 是 "h5",且 navigator.userAgent 含 MicroMessenger。
所以判断微信内 H5 的唯一可靠方式是:
process.env.UNI_PLATFORM === 'h5' && /MicroMessenger/.test(navigator.userAgent)- 同理,支付宝内 H5 是:
process.env.UNI_PLATFORM === 'h5' && /AlipayClient/.test(navigator.userAgent) - 千万别用
uni.getSystemInfoSync().platform === 'devtools'来反推——开发者工具里这个值恒为'devtools',和真机环境完全无关
开发/生产环境判断别只依赖 process.env.NODE_ENV
process.env.NODE_ENV 确实能区分 'development' 和 'production',但 uni-app 实际构建流程中,HBuilderX 的「运行」和「发行」按钮、CLI 的 npm run dev 和 npm run build 才是真实触发点。
容易忽略的细节:
- HBuilderX 的「运行到浏览器」和「运行到微信开发者工具」都是
development模式,但前者是 H5,后者是小程序——仅靠 NODE_ENV 无法区分平台 - 如果你需要「测试服 + 微信小程序」和「生产服 + H5」这种组合配置,必须把
UNI_PLATFORM和NODE_ENV一起作为维度,比如:if (process.env.NODE_ENV === 'development' && process.env.UNI_PLATFORM === 'mp-weixin') - 自定义环境(如
staging)需在vue.config.js或 HBuilderX 运行配置里显式声明,否则process.env.NODE_ENV永远只有 development/production 两个值
最复杂的不是“怎么写判断”,而是“在哪写”——条件编译适合静态确定的平台差异(比如导航栏、原生分享),运行时判断适合动态场景(比如根据手机型号加载不同分辨率图片),混用或错位会导致某平台白屏、API 报错、或发错请求。上线前务必在真机 + 各平台开发者工具里交叉验证。











