本文介绍: 可复用的 UI 单元,可组合其它组件,如上述被 @Component 装饰struct Hello

HarmonyOS(二)初识ArkTS开发语言(中)之TypeScript入门

浅析ArkTS的起源和演进

1 引言

Mozilla创造了JS,Microsoft创建了TS,Huawei一步推出了ArkTS。

从最初的基础的逻辑交互能力,到具备类型系统的高效工程开发能力,再到融合声明式UI、多维状态管理等丰富的应用开发能力,共同组成了相关演进脉络。

ArkTS是HarmonyOS优选的主力应用开发语言。它在TypeScript(简称TS)的基础上,扩展声明式UI、状态管理等相应的能力,让开发者可以以更简洁、更自然的方式开发高性能应用。TS是JavaScript(简称JS)的超集,ArkTS则是TS的超集。ArkTS会结合应用开发和运行需求持续演进,包括但不限于引入分布式开发范式并行并发能力增强、类型系统增强等方面的语言特性。本期我们结合JS和TS以及相关的开发框架发展,为大家介绍ArkTS的起源和演进思路

2 JS

JS语言由Mozilla创造,最初主要是为了解决页面中的逻辑交互问题,它和HTML(负责页面内容)、CSS(负责页面布局样式)共同组成了Web页面/应用开发的基础。随着Web浏览器的普及,以及Node.js进一步将JS扩展到了浏览器以外的环境,JS语言得到了飞速的发展。在2015年相关标准组织ECMA发布一个主要的版本ECMAScript 6(简称ES6),这个版本具备了较为完整语言能力,包括类(Class)、模块(Module)、相关的语言基础API增强(Map/Set等)、箭头函数(Arrow Function)等。从2015年开始,ECMA每年都会发布一个标准版本比如ES2016/ES2017/ES2018等,JS语言越来越成熟。

为了提升应用的开发效率,相应的JS前端框架也不断地涌现出来。其中比较典型的有Facebook发起的React.js,以及个人开发者尤雨溪发起的Vue.js。React和Vue的主要出发点都是将响应编程的能力引入到应用开发中,实现数据界面内容自动关联处理。具体的实现方式上,React对JS做了一些扩展引入了JSX(JavaScript XML)语法可以将HTML的内容统一表示成JS来处理;Vue则是通过扩展模板语法(Template)的方式来处理

下面通过两个示例,为大家简要介绍React和Vue。(**示例来源w3schools网站:**https://www.w3schools.com/whatis/)

1. React示例

图1 React示例

img

以上代码描述了React如何指定页面元素idid01的div元素)中改变相应的字符串内容(从”Hello World!“到”Hello John Doe!”)。其中第5行的ReactDOM.render()是React JS库提供的一个方法,它可以将相应的内容刷新指定的HTML元素中。第6行是符合JSX语义的一段代码,它包含一个类似HTML结构字符串

),以及一个表达数据绑定语义的字段({name}),会关联到第4行定义name变量通过这种方式,JSX把HTML的语义以及数据绑定机制和JS语言结合起来,可以方便地在JS语言中使用

2. Vue示例

图2 Vue示例

img

以上Vue示例代码也描述了类似的功能。其中第13行是类似HTML的语法,描述一个idappdiv页面元素,其中的{{message}}是数据绑定的语义,在Vue中表示为Template。第69行是JS代码,描述了一个Vue对象对应上述app页面元素以及所需的数据变量message内容信息。第11~13行则是JS函数,它改变message变量值为“John Doe”。执行这个函数时Vue会自动实现相应的UI界面刷新

如上所示,React和Vue所表达的能力是类似的,不过侧重点稍微有所不同。React主要是基于JSX的语法,将类HTML的语法融合到JS语言中;Vue则是基于Template机制,在HTML的基础上扩展相应的语义。当然,上面这两个例子只是简要地描述了React和Vue的基础信息,更详细语法以及CSS相关的使用等都没涉及。

运行时的维度来看,基于React以及Vue的应用都可运行在Web引擎上。为了进一步提升相应的性能体验,2015年Facebook在React基础上推出了React Native, 在渲染架构没有采用传统的Web引擎渲染路径,而是桥接到相应OS平台原生UI组件上。2019年Facebook引入全新实现的JS引擎Hermes,并推出一系列架构改进来进一步提升React Native的性能体验。2016年阿里巴巴开源的Weex则是基于Vue做了一些类似的改进,也是采用桥接原生UI组件的渲染路径

3 TS

随着JS生态发展如何有效地支撑大型的应用工程开发变成了一个重要的课题。大型的应用工程一般会涉及较复杂的代码以及较多的团队协作,对语言的规范性,模块复用性、扩展性以及相关的开发工具都提出了更高的要求。为此,Microsoft在JS的基础上,创建了TS语言,并在2014年正式发布了1.0版本。TS主要从以下几个方面做了进一步的增强:

工具层面,TS也有相应的编辑器编译器、IDE(Integrated Development Environment插件等相关的工具,来进一步提升开发效率。

TS在兼容JS生态方面也做了较好的平衡,TS应用通过相应编译器可以编译出纯JS应用,可以在标准的JS引擎运行。同时,TS定位为JS的超集,即JS应用也是合法的TS应用。此外,在标准层面上,TS兼容ECMA的相应标准,并维护那些还未成为ECMA标准的新特性

4 ArkTS

如上所述,基于JS的前端框架以及TS的引入,进一步提升了应用开发效率,但依然存在一些不足。

开发者维度来看:

写一个应用需要了解三种语言(JS/TS、HTML和CSS)。这对Web开发者相对友好,但对非Web开发者来说,负担较重。

运行维度来看:

Google在2018年底推出的Flutter则走了另外一条路,结合新的语言Dart,引入新的声明式开发范式基于Skia的自绘制引擎构建跨平台独立的渲染能力。这是一种较为创新方案,不过也有几点不足:

有意思的是,Google在2021年又推出了新的开发框架Jetpack Compose结合了Kotlin的语言生态,设计了新的声明式UI开发范式

2019年,我们思考如何构建新的应用开发框架时候,从以下几个维度进行了重点考虑

由于JS/TS有比较完善的开发者生态,语言也比较中立友好,有相应的标准组织可以逐步演进,JS/TS语言成了比较自然的选择。以JS/TS为基础,在开发框架维度我们做了如下架构演进设计:

图3 ArkUI开发框架

img

图3描述了ArkUI开发框架的整体架构,其中,基于TS扩展的声明式UI范式中所用的语言就是ArkTS。下面结合一个具体示例,从应用开发视角简单介绍下基于ArkTS的全新声明式开发范式。

如图4所示的代码示例,UI界面会显示两段文本和一个按钮,当开发者点击按钮时,文本内容会从’Hello World变为‘Hello ArkUI’。

图4 ArkTS声明式开发范式

img

这个示例中所包含的ArkTS声明式开发范式的基本组成说明如下

用来装饰类、结构体、方法以及变量,赋予其特殊的含义,如上述示例中 @Entry 、 @Component 、 @State 都是装饰器。具体而言, @Component 表示这是个自定义组件; @Entry表示这是个入口组件; @State 表示组件中的状态变量,此状态变化会引起 UI 变更

复用的 UI 单元,可组合其它组件,如上述被 @Component 装饰struct Hello

  • UI 描述

声明式的方式来描述 UI 的结构,如上述 build() 方法内部的代码块。

框架中默认内置的基础和布局组件,可直接被开发者调用比如示例中的 Column、Text、Divider、Button

用于添加组件对事件响应逻辑统一通过事件方法进行设置,如跟随在Button后面的onClick()。

用于组件属性配置,统一通过属性方法进行设置,如fontSize()、width()、height()、color() 等,可通过链式调用的方式设置多项属性

从UI框架的需求角度,ArkTS在TS的类型系统的基础上,做了进一步的扩展:定义了各种装饰器、自定义组件和UI描述机制,再配合UI开发框架中的UI内置组件、事件方法、属性方法等共同构成了应用开发的主体。在应用开发中,除了UI的结构化描述之外,还有一个重要的方面:状态管理。如上述示例中,用 @State 装饰过的变量 myText包含了一个基础的状态管理机制,即 myText 的值的变化会自动触发相应的 UI 变更 (Text组件)。ArkUI 中进一步提供了多维度的状态管理机制。和 UI 相关联的数据,不仅可以在组件内使用,还可以不同组件层级间传递比如父子组件之间,爷孙组件之间,也可以是全局范围内的传递,还可以是跨设备传递。另外,从数据的传递形式来看,可分为只读的单向传递和可变更双向传递。开发者可以灵活的利用这些能力来实现数据和 UI 的联动

总体而言,ArkUI开发框架通过扩展成熟语言、结合语法或者语言原生的元编程能力、以及UI组件、状态管理等方面设计了统一的UI开发范式,结合原生语言能力共同完成应用开发。这些构成了当前ArkTS基于TS的主要扩展。

ArkUI完整的开发范式可参考这里

https://developer.harmonyos.com/cn/docs/documentation/docguides/arkuioverview-0000001281480754

5 下一步演进

接下来,除UI框架需求之外,ArkTS也会结合应用开发及运行的其他方面需求持续演进:

1. 更完善的类型系统

我们已经设计并实现了专门运行时,利用ArkTS的类型输入,在程序执行一开始就获得较高的运行性能(不像其它传统JS引擎需要预热才能获取高性能)。但是目前的类型系统在运行时的设计上仍然考虑兼容模式,即在运行时,当对象类型发生变化时会走Bailout机制,以使程序在类型不匹配时仍能正常运行。一种更极致的方式是:引入一种特定模式支持确定类型的表达,当开发者可以明确类型时,提供相应的信息,这样运行时可以通过针对性设计,进一步提升性能体验。另外,ArkTS将来也会在类型系统中拓展一些新的类型,在与运行时结合的优化中会提供更好的性能体验。

2. 更灵活的并行处理

目前的移动设备基本都是多核设备(包括同一配置多核以及不同配置大小核),有些设备还会携带多种计算芯片(CPU/GPU/NPU/…)。语言在并发特性如何充分应用多核设备甚至异构芯片是一个重要的课题。目前我们采用的仍然是业界常见的类Actor模型并发接口——Worker,它弥补了Actor模型的些许劣势,即允许用户转移和共享大量的Buffer以避免通信拷贝的开销。但是开发者仍需自己管理Worker的生命周期利用Worker也不能非常方便地触发一个异步并行任务我们已经在尝试在Actor模型封装一种任务接口,方便用户更容易利用多核触发异步并行任务我们也一直在关注Swift、Dart、Kotlin、Go这些语言并发特性发展和运行时的实现,ArkTS的特定模式静态类型模型的引入也会给并发机制带来更多高性能实现的可能性,比如对象的冻结、所有权转移、值语义等等。我们将持续致力于提供简洁高效的并发API,帮助应用开发者更容易开发出高性能的应用。

当然,ArkTS以及ArkUI开发框架还很年轻,还有很多其它方面也会持续演进,比如UI自定义能力的进一步完善,语言运行时以及跨语言交互的进一步优化,跨OS平台能力的扩展,分布式开发范式等等。

作为应用生态的底座,应用开发框架的创新永无止境。我们希望和广大的开发者一起,持续围绕着开发效率、运行体验、跨设备/跨平台等相关方面一起合作,一起创新,共建繁荣的应用生态

原文地址:https://blog.csdn.net/qq_46189388/article/details/134731021

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_50124.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注