uni-app 组成和跨端原理 【跨端开发系列】

news2024/12/23 10:25:24

 🔗 uniapp 跨端开发系列文章:🎀🎀🎀

  1. uni-app 组成和跨端原理    【跨端开发系列】 
  2. uni-app 各端差异注意事项 【跨端开发系列】
  3. uni-app 离线本地存储方案 【跨端开发系列】
  4. uni-app UI库、框架、组件选型指南 【跨端开发系列】
  5. uni-app 蓝牙开发 【特别专题】
  6. uni-app 导航栏开发指南 【跨端开发系列】
  7. uni-app 原生控件层级过高无法覆盖的解决方案 【跨端开发系列】
  8. uni-app 设置缓存过期时间【跨端开发系列】

一、介绍 🎯

uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。

uni-app在开发者数量、案例、跨端抹平度、扩展灵活性、性能体验、周边生态、学习成本、开发成本等8大关键指标上拥有更强的优势。

二、功能框架图 📋

从下面 uni-app 功能框架图可看出, uni-app 在跨平台的过程中,不牺牲平台特色,可优雅的调用平台专有能力,真正做到海纳百川、各取所长。

三、基本语言和开发规范 📜

 uni-app 代码编写,基本语言包括 js vue css  以及 ts scss css 预编译器。

app 端,还支持原生渲染的 nvue,以及可以编译为 kotlin swift  的 uts。

DCloud 还提供了使用 js 编写服务器代码的 uniCloud云引擎 。所以只需掌握 js ,你可以开发web、Android、iOS、各家小程序以及服务器等全栈应用。

为了实现多端兼容,综合考虑编译速度、运行性能等因素, uni-app 约定了如下开发规范:

  • 页面文件遵循 Vue 单文件组件 (SFC) 规范,即每个页面是一个 .vue文件 
  • 组件标签靠近小程序规范,详见 uni-app 组件规范 
  • 接口能力(JS API)靠近小程序规范,但需将前缀 wxmy 等替换为 uni ,详见uni-app接口规范
  • 数据绑定及事件处理同 Vue.js 规范,同时补充了应用生命周期及页面的生命周期
  • 如需兼容 app-nvue 平台,建议使用 flex 布局进行开发

uni-app 分 编译器 和  运行时 runtime。uni-app能实现一套代码、多端运行,是通过这2部分配合完成的。

编译器将开发者的代码进行编译,编译的输出物由各个终端的 runtime 进行解析,每个平台(Web、Android App、iOS App、各家小程序)都有各自的 runtime

四、编译器 🛠️

  • 编译器运行在电脑开发环境。一般是内置在 HBuilderX 工具中,也可以使用 独立的 cli 版。
  • 开发者按uni-app规范编写代码,由编译器将开发者的代码编译生成每个平台支持的特有代码
    • web 平台,将.vue文件编译为 js 代码。与普通的 vue cli 项目类似
    • 微信小程序 平台,编译器将 .vue 文件拆分生成 wxml、wxss、js 等代码
    • app 平台,将.vue文件编译为 js 代码。进一步,如果涉及 uts 代码:
      • Android 平台,将.uts 文件编译为 kotlin 代码
      • iOS平台,将 .uts 文件编译为 swift 代码
  • 编译器分vue2版和vue3版
    • vue2 版:基于 webpack 实现。
    • vue3 版:基于 Vite 实现,性能更快。
  • 编译器支持条件编译,即可以指定某部分代码只编译到特定的终端平台。从而将公用和个性化融合在一个工程中。
// #ifdef  App
console.log("这段代码只有在App平台才会被编译进去。非App平台编译后没有这段代码")
// #endif

五、运行时(runtime)⚙️

 runtime 不是运行在电脑开发环境,而是运行在真正的 终端 上。

uni-app 在每个平台(Web、Android App、iOS App、各家小程序)都有各自的 runtime 。这是一个比较庞大的工程。

  • 小程序端 ,uni-app 的 runtime,主要是一个小程序版的 vue runtime ,页面路由、组件、api等方面基本都是转义。
  • web端 ,uni-app 的 runtime 相比普通的 vue项目,多了一套ui库、页面路由框架、和uni对象(即常见API封装)。
  • App端 ,uni-app 的 runtime更复杂,可以先简单理解为DCloud也有一套小程序引擎,打包app时将开发者的代码和DCloud的小程序打包成了 apk ipa 。当然,事实上DCloud确实有小程序引擎产品,供原生应用实现小程序化。

 uni-app runtime 包括3部分:基础框架组件API 。

  1. 基础框架
    • 包括语法、数据驱动、全局文件、应用管理、页面管理、js引擎、渲染和排版引擎等
    • 在 web 和小程序上,不需要uni-app提供js引擎和排版引擎,直接使用浏览器和小程序的即可。但 app 上需要 uni-app 提供。
    • App的 js引擎:App-Android上,uni-app 的 js 引擎是 v8 ,App-iOS是 jscore
    • App的渲染引擎:同时提供了2套渲染引擎, .vue 页面文件由 webview 渲染,原理与小程序相同; .nvue 页面文件由原生渲染,原理与 react native 相同。开发者可以根据需要自主选择渲染引擎。
  2. 组件
    • runtime中包括的组件只有基础组件,如<view><button>等。扩展组件不包含在uni-app的runtime中,而是下载到用户的项目代码中。(这些组件都是vue组件)
    • 为了降低开发者的学习成本,uni-app的内置基础组件命名规范与小程序基本相同
    • 这几十个组件不管在哪个平台,已被处理为均有一致表现。
    • 在小程序端,uni-app基础组件会直接转义为小程序自己的内置组件。在小程序的runtime中不占体积
    • 在web和android、iOS端,这几十个组件都在uni-app的runtime中,会占用一定体积,相当于内置了一套ui库。
    • 组件的扩展:
      • 有了几十个基础组件,大多数扩展组件也都是基于这些基础组件封装的。比如官方提供的扩展ui库 uni ui 
      • 在web平台,for web 的各种 ui库(如elementUI)也可以使用,但这些库由于操作了dom,无法跨端在app和小程序中使用。
      • 在App平台,uni-app也支持使用原生编程语言来自行扩展原生组件,比如原生的地图、ar等。
      • uni-app同时支持将微信自定义组件运行到微信小程序、web、app这3个平台。注意微信自定义组件不是vue组件。
  3. API
    • uni-app runtime 内置了大量常见的、跨端的 API,比如联网(  uni.request )、读取存储(   uni.getStorage )
    • 同时uni-app不限制各端原生平台的API调用。开发者可以在uni-app框架中无限制的调用该平台所有能使用的API。即,在小程序平台,小程序的所有API都可以使用;在web平台,浏览器的所有API都可使用;在iOS和Android平台,os的所有API都可以使用。
    • 也就是说,使用uni-app的标准API,可以跨端使用。但对于不跨端的部分,仍可以调用该端的专有API。由于常见的API都已经被封装内置,所以日常开发时,开发者只需关注uni标准API,当需要调用特色端能力时在条件编译里编写特色API调用代码。
    • ext API:web和app的runtime体积不小,如果把小程序的所有API等内置进去会让开发者的最终应用体积变大。所以有部分不常用的API被剥离为ext API。虽然仍然是uni.开头,但需要单独下载插件到项目下
    • 小程序平台:uni对象会转为小程序的自有对象,比如在微信小程序平台,编写uni.request等同于wx.request。那么所有wx.的API都可以这样使用。
    • web平台:window、dom等浏览器专用API仍可以使用。
    • app平台:除了uni.的API,还可以使用 plus.的API、Native.js,以及通过 uts 编写原生插件,或者使用 java objectC 编写原生插件。这些原生插件调用 os 的API并封装给js使用。
    • 由于历史沿革,DCloud在开发app时有:5+Appwap2appuni-app等3种模式。这3种方式的runtime在底层能力上是公用的,所有uni-app可以调用5+(也就是plus.xxx)的API。虽然都可以使用5+的系统能力,但uni-app的逻辑层运行在js层,渲染层是webview和原生nvue双选。而5+不区分逻辑层和渲染层,全部运行在webview里,在性能上5+不及uni-app。

DCloud还提供了插件市场,大多数用得着的组件和API都已经有现成的插件。

六、逻辑层和渲染层分离 ⛓️‍💥

web平台,逻辑层(js)和渲染层(html、css),都运行在统一的 webview 里。

但在 小程序app端,逻辑层和渲染层被分离了

分离的核心原因是性能。过去很多开发者吐槽基于 webviewapp 性能不佳,很大原因是js运算和界面渲染抢资源导致的卡顿。

不管小程序还是 app,逻辑层都独立为了单独的js引擎,渲染层仍然是 webview (app上也支持纯原生渲染)。

🔖注意事项:小程序app 的逻辑层都不支持 浏览器专用  window、dom等 API。app只能在 渲染层 操作 window、dom ,即 renderjs 。

七、总结💢

在真正使用 uniapp 做开发之前一定要掌握这些基本知识,不然你在处理每个端之间的差异时,可能会疯掉。 😂

  🔗 uniapp 跨端开发系列文章:🎀🎀🎀

  1. uni-app 组成和跨端原理    【跨端开发系列】 
  2. uni-app 各端差异注意事项 【跨端开发系列】
  3. uni-app 离线本地存储方案 【跨端开发系列】
  4. uni-app UI库、框架、组件选型指南 【跨端开发系列】
  5. uni-app 蓝牙开发 【特别专题】
  6. uni-app 导航栏开发指南 【跨端开发系列】
  7. uni-app 原生控件层级过高无法覆盖的解决方案 【跨端开发系列】
  8. uni-app 设置缓存过期时间【跨端开发系列】

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

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

相关文章

KV Shifting Attention Enhances Language Modeling

基本信息 &#x1f4dd; 原文链接: https://arxiv.org/abs/2411.19574&#x1f465; 作者: Mingyu Xu, Wei Cheng, Bingning Wang, Weipeng Chen&#x1f3f7;️ 关键词: KV shifting attention, induction heads, language modeling&#x1f4da; 分类: 机器学习, 自然语言处…

算法-字符串-72.编辑距离

一、题目 二、思路解析 1.思路&#xff1a; 最少操作数——动态数组 res[i][j]:长度为i的字符串转化为长度为j字符串的最少操作 2.常用方法&#xff1a; 无 3.核心逻辑&#xff1a; 1.情况一&#xff1a;当word1为空&#xff0c;word2不为空时 for(int i0;i<size2;i){res[0…

云开发实战教程:手把手教你高效开发应用

声明&#xff1a;本文仅供实践教学使用&#xff0c;没有任何打广告成分 目录 1.引言 2.云开发 Copilot介绍 云开发 Copilot 的功能与特点 3.环境准备 步骤一登录账号 步骤二新建环境 4.开发实践 4.1AI 生成低代码应用 4.2AI 生成低代码页面/区块 4.3AI 优化低代码组件…

Linux笔记9 DNS域名解析服务器

简介 DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分 布式数据库&#xff0c;能够使人更方便的访问互联网。 DNS使用的是53端口&#xff0c; 通常DNS是以UDP这个较快速的数据传输协议来查询的&#x…

编程的“超能力”:解锁 MarsCode AI 的智能助手

文章目录 前言MarsCode AI 提供的超能力**1. 代码补全 | Code Completion**你是否曾卡在函数的中途&#xff0c;不知道下一行该怎么写&#xff1f;MarsCode AI 就是你的灵感缪斯&#xff01;示例 **2. 代码解释 | Explain Code**“这段代码是干嘛的&#xff1f;”当你面对团队老…

大数据新视界 -- 大数据大厂之 Hive 数据导入:多源数据集成的策略与实战(上)(3/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

提升搜索体验!—— 推出 Elastic Rerank 模型(技术预览版)

作者&#xff1a;来自 Elastic Shubha Anjur Tupil 几分钟内即可开始使用 Elastic Rerank 模型&#xff1a;强大的语义搜索功能&#xff0c;无需重新索引&#xff0c;提供灵活性和成本控制&#xff1b;高相关性、顶级性能和文本搜索效率。 使用我们全新的先进跨编码器 Elastic …

STM32+模拟或硬件IIC+SHT20驱动问题:接上拉电阻、BUSY死锁?

主要问题&#xff1a; 1&#xff0c;使用STM32F103C8T6&#xff0c;模拟IIC&#xff0c;SCL和SDA口配置为推挽输出上拉&#xff0c;主要是SDA脚&#xff0c;每次都要输出输入模式重新配置&#xff0c;虽然也能通信&#xff0c;但不稳定&#xff0c;出错率大&#xff1b; 2&…

Windows11和Ubuntu用PointNet++训练自己的数据集(部件分割模型)

省流&#xff1a; &#xff08;1&#xff09;不管是Linux还是Windows都不影响&#xff0c;只要有pycharm或者vscode即可&#xff0c;啥系统都行。 &#xff08;2&#xff09;此外由于自己的需求&#xff0c;所以只做物体部件分割&#xff08;partseg&#xff09;任务&#xff0…

【git】git回退到之前版本+拓展git命令

一、问题 git提交有时候会出错&#xff0c;想回退到之前的版本 1、命令git reset --soft <commit_id> commit_id【回退到的编号】 2、git push --force-with-lease origin <branch_name> branch_name【分支名】 二、拓展 1、git bash 1、进入任意磁盘 cd 磁盘…

Golang使用etcd构建分布式锁案例

在本教程中&#xff0c;我们将学习如何使用Go和etcd构建分布式锁系统。分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要。它有助于维护一致性&#xff0c;防止竞争条件&#xff0c;并确保在任何给定时间只有一个进程独占访问资源。 我们将使用Go作为编程语言&am…

开源数据同步中间件(Dbsyncer)简单玩一下 mysql to mysql 的增量,全量配置

一、什么是Dbsyncer 1、介绍 Dbsyncer是一款开源的数据同步中间件&#xff0c;提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景&#xff0c;支持上传插件自定义同步转换业务&#xff0c;提供监控全量和增量数据统计图、应用性能预警…

element-plus的el-tree的双向绑定

el-tree改造了下 可选可取消 有默认值 不包含父级id&#xff08;也可打开注释 包含父级id&#xff09; 默认展开 点击节点也可触发选择 节点内容自定义 <template><div class"absolute"><el-scrollbar class"pall"><div class"…

微信小程序报错:http://159.75.169.224:7300不在以下 request 合法域名列表中,请参考文档

要解决此问题&#xff0c;需打开微信小程序开发者工具进行设置&#xff0c;打开详情-本地设置重新运行&#xff0c;该报错就没有啦

医疗系统国产数据库高质量发展路径探析

信息工程人员操作数据库 一、国外数据库在医疗系统中的困境 &#xff08;一&#xff09;数据分散与难以整合 在美国&#xff0c;分散式医疗服务成为癌症研究数据库优化的巨大障碍。患者先在社区接受肿瘤科医生常规检查&#xff0c;再到学术医疗中心进行尖端治疗&#xff0c;然…

C语言——验证“哥德巴赫猜想”

问题描述&#xff1a; 验证"哥德巴赫猜想" 任何一个大于2的偶数都可以表示为两个质数之和。例如&#xff0c;4可以表示为22&#xff0c;6可以表示为33&#xff0c;8可以表示为35等 //验证"哥德巴赫猜想" //任何一个大于2的偶数都可以表示为两个质数之和…

Windows平台Unity3D下RTMP播放器低延迟设计探讨

技术背景 好多开发者希望我们分享下大牛直播SDK是如何在Unity下实现低延迟的RTMP播放的&#xff0c;以下是一些降低 Unity 中 RTMP 播放器延迟的方法&#xff1a; 一、选择合适的播放插件或工具 评估和选用专业的流媒体插件 市场上有一些专门为 Unity 设计的流媒体插件&…

速通前端篇 —— CSS

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;速通前端 目录 CSS的介绍 基本语法规范 CSS选择器 标签选择器 class选择器 id选择器 复合选择器 通配符选择器 CSS常见样式 颜…

MySQL并发控制(二):锁

只改一行语句&#xff0c;为什么锁那么多 注1&#xff1a;MySQL后面的版本可能会改变加锁策略&#xff0c; 所以这个规则只限于截止到现在的最新版本&#xff0c; 即5.x系列 注2&#xff1a;因为间隙锁在可重复读隔离级别下才有效&#xff0c; 所以本篇文章接下来的描述&#…

从零开始的使用SpringBoot和WebSocket打造实时共享文档应用

在现代应用中&#xff0c;实时协作已经成为了非常重要的功能&#xff0c;尤其是在文档编辑、聊天系统和在线编程等场景中。通过实时共享文档&#xff0c;多个用户可以同时对同一份文档进行编辑&#xff0c;并能看到其他人的编辑内容。这种功能广泛应用于 Google Docs、Notion 等…