uni-appx是一个庞大的工程,它包括uts语言、uvue渲染引擎、uni的组件和API、以及扩展机制。
uts是一门类ts的、跨平台的、新语言。
uts在iOS平台编译为swift、在Android平台编译为kotlin、在Web和小程序平台编译为js、在鸿蒙next平台上编译为ArkTS。
在Android平台,uni-appx的工程被整体编译为kotlin代码,本质上是换了vue写法的原生kotlin应用,在性能上与原生kotlin一致。
TIP
该语言在2022年9月推出,起初用于原生插件扩展开发。
开发者在uni-appx中,需使用uts而不是js。尤其是Android端不自带js引擎,无法运行js代码。
uts全称unitypescript,是一门跨平台的、高性能的、强类型的现代编程语言。它在不同平台,会被编译为不同平台的native语言,如:
uts替代的是js,而uvue替代的就是html和css。或者如果你了解flutter的话,也可以理解为uts类似dart,而uvue类似flutter。
uvue是一套基于uts的、兼容vue语法的、跨平台的、原生渲染引擎。
uvue渲染引擎包括uts版的vue框架(组件、数据绑定...)、跨平台基础ui、css引擎。
有了uvue,开发者就可以使用vue语法、css来快速编写页面,编译为不同平台的、高性能的纯原生界面。
一个uvue页面的例子:
示例没有涉及uts不允许的动态类型,也没有涉及uvue不支持的css,所以它实际上和uni-appjs版的vue页面没有区别。
使用该css子集,可保证跨端。如果把uvue页面编译到web平台,则web的其他css也都可以使用。
在过去的跨平台方案中,逻辑层和ui层的通信始终是痛点。
但这些补丁技术都不治根。过去只有flutter解决了dart和ui层的通信问题。可是这套方案又带来2个问题:
所以一个好的UI层,仍然应该是原生渲染而不是自渲染。只不过需要解决逻辑层和原生(不管是原生UI还是原生能力)的通信问题。
其实不管是js还是dart,和原生都有通信桥,功能上没有限制,可以调用各种原生能力,但问题就出在Android上这个通信性能上不去。
既然通信性能不行,那就干脆不通信。
由于uts在Android上被编译为kotlin,它的逻辑层和UI层都是纯原生的,没有通信问题,所以它的性能真正达到了原生水平。因为本质上它就是换了vue写法的原生kotlin应用。
在iOS上,情况要复杂些。由于swift编译iOS应用必须依赖xcode,而DCloud的开发者中windows占比更高。且iOS上js和原生通信有解,所以uni-appx在iOS上提供js和swift双选逻辑层。
也就是uts原生插件作者必须得有mac电脑,普通的App开发者可以没有mac电脑。
虽然理论上swift逻辑层的性能要高于js逻辑层,但开发者可以放心使用js逻辑层。
uni-appx在iphone上的js逻辑层和原生渲染层的通信经过特殊处理,大幅提升通信效率问题,不再需要bindingX这类技术。也不存在flutter那种混合渲染问题。可以体验hellouni-appx的iOS版本,在slider-100、滚动时动态调整view的top值以维持吸顶等极端场景,均如Android一样的丝滑流畅。
uni-appx支持的组件包括:
uni-appx支持的API包括:
由于uts可以直接调用Android和iOS的api,所以OS和三方sdk的能力都可以在uts中调用。如下:
INFO
上面的示例,在页面启动时打印了2行日志,显示手机型号。
在uni-appx里,可以直接调用OS的能力,不受限制,语法是uts的语法,但需要了解什么功能在原生里是哪个api。
使用uni.getSystemInfoSync则比较简单,看uni的文档即可,且可跨平台。
uni-appjs引擎版,支持plusAPI和weexAPI。但uni-appx中,不再支持这些API。
uni-appx编译到web、小程序、以及iOS的js逻辑层模式时,所有js库仍然可用。但在Android平台或iOS的swift逻辑层模式时,由于没有js引擎,所以无法使用js生态(除非使用web-view组件或自己集成一个js引擎)。
目前插件市场适配uni-appx的插件已有数百款,包括丰富的ui组件库生态:
INFO
uni-appx从源头重视产品质量,第一个版本就支持自动化测试。并为uni-appx产品编写了数十万行自动化测试例代码。
uni-appx的自动化测试方案和uni-appjs版相同,自动化测试脚本使用js编写(注意不是uts)。整个自动化测试环境,运行在电脑端。
开发者可以为自己的app编写好自动化测试,以提升自己的产品质量。
由于uni-appx的web、iOS、小程序,仍然是兼容js的。所以也有一种渐进式方案,先把老项目的web、iOS、小程序版本迁移到x,这样只需要改css。后续再把js改成uts来兼容Android。
之前已经有原生/rn/flutter页面,希望渐进式的迁移到uni-appx架构,该怎么搞?
至于把uni-appx作为一个sdk内嵌到其他原生应用中,后续提供离线打包方案时会提供。