最干净可靠的方式是用 // #ifdef 条件编译注释实现平台代码分离,必须严格遵循语法规范,仅在编译时生效,支持 script/template/style 三端差异化处理。

直接用 #ifdef 指令就能在编译时精准分离 App、H5、微信小程序的代码,运行时不会残留判断逻辑,也不依赖运行时环境变量——这是最干净、最可靠的方式。
条件编译指令必须写在注释里
Uni-app 的 #ifdef 不是 JavaScript 语句,而是编译器识别的特殊注释格式。写错位置或少斜杠都会被忽略,导致代码意外出现在所有平台。
- 正确写法:
// #ifdef H5(前后各两个斜杠,中间一个空格) - 错误写法:
#ifdef H5(没注释符号)、//#ifdef H5(缺空格)、// #ifdef H5 console.log(...)(不能跟代码同行) - 每段条件编译必须配对:
// #ifdef H5→// #endif,中间只能放合法 JS/TS、template 或 style 内容 - 支持逻辑组合:
// #ifdef APP-PLUS || MP-WEIXIN可同时命中 App 和微信小程序,但不支持&&
平台标识符别记混:H5、MP-WEIXIN、APP-PLUS 是标准值
不同平台对应固定字符串,大小写敏感,且不能靠猜。比如微信小程序是 MP-WEIXIN,不是 weixin 或 mini-program;H5 就是 H5,不是 WEB 或 BROWSER。
-
H5:纯浏览器环境,包括微信内嵌浏览器、QQ 浏览器、Chrome 等 -
MP-WEIXIN:微信小程序(注意是短横线,不是下划线) -
APP-PLUS:iOS / Android 原生 App(uni-app 打包的 App),不是APP(那个还包含鸿蒙) -
APP-HARMONY:鸿蒙平台专属,和APP-PLUS互斥 -
MP-QQ、MP-BAIDU等也存在,但需确认项目是否启用对应平台编译
别在运行时用 process.env.UNI_PLATFORM 做分支判断
虽然 process.env.UNI_PLATFORM 在开发期能取到值,但它属于构建时注入的常量,在生产环境可能被压缩工具抹掉,或在某些打包配置下未定义。更重要的是,它无法剔除无用代码——H5 包里仍会包含 MP-WEIXIN 的 API 调用,导致运行时报错。
- ❌ 错误示范:
if (process.env.UNI_PLATFORM === 'MP-WEIXIN') { uni.navigateToMiniProgram(...) } - ✅ 正确做法:
// #ifdef MP-WEIXIN包裹整个调用,确保只存在于小程序包中 - 调试时想快速验证?可在 HBuilderX 中右键「运行到对应模拟器」,再看控制台输出是否匹配预期平台
template 和 style 里也能用条件编译
不只是 script,template 结构和样式也可以按平台差异化处理,而且语法一致。这对解决平台组件限制特别有用——比如 H5 用 <input>,小程序必须用 <input> 但属性名不同,App 又可能要用原生插件封装的输入框。
- template 示例:
// #ifdef H5<input type="text" v-model="value">// #endif// #ifdef MP-WEIXIN<input :focus="true">// #endif - style 示例:
// #ifdef H5.container { display: flex; }// #endif// #ifdef APP-PLUS.container { display: -webkit-flex; }// #endif - 注意:style 中不能写 CSS 预处理器语法(如
@media嵌套),条件编译只作用于整块规则
最容易被忽略的是:条件编译只在「编译阶段」生效,一旦代码进了 dist 目录,就再也改不了。所以别指望上线后通过接口返回平台类型再去动态加载某段逻辑——那已经晚了。真正要隔离的,得在写代码时就决定好哪块归哪边。











