UniApp 条件编译与跨平台
跨平台兼容
平台差异
- H5 端:有跨域限制;支持
v-html;导航栏和 tabbar 是 div 模拟 - 小程序端:强制 https;需配置服务器白名单;不支持
v-html - App 端:iOS 隐私和虚拟支付控制严格;Android 国产 rom 兼容性差异
传统 Web 开发注意
- JS:非 H5 端不能使用 document、window、localstorage 等浏览器对象。App 端通过 renderjs 操作
- Tag:div → view,span → text,a → navigator,img → image
- CSS:推荐 flex 布局;单位使用 rpx
H5 开发注意
- 发行路径配置 manifest.json → h5 → router → base
- 第三方 JS 引入:npm 或 manifest.json 的 template 配 html 模板
--window-top和--window-bottom解决导航栏定位问题- 组件内不支持 onLoad、onShow 等页面生命周期
小程序开发注意
- vendor.js 过大:运行时勾选压缩代码,或使用分包优化
- 自定义组件名称不能以 wx 开头
平台判断
编译期判断(条件编译)
js
// #ifdef H5
alert('只有h5平台才有alert方法')
// #endif// #ifdef H5
alert('只有h5平台才有alert方法')
// #endif运行期判断
js
switch (uni.getSystemInfoSync().platform) {
case 'android': console.log('运行Android上'); break
case 'ios': console.log('运行iOS上'); break
default: console.log('运行在开发者工具上')
}switch (uni.getSystemInfoSync().platform) {
case 'android': console.log('运行Android上'); break
case 'ios': console.log('运行iOS上'); break
default: console.log('运行在开发者工具上')
}条件编译
条件编译是用特殊注释作为标记,编译时根据注释将代码编译到不同平台。
语法
#ifdef:if defined 仅在某平台存在#ifndef:if not defined 除某平台均存在
平台参数
| 值 | 生效条件 |
|---|---|
| VUE3 | Vue3 |
| APP-PLUS | App |
| APP-PLUS-NVUE / APP-NVUE | App nvue |
| APP-ANDROID | App Android(仅 uts) |
| APP-IOS | App iOS(仅 uts) |
| H5 | H5 |
| MP-WEIXIN | 微信小程序 |
| MP-ALIPAY | 支付宝小程序 |
| MP-BAIDU | 百度小程序 |
| MP-TOUTIAO | 字节跳动小程序 |
| MP-LARK | 飞书小程序 |
| MP-QQ | QQ 小程序 |
| MP-KUAISHOU | 快手小程序 |
| MP-JD | 京东小程序 |
| MP-360 | 360 小程序 |
| MP | 所有小程序 |
| QUICKAPP-WEBVIEW | 所有快应用 |
API 条件编译
js
// #ifdef APP-PLUS
平台特有的API实现
// #endif
// #ifdef H5 || MP-WEIXIN
多平台支持
// #endif// #ifdef APP-PLUS
平台特有的API实现
// #endif
// #ifdef H5 || MP-WEIXIN
多平台支持
// #endif组件条件编译
html
<!-- #ifdef MP-WEIXIN -->
<official-account></official-account>
<!-- #endif --><!-- #ifdef MP-WEIXIN -->
<official-account></official-account>
<!-- #endif -->样式条件编译
css
/* #ifdef APP-PLUS */
平台特有样式
/* #endif *//* #ifdef APP-PLUS */
平台特有样式
/* #endif */必须使用
/* */注释写法
pages.json 条件编译
json
{
"pages": [
/* #ifdef APP-PLUS */
{ "path": "pages/app-only-page" }
/* #endif */
]
}{
"pages": [
/* #ifdef APP-PLUS */
{ "path": "pages/app-only-page" }
/* #endif */
]
}static 目录条件编译
┌─static
│ ├─mp-weixin
│ │ └─a.png // 仅微信小程序
│ └─b.png // 所有平台┌─static
│ ├─mp-weixin
│ │ └─a.png // 仅微信小程序
│ └─b.png // 所有平台整体目录条件编译
在根目录创建 platforms 目录,下建 app-plus、mp-weixin 等子目录。
宽屏适配
leftWindow / rightWindow / topWindow
在 pages.json 中配置:
json
{
"topWindow": {
"path": "responsive/top-window.vue",
"style": { "height": "44px" }
},
"leftWindow": {
"path": "responsive/left-window.vue",
"style": { "width": 300 }
},
"rightWindow": {
"path": "responsive/right-window.vue",
"style": { "width": "calc(100vw - 400px)" },
"matchMedia": { "minWidth": 768 }
}
}{
"topWindow": {
"path": "responsive/top-window.vue",
"style": { "height": "44px" }
},
"leftWindow": {
"path": "responsive/left-window.vue",
"style": { "width": 300 }
},
"rightWindow": {
"path": "responsive/right-window.vue",
"style": { "width": "calc(100vw - 400px)" },
"matchMedia": { "minWidth": 768 }
}
}适用场景:新闻列表(左侧列表 + rightWindow 详情)、PC Admin(leftWindow 导航)。
match-media 组件
媒体查询适配组件,满足条件时展示,否则隐藏:
html
<match-media :min-width="768">
<view>宽屏下显示</view>
</match-media><match-media :min-width="768">
<view>宽屏下显示</view>
</match-media>rpx 在宽屏下的控制
在 pages.json 中限制 rpx 最大适配宽度:
json
{
"globalStyle": {
"rpxCalcMaxDeviceWidth": 960,
"rpxCalcBaseDeviceWidth": 375,
"rpxCalcIncludeWidth": 750
}
}{
"globalStyle": {
"rpxCalcMaxDeviceWidth": 960,
"rpxCalcBaseDeviceWidth": 375,
"rpxCalcIncludeWidth": 750
}
}
Cao Note