uni-app条件编译 解决各端差异

跨端兼容

uni-app 已将常用的组件、JS API 封装到框架中,开发者按照 uni-app 规范开发即可保证多平台兼容,大部分业务均可直接满足。

但每个平台有自己的一些特性,因此会存在一些无法跨平台的情况。

  1. 大量写 if else,会造成代码执行性能低下和管理混乱。
  2. 编译到不同的工程后二次修改,会让后续升级变的很麻烦。

在 C 语言中,通过 #ifdef、#ifndef 的方式,为 windows、mac 等不同 os 编译不同的代码。 uni-app 参考这个思路,为 uni-app 提供了条件编译手段,在一个工程里优雅的完成了平台个性化实现。

条件编译各平台名称与写法

条件编译是用特殊的注释作为标记,在编译时根据这些特殊的注释,将注释里面的代码编译到不同平台。

写法:以 #ifdef#ifndef%PLATFORM% 开头,以 #endif 结尾。

1.#ifdef:if defined 仅在某平台存在
2.#ifndef:if not defined 除了某平台均存在
3.%PLATFORM%:平台名称

条件编译写法
%PLATFORM% 可取值如下:

生效条件
VUE3HBuilderX 3.2.0
APP-PLUSApp
APP-PLUS-NVUE或APP-NVUEApp nvue
H5H5
MP-WEIXIN微信小程序
MP-ALIPAY支付宝小程序
MP-BAIDU百度小程序
MP-TOUTIAO字节跳动小程序
MP-LARK飞书小程序
MP-QQQQ小程序
MP-KUAISHOU快手小程序
MP-360360小程序
MP微信小程序/支付宝小程序/百度小程序/字节跳动小程序/飞书小程序/QQ小程序/360小程序
QUICKAPP-WEBVIEW快应用通用(包含联盟、华为)
QUICKAPP-WEBVIEW-UNION快应用联盟
QUICKAPP-WEBVIEW-HUAWEI快应用华为

支持的文件

.vue
.js
.css
pages.json
各预编译语言文件,如:.scss、.less、.stylus、.ts、.pug

注意:

1.条件编译是利用注释实现的,在不同语法里注释写法不一样,js使用 // 注释、css 使用 /* 注释 */、vue/nvue 模板里使用 ;

2.条件编译APP-PLUS包含APP-NVUE和APP-VUE,APP-PLUS-NVUE和APP-NVUE没什么区别,为了简写后面出了APP-NVUE ;

3.使用条件编译请保证编译前和编译后文件的正确性,比如json文件中不能有多余的逗号;

4.VUE3 需要在项目的 manifest.json 文件根节点配置 “vueVersion” : “3”

API 的条件编译

// #ifdef  %PLATFORM%
平台特有的API实现
// #endif

示例,如下代码仅在 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>

样式的条件编译

/*  #ifdef  %PLATFORM%  */
平台特有样式
/*  #endif  */

注意: 样式的条件编译,无论是 css 还是 sass/scss/less/stylus 等预编译语言中,必须使用 /注释/ 的写法。

正确写法
在这里插入图片描述
错误写法
在这里插入图片描述

pages.json 的条件编译

下面的页面,只有运行至 App 时才会编译进去。
在这里插入图片描述
不同平台下的特有功能,以及小程序平台的分包,都可以通过 pages.json 的条件编译来更好地实现。这样,就不会在其它平台产生多余的资源,进而减小包体积。

json的条件编译,如不同平台的key名称相同,cli项目下开发者自己安装的校验器会报错,需自行关闭这些校验器对json相同key的校验规则。如果使用HBuilderX的校验器,无需在意此问题,HBuilderX的语法校验器为此优化过。

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 目录的条件编译

附上官方原文地址:uni-app

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你好!对于uni-app的适配和兼容问题,我可以给你一些建议。 首先,uni-app是基于Vue.js框架的跨平台开发框架,它可以同时开发小程序、H5、以及APP等多个平台。在适配方面,uni-app已经做了很多工作,使得开发者可以方便地编写一套代码,同时在不同平台上运行。但是仍然可能会遇到一些兼容性问题。 一些常见的适配和兼容问题包括: 1. 样式适配:不同平台的样式表现可能存在差异。你可以使用uni-app提供的`class`和`style`全局样式,根据不同平台设置不同的样式。 2. 组件适配:某些组件在小程序和H5平台上可能有不同的实现方式。你可以使用条件编译指令`<!-- #ifdef H5 -->`和`<!-- #ifndef H5 -->`来针对不同平台编写特定代码。 3. API适配:不同平台的API调用方式可能不同。你可以使用uni-app提供的内置API来实现跨平台兼容,或者使用条件编译指令来根据不同平台调用特定的API。 4. 图片适配:不同平台对图片格式和路径的要求可能不同。你可以使用uni-app提供的`@/static`路径来引用静态资源,并根据平台要求提供不同的格式。 5. 第三方插件兼容:某些第三方插件可能不支持所有平台。你可以在使用前检查插件文档,确认其支持的平台,并在不支持的平台上进行兼容处理。 总之,针对uni-app的适配和兼容问题,你可以通过使用uni-app提供的工具和特性,以及条件编译指令来进行处理。同时,建议在开发前了解各个平台的差异和要求,并在实际开发中进行测试和调试,以确保应用在不同平台上的正常运行。希望这些建议对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值