uni-app 条件编译是什么?
uni-app 中的条件编译,指的是在编译阶段,通过特定的注释标记,根据不同平台(如小程序、App、H5 等)将对应注释块内的代码编译到指定平台,从而实现一套代码,多端差异化输出。这能有效解决跨端开发时的平台差异问题,避免运行时的冗余判断。比如:我在微信小程序上输出红色按钮,在h5或app上面输出蓝色按钮,那么条件编译就可以帮助你实现哦!
下面是一个条件编译在不同文件中使用的简要表格概括:
| 文件类型 | 条件编译写法 | 备注 |
|---|---|---|
| JavaScript | // #ifdef %PLATFORM% ... // #endif |
|
| Template | <!-- #ifdef %PLATFORM% --> ... <!-- #endif --> |
|
| CSS | /* #ifdef %PLATFORM% */ ... /* #endif */ |
必须使用 /* */ 注释语法 |
| Pages.json | // #ifdef %PLATFORM% ... // #endif |
需注意 JSON 格式的正确性 |
🛠️ 条件编译语法与平台标识符
条件编译以 #ifdef(如果已定义,即仅在指定平台存在)或 #ifndef(如果未定义,即除了指定平台外均存在)加平台标识符开头,以 #endif 结尾。
常见平台标识符(%PLATFORM%)及其含义:
| 平台标识符 | 对应平台 |
|---|---|
APP-PLUS |
App |
APP-PLUS-NVUE |
App nvue 页面 |
H5 |
H5 |
MP-WEIXIN |
微信小程序 |
MP-ALIPAY |
支付宝小程序 |
MP-BAIDU |
百度小程序 |
MP-TOUTIAO |
字节跳动小程序 |
MP-QQ |
QQ 小程序 |
MP |
所有小程序平台 |
QUICKAPP-WEBVIEW |
快应用通用 |
多平台可以使用 || 来连接,例如 #ifdef H5 || MP-WEIXIN 表示在 H5 平台或微信小程序平台存在。但不支持 && 操作符,因为没有交集。
📝 不同文件中的使用示例
1. JavaScript / <script> 中的条件编译
用于平台特定的逻辑或 API 调用。
2. Template / <template> 中的条件编译
用于控制不同平台显示的组件或元素。
3. CSS / <style> 中的条件编译
用于编写平台特定的样式。注意:必须使用 /* */ 注释语法。
4. Pages.json 中的条件编译
用于配置平台特定的页面路由、窗口样式、选项卡栏等。需特别注意 JSON 格式的正确性,避免出现多余的逗号。
5. Static 目录的条件编译
static 目录下可以建立与平台标识符同名的子目录(字母均为小写),该子目录下的静态资源只有在特定平台才会被编译进去。
例如,目录结构如下:
-
common-image.png在所有平台都会被编译。 -
wx-specific-image.png只在微信小程序平台被编译。 -
h5-specific-image.png只在 H5 平台被编译。
在代码中引用时,无需在路径中指定平台目录:
⚠️ 注意事项
-
注释语法必须正确:
-
JS 中使用
// 注释 -
CSS 中使用
/* 注释 */ -
Vue 模板中使用
<!-- 注释 -->
-
-
保持语法正确性:条件编译无论是否生效,都必须保证编译前后文件的语法正确性。
-
在 JSON 中(如
pages.json),要特别注意逗号问题,避免出现多余的逗号导致 JSON 解析错误。 -
在 JS 中,避免条件编译导致重复导入模块。
-
-
平台标识符大小写:平台标识符是区分大小写的,例如
MP-WEIXIN不能写成mp-weixin或MP-WeiXin。 -
APP-PLUS 与 APP-NVUE:
APP-PLUS包含 App 下的 nvue 和 vue 页面,而APP-PLUS-NVUE或APP-NVUE仅针对 App 的 nvue 页面。 -
未定义平台名称:如果使用了未定义(可能是拼写错误或低版本 HBuilderX 不支持)的平台名称,
#ifdef中的代码不会生效,而#ifndef中的代码会生效。 -
Android 和 iOS 的平台区分:条件编译不能直接用于区分 Android 和 iOS 平台。如果需要区分,请在运行时通过
uni.getSystemInfoAPI 获取platform信息来进行判断。
💡 实战建议
-
按需使用:虽然条件编译很强大,但不应过度使用。优先考虑使用 uni-app 提供的跨端 API 和组件。只有当它们无法满足平台差异化需求时,再使用条件编译。
-
代码组织:对于大量平台特定的代码,可以考虑将其放入不同的平台专用目录(如
platforms目录),或者利用static目录的条件编译特性来管理平台特定的静态资源。 -
充分测试:由于条件编译后的代码只在特定平台出现,务必在所有目标平台上进行充分的测试,以确保功能和样式的一致性。
🧪 一个简单的综合案例
假设我们需要开发一个功能:
-
在 H5 平台,显示一个蓝色按钮,并调用浏览器控制台日志。
-
在微信小程序平台,显示一个绿色按钮,并调用微信的登录接口。
-
在App平台,显示一个红色按钮。
-
其他平台显示默认按钮。
本文来自博客园,作者:Carvers,转载请注明原文链接:https://www.cnblogs.com/carver/articles/19070906

浙公网安备 33010602011771号