uni-app条件编译最稳用法是#ifdef/#ifndef注释,需严格匹配文件类型(js/ts用//,css/样式用/ /)和平台标识(如mp-weixin),支持逻辑组合,但嵌套≤5层;大差异页面推荐platforms目录隔离。
直接用 #ifdef 和 #ifndef 注释标记代码块,编译时自动剔除不匹配平台的代码——这是 uni-app 条件编译最稳、最轻量的用法,不需要额外配置,但必须严格匹配文件类型和平台标识。
条件编译注释写法必须匹配文件类型
同一套语法在不同文件里要用不同的注释符号,写错就完全失效:
-
.js或.ts文件:用// #ifdef MP-WEIXIN开头,// #endif结尾 -
.vue的<script></script>或<template></template>:同样用双斜杠注释(// #ifdef) -
.vue的<style></style>或独立.css文件:必须用/* #ifdef H5 */和/* #endif */,否则整个块被忽略 - 误用
//写在 CSS 里是高频翻车点,样式会“凭空消失”,连控制台都报不出错
平台标识不能拼错,大小写和连字符都要对
uni-app 对平台名敏感,MP-WEIXIN 写成 mp-weixin 或 MP_WEIXIN 都不会命中:
- 常用平台标识:
APP-PLUS、H5、MP-WEIXIN、APP-HARMONY、APP-ANDROID、APP-IOS - 组合判断支持
||(或)和&&(且),比如// #ifdef APP-PLUS && !VUE3-VAPOR -
APP是泛指 App 端(含安卓、iOS、鸿蒙),而APP-PLUS不含鸿蒙,这点容易混淆 - 鸿蒙专属要用
APP-HARMONY,不是APP-HARMONYOS或其他变体
样式和模板里的条件编译有硬限制
<style></style> 标签内不支持逻辑分支嵌套,也不支持变量注入,只做整块剔除:
-
<style></style>里不能写v-if或:class动态绑定来“模拟”条件编译 - 想实现按钮在 H5 圆角、App 直角?得靠平台前缀 class + 外部样式控制,比如
.btn--h5配.h5 .btn--h5 { border-radius: 8px; } - 别在
<style></style>里写// #ifdef——它压根不识别,只会当普通注释保留,最终全量输出 - 需要精细样式控制时,优先用
uni.getSystemInfoSync().platform动态加 class,再配合 CSS 变量微调
大差异页面建议用 platforms 目录替代代码块编译
当一个页面在小程序里要调 wx.login、在 H5 里走表单、在 App 里对接原生 SDK,逻辑和结构完全不同,硬塞进一个 .vue 文件会导致维护成本飙升:
- 在项目根目录建
platforms/mp-weixin/、platforms/h5/、platforms/app-plus/子目录 - 把平台专属的
index.vue放进去,编译器会自动优先取对应目录下的同名文件 - 这种方式生成的包里**只含目标平台代码**,而
#ifdef编译后仍可能残留未执行分支(虽不运行,但占体积) - 适合页面级重构,不适合函数级微调;两者可混用,但别在一个文件里又写
#ifdef又依赖platforms回退逻辑
最易被忽略的是嵌套深度——微信开发者工具对单个文件内 #ifdef 块嵌套限 5 层,超了就静默失败,编译产物缺失关键逻辑,查起来极难定位。真要多层判断,不如拆成多个小函数,或改用 platforms 目录隔离。











