uni-app 认识条件编译,了解多端部署

news2024/12/26 13:07:42

一. 前言

在使用 uni-app 进行跨平台开发的过程中,经常会遇到需要针对不同平台或不同环境进行条件编译的情况。条件编译是一种在编译过程中根据指定条件选择不同代码路径的技术,可以帮助我们在不同平台或环境下编写不同的代码,以适应不同的平台实现逻辑。

在 uni-app 中,可以说条件编译是 uni-app 实现多端部署的核心思想,通过条件编译,我们可以根据当前的平台、环境或配置选项来控制代码的执行逻辑,从而实现定制化的开发需求。

在我之前的开发项目中,不止需要已有平台的条件编译,还涉及到自定义平台条件编译,以适应项目中同一套代码,多端部署的场景。

通过本篇文章,你将学习到以下知识:

接下来我将详细介绍 uni-app 中条件编译的使用和自定义平台,帮助大家更好地利用条件编译优化自己的应用开发过程。

二. 什么是编译器

uni-app 为什么能实现一套代码、多端运行,多端部署的功能?其最核心的功能是通过 编译器 + 运行时 实现的,我梳理了一下,如下图整体流程图所示:

好家伙,不看不知道,一看吓一跳,一堆小程序平台??

1. 编译器和运行时

编译器:将 uni-app 统一代码编译生成每个平台支持的特有代码;如:在小程序平台,编译器将 .vue 文件拆分生成 wxmlwxssjs 等代码。

运行时:动态处理数据绑定、事件代理,保证 Vue 和平台宿主数据的一致性。

2. 编译器的实现逻辑

uni-app 项目根据所依赖的 Vue 版本不同,编译器的实现也不同,目前 uni-app 的代码支持 Vue 2 和 Vue 3 两种语言版本。

Vue 2 版本的 uni-app 编译器基于 Wepback 实现,而 Vue 3 版本的 uni-app 编译器基于 Vite 实现,编译速度更快。

可以通过 manifest.json 文件中切换 Vue 的使用版本,如下图所示:

3. 注意事项

初始化 uni-app 项目有两种方式,通过 HBuilderX 创建和使用 cli 方式创建,下面来说一下这两种创建方式在编译器方面的使用差异:

  • 使用 cli 方式创建的项目,编译器安装在项目下,编译器不会跟随 HBuilderX 升级。如需升级编译器,可以参考:更新依赖到指定版本。

  • 使用 HBuilderX 创建的项目,编译器在 HBuilderX 的安装目录下的 plugin 目录,随着 HBuilderX 的升级会自动升级编译器。

因此,为了避免出现一些更新问题,建议使用 HBuilderX 直接创建项目,便于适时更新到最新版的编译器,优化一些 bug

提示:经常跟随官方更新也会有问题,有些旧版本的代码在新版上有可能会不兼容!注意可能有坑!

三. 条件编译

uni-app 已经将常用的组件、API 封装到框架中,我们可以按照 uni-app 规范开发即可保证多平台兼容,大部分业务均可直接满足,但每个平台有自己的一些特性,因此必然会存在一些无法跨平台的情况。

详细了解可参见 uni-app 的相关文档说明:

  • uni-app 组件使用手册icon-default.png?t=O83Ahttps://uniapp.dcloud.net.cn/component/

  • uni-app API 使用手册icon-default.png?t=O83Ahttps://uniapp.dcloud.net.cn/api/

当我们在写代码涉及到多平台时,由于每个平台的实现代码可能有所不同,因此如果是大量写 if else,会造成代码执行性能低下和管理混乱,编译到不同的工程后二次修改,会让后续升级变的很麻烦。

由以上这个背景, uni-app 参考在 C 语言中的一些实践经验,为其提供了类似的条件编译手段,通过 #ifdef#ifndef 的方式,为小程序端、Web 端、App 端 等不同客户端编译不同的代码,在一个工程里优雅的完成了平台个性化实现。

那么接下来我们看一下什么是条件编译及其使用方法?

1. 什么是条件编译

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

条件判断规则

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

完整的判断方式为:

#ifdef  %PLATFORM%
此部分为实现对应平台的代码
#endif

参数说明:

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

2. 支持的平台

目前 uni-app 条件编译所支持的平台大概有 24 个,分别如下:

引擎+编译器相关
生效条件生效条件
VUE3用于区分 vue2 和 3VUE2用于区分 vue2 和 3
UNI-APP-X用于区分是否是 uni-app x 项目uniVersion用于区分编译器的版本
APP 相关
生效条件生效条件
APPAppAPP-PLUS编译为 App 时
APP-PLUS-NVUE 或 APP-NVUEApp nvue 页面APP-ANDROIDApp Android 平台
APP-IOSApp iOS 平台
Web 相关
生效条件生效条件
H5H5WEBweb
小程序相关
生效条件生效条件
MP包括所有小程序MP-WEIXIN微信小程序
MP-ALIPAY支付宝小程序MP-BAIDU百度小程序
MP-TOUTIAO抖音小程序MP-LARK飞书小程序
MP-QQQQ 小程序MP-KUAISHOU快手小程序
MP-JD京东小程序MP-360360 小程序
快应用相关
生效条件
QUICKAPP-WEBVIEW包括所有快应用
QUICKAPP-WEBVIEW-UNION快应用联盟
QUICKAPP-WEBVIEW-HUAWEI快应用华为

3. 支持的文件

我们主要可以在以下的文件中使用条件编译,如下所示:

  • 主文件:包括 .vue/.nvue/.uvue 文件

  • API 文件:包括 .js/.uts 文件

  • 样式文件:包括 css 文件和各预编译语言文件,如:.scss、.less、.stylus、.ts、.pug 文件

  • 配置文件:pages.json 文件

4. 注意事项

关于条件编译,有以下几个注意事项需要在编程的过程中重点关注一下:

  1. 条件编译是利用注释实现的,在不同语法里注释写法不一样,不要使用错误的注释编写代码,可能会造成一些问题,具体注释形式如下所示:

  • 在 js/uts 文件中, 使用 // 注释

  • 在 css 文件中, 使用 /* */ 注释

  • 在 vue/nvue/uvue 模板里使用 <!-- 注释 -->

四. 总结

条件编译是 uni-app 实现一套代码、多端运行,多端部署的核心思想,uni-app 在条件编译方面不止是处理 js,任何代码都可以多端条件编译,因此可以大大降低了在实际项目的多端开发时的繁琐问题。

五. 资源文档

  • uni-app 组件使用手册

  • uni-app API 使用手册

如果您感觉文章还不错,关注一下再走吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS Next原创项目

学友市集 HarmonyOS毕设,项目完整,代码原创,可接毕设 项目展示 项目简介 学友集市是一款基于HarmonyOS Next开发的二手交易平台,适配HarmonyOS5.0&#xff0c;采用前后端分离架构&#xff0c;致力于为用户提供安全、便捷、高品质的二手商品交易服务。平台整合了华为云认证服…

现代密码学

概论 计算机安全的最核心三个关键目标&#xff08;指标&#xff09;/为&#xff1a;保密性 Confidentiality、完整性 Integrity、可用性 Availability &#xff0c;三者称为 CIA三元组 数据保密性&#xff1a;确保隐私或是秘密信息不向非授权者泄漏&#xff0c;也不被非授权者使…

深度学习实战人脸识别

文章目录 前言一、人脸识别一般过程二、人脸检测主流算法1. MTCNN2. RetinaFace3. CenterFace4. BlazeFace5. YOLO6. SSD7. CascadeCNN 三、人脸识别主流算法1.deepface2.FaceNet3.ArcFace4.VGGFace5.DeepID 四、人脸识别系统实现0.安装教程与资源说明1. 界面采用PyQt5框架2.人…

51c自动驾驶~合集31

我自己的原文哦~ https://blog.51cto.com/whaosoft/12121357 #大语言模型会成为自动驾驶的灵丹妙药吗 人工智能&#xff08;AI&#xff09;在自动驾驶&#xff08;AD&#xff09;研究中起着至关重要的作用&#xff0c;推动其向智能化和高效化发展。目前AD技术的发展主要遵循…

2023年3月GESPC++一级真题解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 题目123456789101112131415答案BAACBDDAADBCDBC 1.以下不属于计算机输入设备的有&#xff08; &#xff09;。 A &#xff0e;键盘 B &#xff0e;音箱 C &#xff0e;鼠标 D &#xff0e;传感器 【答案】 …

深度学习实验十二 卷积神经网络(3)——基于残差网络实现手写体数字识别实验

目录 一、模型构建 1.1残差单元 1.2 残差网络的整体结构 二、统计模型的参数量和计算量 三、数据预处理 四、没有残差连接的ResNet18 五、带残差连接的ResNet18 附&#xff1a;完整的可运行代码 实验大体步骤&#xff1a; 先前说明&#xff1a; 上次LeNet实验用到的那…

第10章JavaScript的应用

10.1 JavaScript概述 10.1.1 JavaScript简介 10.1.1.1 简单性 10.1.1.2 动态性 10.1.1.3 跨平台性 10.1.1.4 安全性 10.1.1.5 基于对象的语言 10.1.2 JavaScript入门案例 10.1.3 JavaScript放置的位置 10.1.3.1 head标记中的脚本 代码 <!DOCTYPE html> <ht…

Linux操作系统:进程控制_进程的创建、终止、等待

一、进程创建 这一块我们在前篇都已经讲过&#xff0c;第一部分就简单带大家回顾一下之前的知识。 1.1 fork函数初识 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include<unistd.h>…

MySQL数据库学习(持续更新ing)

1. 什么是数据库&#xff1f;什么是数据库管理系统&#xff1f;什么是SQL&#xff1f;他们之间的关系是什么&#xff1f; 数据库&#xff1a;Database&#xff0c; 简称DB。按照一定格式存储数据&#xff0c;一些文件的组合。 数据库管理系统&#xff1a;DataBaseManagement&…

电脑自动关机时间如何定?Wise Auto Shutdown 设置关机教程

在日常使用电脑的过程中&#xff0c;有时我们需要让电脑在特定的时间自动关机&#xff0c;比如在下载大文件完成后、执行长时间的任务结束时&#xff0c;或者只是单纯想在某个预定时间让电脑自动关闭以节省能源。这时候&#xff0c;Wise Auto Shutdown 这款软件就能派上大用场了…

【LeetCode热题100】队列+宽搜

这篇博客是关于队列宽搜的几道题&#xff0c;主要包括N叉树的层序遍历、二叉树的锯齿形层序遍历、二叉树最大宽度、在每个数行中找最大值。 class Solution { public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if(!root) …

【数据结构】二叉树(2)

目录 1. 二叉树的遍历 前序遍历 中序遍历 后序遍历 2. 计算二叉树中的节点个数 3. 计算二叉树中叶子节点个数 4. 计算二叉树的深度 5. 计算二叉树第k层节点个数 6. 二叉树基础练习 7. 二叉树的创建 8. 二叉树的销毁 9. 层序遍历 10. 判断二叉树是否为完全二叉树 1…

mysql | limit X, -1 早已不可使用,本身也是一个错误

一、背景 需求&#xff1a;使用 mysql 时&#xff0c;需要获取第 X 条数据之后的所有数据。 这时&#xff0c;首先想到的就是利用 limit 来实现。 早期的部分文章或者资料中&#xff0c;提到可以使用&#xff1a; limit X,-1 例如&#xff0c;获取第一条后的所有数据&…

C++:探索AVL树旋转的奥秘

文章目录 前言 AVL树为什么要旋转&#xff1f;一、插入一个值的大概过程1. 插入一个值的大致过程2. 平衡因子更新原则3. 旋转处理的目的 二、左单旋1. 左单旋旋转方式总处理图2. 左单旋具体会遇到的情况3. 左单旋代码总结 三、右单旋1. 右单旋旋转方式总处理图2. 右单旋具体会遇…

开发一套ERP 第二弹

前后端分离 一起做,发现会有点问题,有时候分不太清楚 可以使用 naive ui admin 作为前端 menu 的配置在mock 中,在mock 中修改为自己需要的选项即可,mock 中返回的是前端需要测试的数据接口 同理自己需要的API也可以定义到 api 中&#xff0c;然后在mock 中配置返回的结果;然后…

cangjie (仓颉) vscode环境搭建

sdk下载 下载中心-仓颉编程语言官网 可选择半年更新版&#xff0c;不用申请。目前版本&#xff1a;0.53.13 &#xff0c;选择不同平台压缩包下载解压到任意位置即可 补充下载&#xff0c;vscode插件解压后&#xff0c;在vscode扩展中选择从vsix安装&#xff0c;安装后新增名为…

ES6 、ESNext 规范、编译工具babel

ES6 、ESNext 规范、编译工具简介 ES6ES&#xff08;ECMAScript&#xff09; vs JS常量进一步探讨 obj对象的扩展面试&#xff1a;使对象属性也不能更改——Object.freeze(obj) 解构deconstruction变量的解构赋值&#xff1a;数组解构赋值&#xff1a;对象解构赋值&#xff1a;…

SQL 语句执行计划中的连接方式

SQL 语句执行计划中的连接方式 join操作 join操作基本分为3大类&#xff1a;外连接&#xff08;细分为&#xff1a;左连接&#xff08;Left outer join/ left join&#xff09;、右连接&#xff08;right outer join/ right join&#xff09;、全连接&#xff08;full outer …

数据结构第一讲

数据结构定义 算法的定义 什么是好算法&#xff1f; 空间复杂度 时间复杂度 例子1 打印1到N之间的正整数 有递归和循环两种方法实现。 但是在数字变大后&#xff0c;递归的方法会导致内存占用过多而崩溃。 而循环则不会 例子2 写程序给定多项式在X处的值 从里往外算的算…

--- 文件IO java ---

文本文件和二进制文件 文件再底层其实就是以一段二进制数据的形式储存的&#xff0c;当我用记事本打开文件时&#xff0c;有些文件会出现乱码&#xff0c;这就是二进制文件&#xff0c;而有一些文件是特殊的&#xff0c;他以特定的编码方式&#xff08;比如ascll&#xff09;可…