uni-app 认识条件编译,了解多端部署
一. 前言
在使用 uni-app 进行跨平台开发的过程中,经常会遇到需要针对不同平台或不同环境进行条件编译的情况。条件编译是一种在编译过程中根据指定条件选择不同代码路径的技术,可以帮助我们在不同平台或环境下编写不同的代码,以适应不同的平台实现逻辑。
在 uni-app 中,可以说条件编译是 uni-app 实现多端部署的核心思想,通过条件编译,我们可以根据当前的平台、环境或配置选项来控制代码的执行逻辑,从而实现定制化的开发需求。
在我之前的开发项目中,不止需要已有平台的条件编译,还涉及到自定义平台条件编译,以适应项目中同一套代码,多端部署的场景。
通过本篇文章,你将学习到以下知识:
接下来我将详细介绍 uni-app 中条件编译的使用和自定义平台,帮助大家更好地利用条件编译优化自己的应用开发过程。
二. 什么是编译器
uni-app 为什么能实现一套代码、多端运行,多端部署的功能?其最核心的功能是通过 编译器 + 运行时 实现的,我梳理了一下,如下图整体流程图所示:
好家伙,不看不知道,一看吓一跳,一堆小程序平台??
1. 编译器和运行时
编译器:将 uni-app 统一代码编译生成每个平台支持的特有代码;如:在小程序平台,编译器将 .vue
文件拆分生成 wxml
、wxss
、js
等代码。
运行时:动态处理数据绑定、事件代理,保证 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 组件使用手册
https://uniapp.dcloud.net.cn/component/
-
uni-app API 使用手册
https://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 和 3 | VUE2 | 用于区分 vue2 和 3 |
UNI-APP-X | 用于区分是否是 uni-app x 项目 | uniVersion | 用于区分编译器的版本 |
APP 相关
值 | 生效条件 | 值 | 生效条件 |
---|---|---|---|
APP | App | APP-PLUS | 编译为 App 时 |
APP-PLUS-NVUE 或 APP-NVUE | App nvue 页面 | APP-ANDROID | App Android 平台 |
APP-IOS | App iOS 平台 |
Web 相关
值 | 生效条件 | 值 | 生效条件 |
---|---|---|---|
H5 | H5 | WEB | web |
小程序相关
值 | 生效条件 | 值 | 生效条件 |
---|---|---|---|
MP | 包括所有小程序 | MP-WEIXIN | 微信小程序 |
MP-ALIPAY | 支付宝小程序 | MP-BAIDU | 百度小程序 |
MP-TOUTIAO | 抖音小程序 | MP-LARK | 飞书小程序 |
MP-QQ | QQ 小程序 | MP-KUAISHOU | 快手小程序 |
MP-JD | 京东小程序 | MP-360 | 360 小程序 |
快应用相关
值 | 生效条件 |
---|---|
QUICKAPP-WEBVIEW | 包括所有快应用 |
QUICKAPP-WEBVIEW-UNION | 快应用联盟 |
QUICKAPP-WEBVIEW-HUAWEI | 快应用华为 |
3. 支持的文件
我们主要可以在以下的文件中使用条件编译,如下所示:
-
主文件:包括 .vue/.nvue/.uvue 文件
-
API 文件:包括 .js/.uts 文件
-
样式文件:包括 css 文件和各预编译语言文件,如:.scss、.less、.stylus、.ts、.pug 文件
-
配置文件:pages.json 文件
4. 注意事项
关于条件编译,有以下几个注意事项需要在编程的过程中重点关注一下:
-
条件编译是利用注释实现的,在不同语法里注释写法不一样,不要使用错误的注释编写代码,可能会造成一些问题,具体注释形式如下所示:
-
在 js/uts 文件中, 使用
//
注释 -
在 css 文件中, 使用
/* */
注释 -
在 vue/nvue/uvue 模板里使用
<!-- 注释 -->
四. 总结
条件编译是 uni-app 实现一套代码、多端运行,多端部署的核心思想,uni-app 在条件编译方面不止是处理 js,任何代码都可以多端条件编译,因此可以大大降低了在实际项目的多端开发时的繁琐问题。
五. 资源文档
-
uni-app 组件使用手册
-
uni-app API 使用手册
如果您感觉文章还不错,关注一下再走吧!
相关文章:

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

SPA 首屏加载慢的原因及解决方案:结合实际项目的详细讲解
在现代前端开发中,单页面应用程序 (SPA) 的首屏加载速度是用户体验的关键因素之一。首屏加载慢会直接影响用户对网站的第一印象,甚至导致用户流失。因此,优化首屏加载速度是每个前端开发者需要重点关注的内容。 1. 什么是首屏加载? 首屏加载指的是用户访问一个网站或应用…...

vue3+ts el-tabel 搜索组件
爷爷页面 <template> <searchstyle"z-index: 9999":options"options"placeholder"请选择时间,或输入名称、单选、多个勾选、模糊查询"search"onSearch"></search> </template> <script lan…...

leetcode 排序算法汇总
快速排序 def quicksort(arr): if len(arr) < 1: return arr else: pivot arr[len(arr) // 2] # 选择中间值作为基准 left [x for x in arr if x < pivot] # 小于基准的放左边 middle [x for x in arr if x pivot] # 等…...

【C】错误的变量定义导致sprintf()输出错误
问题描述 刚刚写一个用AT指令透传相关的函数,需要用到sprintf()拼接字符串。 结果发现sprintf()拼接出来的内容是错误的,简化后的代码如下: const char AT_CIPSEND_FIX_LENGTH_HEADER[11] "ATCIPSEND"; // 错误的࿰…...

python基础导包
Python项目代码结构与导包详解 目录 引言 Python项目的基本结构 2.1 单文件项目2.2 多模块项目2.3 包结构项目2.4 示例项目结构 模块与包 3.1 模块(Module)3.2 包(Package)3.3 子包(Subpackage) 导包&a…...

【含开题报告+文档+PPT+源码】基于SSM的电影数据挖掘与分析可视化系统设计与实现
开题报告 随着互联网的普及和数字娱乐产业的蓬勃发展,电影作为一种重要的娱乐方式,已经深入人们的日常生活。然而,面对海量的电影资源,用户在选择观影内容时常常感到困惑和无所适从。传统的电影推荐方式,如人工筛选、…...

strlwr(arr);的模拟实现(c基础)
hi , I am 36 适合对象c语言初学者 strlwr(arr);函数是把arr数组变为小写字母,并返回arr 链接介绍一下strlwr(arr);(c基础)-CSDN博客 下面进行My__strlwr(arr);模拟实现 #include<stdio.h> //返回值为arr(地址),于是用指针变量,原数组为字符型…...

LCR 002. 二进制求和
一.题目: . - 力扣(LeetCode) 二.原始解法-利用二进制逢二进一: 自己实现的时候忽略了一点,就是进位是会滚动的,不是进位一次就结束,很复杂跳过 三.正确解法及好的讲解、力扣解法参考…...

MySQL-C3P0连数据库报错问题
MySQL-C3P0连数据库报错问题 No suitable driver found for 首先检查MySQL数据库版本与依赖版本是否一致,如8.0.40数据库,需要使用8.0以上的依赖。检查c3p0的依赖版本,需要符合系统应用特性检查c3p0.xml配置文件的地址,需要在reso…...

云计算期中作业:Spark机器学习问题解决
在原有pdf教程教程上,做一个补充 idea内搭建环境 导入依赖 就直接利用之前的作业工程项目里直接写,所以依赖基本上不用再导入了,如果要导入,看自己依赖的版本号,不要直接复制教程,比如我的: …...

计算机网络socket编程(6)_TCP实网络编程现 Command_server
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络socket编程(6)_TCP实网络编程现 Command_server 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论…...

RabbitMQ 集群
文章目录 前言单机多节点搭建集群创建RabbitMQ节点停止服务并重置将节点加入到集群中查看集群状态宕机 结论 前言 RabbitMQ 作为消息中间件,可以与多个生产者和消费者进行绑定,但是如何只有一台 RabbitMQ 服务的话,那么这个 RabbitMQ 就需要…...

从零开始:使用 Spring Boot 开发图书管理系统
如何利用是springboot搭建一个简单的图书管理系统,下面让我们一起来看看吧 文章目录 项目结构1. 主类 LibraryApplication.java功能与注意事项: 2. 模型类 Book.java功能与注意事项: 3. 数据仓库接口 BookRepository.java功能与注意事项&…...

速盾:海外服务器使用CDN加速有什么优势?
CDN(Content Delivery Network)是指一种分布式网络架构,将内容分发到全球多个节点服务器上,使用户能够就近获取所需内容。海外服务器使用CDN加速,具有以下几个优势: 提高访问速度:CDN将内容复制…...

(二)手势识别——动作模型训练【代码+数据集+python环境(免安装)+GUI系统】
(二)手势识别——动作模型训练【代码数据集python环境(免安装)GUI系统】 背景意义 随着互联网的普及和机器学习技术的进一步发展,手势识别技术开始使用深度学习等方法进行手势识别,如Convolutional Neural…...

window系统下使用open-webui+ollama部署大模型
前面一篇博文中讲述了window下用ollama+AnythingLLM部署本地知识库,但是个人感觉anythingllm不是很好用,还不如直接用cmd窗口,而且仅能本机使用,如果想部署到服务器上面供其他人访问,完全不可行,但是使用open-webui+ollama或者独立的open-webui救可以实现。 使用open-web…...

一加ACE 3 Pro手机无法连接电脑传输文件问题
先说结论:OnePlus手机无法连接电脑传输数据的原因,大概率是一加数据线的问题。尝试其他手机品牌的数据线(比如华为),再次尝试。 连接电脑方法: 1 打开开发者模式(非必要操作) 进入…...

因果机器学习EconML | 客户细分案例——基于机器学习的异质性处理效果估计
机器学习的最大承诺之一是在众多应用领域中实现决策自动化。在大多数数据驱动的个性化决策场景中出现的一个核心问题是对异质性处理效果的估计:作为处理样本的一组可观察特征的函数,干预对感兴趣结果的影响是什么?例如,这个问题出…...

找到最大“葫芦”组合
文章目录 问题描述解题思路分析1. 数据预处理2. 特殊情况处理3. 普通情况计算4. 结果输出 Java代码实现复杂度分析与优化 在经典德州扑克中,“葫芦”是一种较强的牌型。它由五张牌组成,其中三张牌面值相同,另外两张牌面值也相同。本文将探讨一…...

shell(9)完结
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...

【计算机网络】多路转接之select
系统提供select()来实现多路转接 IO 等 拷贝 -> select()只负责等待,可以一次等待多个fd select()本身没有数据拷贝的能力,拷贝要read()/write()来完成 一、select的使用 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exc…...

数据库-基础理论
文章目录 前言一、ORM框架二、ACID原则三、事务Transaction四、N1问题五、Normalization三范式六、FMEA方法论(Failure Mode and Effects Analysis)七、Profiling和PerformanceSchema查询分析 前言 基础理论 ORM框架、ACID原则、事务Transaction、N1问…...

Linux——1_系统的延迟任务及定时任务
系统的延迟任务及定时任务 在系统中我们的维护工作大多数时在服务器行对闲置时进行 我们需要用延迟任务来解决自动进行的一次性的维护 延迟任务时一次性的,不会重复执行 当延迟任务产生输出后,这些输出会以邮件的形式发送给延迟任务发起者 在RHEL9中…...

C++ 矩阵旋转
【问题描述】 编写一个程序,读入一个矩阵,输出该矩阵以第一行第一列数字为中心,顺时针旋转90度后的新矩阵,例如: 输入的矩阵为: 1 2 3 4 5 6 顺时针旋转90度后输出的矩阵为: 4 1 5 2 6 3 【输入…...

Docker学习笔记整理
这周不知道写点啥内容做个分享,但还是秉持学会分享的精神,粗略放一些Docker相关的问题和解答吧,后面有机会再补补再深挖深挖o(>﹏<)o 1. 容器VS虚拟机 虚拟机是一种带环境安装的解决方案(资源完全隔离),有以下缺…...

计算机组成原理期末试题三(含答案)
本科生期末试卷 三 一.选择题(每小题1分,共10分) 1.冯诺依曼机工作的基本方式的特点是______。 A 多指令流单数据流 B 按地址访问并顺序执行指令 C 堆栈操作 D 存贮器按内容选择地址 2.在机器数______中&a…...

django+boostrap实现注册
一、django介绍 Django 是一个高级的 Python 网络框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django 负责处理网站开发中麻烦的部分,因此你可以专注于编写应用程序,而无需重新开发。 它是免费和开源的&#x…...

C++初阶——类和对象(下)
目录 1、再探构造函数——初始化列表 2、类型转换 3、static成员 4、友元 5、内部类 6、匿名对象 7、对象拷贝时编译器的优化(了解) 1、再探构造函数——初始化列表 1. 构造函数初始化除了使用函数体内赋值,还有一种方式——初始化列表, 初始化列…...

趋势洞察|AI 能否带动裸金属 K8s 强势崛起?
随着容器技术的不断成熟,不少企业在开展私有化容器平台建设时,首要考虑的问题就是容器的部署环境——是采用虚拟机还是物理机运行容器?在往期“虚拟化 vs. 裸金属*”系列文章中,我们分别对比了容器部署在虚拟化平台和物理机上的架…...