UNI-APP不同平台的差异化时条件编译 解决不同平台打包兼容
条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。
写法:以#ifdef
或#ifndef
加%PLATFORM%
开头,以#endif
结尾。
#ifdef:if defined 仅在某平台存在 #ifndef:if not defined 除了某平台均存在 %PLATFORM%:平台名称
条件编译写法
1.仅出现在 App 平台下的代码
#ifdef APP-PLUS 需条件编译的代码 #endif
2.除了 H5 平台,其它平台均存在的代码
#ifndef H5 需条件编译的代码 #endif
3.在 H5 平台或微信小程序平台存在的代码(这里只有||,不可能出现&&,因为没有交集)
#ifdef H5 || MP-WEIXIN 需条件编译的代码 #endif
%PLATFORM%
可取值如下:
值 | 条件 |
---|---|
VUE3 | HBuilderX 3.2.0+ |
APP-PLUS | App |
APP-PLUS-NVUE或APP-NVUE | App nvue |
H5 | H5 |
MP-WEIXIN | 微信小程序 |
MP-ALIPAY | 支付宝小程序 |
MP-BAIDU | 百度小程序 |
MP-TOUTIAO | 字节跳动小程序 |
MP-QQ | QQ小程序 |
MP-KUAISHOU | 快手小程序 |
MP-360 | 360小程序 |
MP | 微信小程序/支付宝小程序/百度小程序/字节跳动小程序/QQ小程序/360小程序 |
QUICKAPP-WEBVIEW | 快应用通用(包含联盟、华为) |
QUICKAPP-WEBVIEW-UNION | 快应用联盟 |
QUICKAPP-WEBVIEW-HUAWEI | 快应用华为 |
支持的文件
.vue .js .css pages.json 各预编译语言文件,如:.scss、.less、.stylus、.ts、.pug
注意:
条件编译是利用注释实现的,在不同语法里注释写法不一样,js使用 // 注释
、css 使用 /* 注释 */
、vue/nvue 模板里使用 <!-- 注释 -->
;
条件编译APP-PLUS包含APP-NVUE和APP-VUE,APP-PLUS-NVUE和APP-NVUE没什么区别,为了简写后面出了APP-NVUE ;
使用条件编译请保证编译前和编译后文件的正确性,比如json文件中不能有多余的逗号;
VUE3 需要在项目的 manifest.json 文件根节点配置 "vueVersion" : "3"
官方示例:
示例,如下代码仅在 App 下出现:
示例,如下代码不会在 H5 平台上出现:
除了支持单个平台的条件编译外,还支持多平台同时编译,使用 || 来分隔平台名称。
示例,如下代码会在 App 和 H5 平台上出现:
组件的条件编译
<!-- #ifdef %PLATFORM% --> 平台特有的组件 <!-- #endif -->
示例,如下公众号关注组件仅会在微信小程序中出现:
<view> <view>微信公众号关注组件</view> <view> <!-- uni-app未封装,但可直接使用微信原生的official-account组件--> <!-- #ifdef MP-WEIXIN --> <official-account></official-account> <!-- #endif --> </view> </view>
样式的条件编译
注意: 样式的条件编译,无论是 css 还是 sass/scss/less/stylus 等预编译语言中,必须使用 /注释/ 的写法。
/* #ifdef %PLATFORM% */ 平台特有样式 /* #endif */
pages.json 的条件编译
下面的页面,只有运行至 App 时才会编译进去。
static 目录的条件编译
在不同平台,引用的静态资源可能也存在差异,通过 static 的的条件编译可以解决此问题,static 目录下新建不同平台的专有目录(目录名称同 %PLATFORM% 值域,但字母均为小写),专有目录下的静态资源只有在特定平台才会编译进去。
如以下目录结构,a.png 只有在微信小程序平台才会编译进去,b.png 在所有平台都会被编译。
┌─static │ ├─mp-weixin │ │ └─a.png │ └─b.png ├─main.js ├─App.vue ├─manifest.json └─pages.json
整体目录条件编译
如果想把各平台的页面文件更彻底的分开,也可以在uni-app项目根目录创建platforms目录,然后在下面进一步创建app-plus、mp-weixin等子目录,存放不同平台的文件。
注意
platforms目录下只支持放置页面文件(即页面vue文件),如果需要对其他资源条件编译建议使用static 目录的条件编译