uniapp x 学习之 uts 语言快速入门
文章目录
- 一、UTS 介绍
- 二、用途和关系
- 三、类型声明
- 3.1 变量定义(let)
- 3.2 常量定义(const)
- 3.3 变量命名规则
- 3.4 方法参数及返回值类型定义
- 3.5 vue data类型定义
- 四、设计思路
一、UTS 介绍
uts
全称 uni type script
,是一门跨平台的、高性能的、强类型的现代编程语言。
它可以被编译为不同平台的编程语言,如:
- Web平台/小程序,编译为
JavaScript
- Android平台,编译为
Kotlin
- iOS平台,编译
Swift
- 鸿蒙OS平台,编译为
ArkTS
uts
采用了与 ts
基本一致的语法规范,支持绝大部分 ES6 API
。
但为了跨端,
uts
进行了一些约束和特定平台的增补。
过去在js
引擎下运行支持的语法,大部分在uts
的处理下也可以平滑的在kotlin
和swift
中使用。但有一些无法抹平,需要使用条件编译。
和 uni-app 的条件编译类似,uts
也支持条件编译。写在条件编译里的,可以调用平台特有的扩展语法。
二、用途和关系
uts
是一门语言。也仅是一门语言,不包含 ui
框架。
uvue
是 DCloud
提供的跨平台的、基于 uts
的、使用 vue
方式的 ui
框架。
uts
相当于 js
,uvue
相当于 html
和 css
。它们类似于 v8
和 webkit
的关系,或者类似于 dart
和 flutter
的关系。
uts
这门语言,有2个用途:
- 开发 uni-app 和 uni-app x 的原生扩展插件:因为
uts
可以调用所有原生能力。
2.uts
和uvue
一起组合,开发原生级的项目,也就是uni-app x
项目。
uts
可以在uni-app
中使用,也可以在uni-app x
中使用。
主语言区分:
- 在 uni-app 中,主编程语言是
js
。uts
可以开发原生插件,包括API插件和组件插件。 - 在 uni-app x 中,主编程语言是
uts
。不管是应用逻辑还是扩展插件,均使用uts
编程。仅在Web平台和iOS的js
驱动模式下可以使用js
。
可以通过表格更清晰的了解 uts
语言在 uni-app 和 uni-app x 下的编译关系。
这里的概念解释是:
uts
插件,指uni_modules
目录下utssdk
目录下的代码。- 除
uts
插件外,其他都属于 普通页面和脚本,包含vue、nvue、uvue
等页面及单独的uts
文件。 - 在 uni-app x 的 iOS 平台,目前普通页面和脚本是编译为
js
的,而不是Swift
。 这个策略主要是为了解决windows
电脑开发uni-app x
的问题。它并不影响性能,uni-app x
的iOS通过优化解决了js
性能问题。同时未来也会提供js
驱动和Swift
驱动双选。
除了查阅表格,也可以简单的记3个原则:
- 所有的
uts
插件,都会编译为原生语言。 web
和小程序上,原生语言就是js
。App
上,目前仅uni-app x
的 ·Android· 平台会编译为原生语言,其他都编译为js
。
三、类型声明
js
是无类型的,TypeScript
的 type
就是类型的意思,给 js
加上了类型。它的类型定义方式是在变量名后面通过加冒号和类型来进行定义。
uts
中声明变量可以用 let
或 const
,详见下。
3.1 变量定义(let)
声明一个可重新赋值的变量。语法 let [变量名] : [类型] = 值;
。
相当于 TypeScript 中的
let
、kotlin 中的var
、swift 中的var
。
let str :string = "hello"; // 声明一个字符串变量
str = "hello world"; // 重新赋值
3.2 常量定义(const)
声明一个只读常量,只能为其赋值一次。语法 const [变量名] : [类型] = 值;
。
相当于 TypeScript 中的
const
、kotlin 中的val
、swift 中的let
。
const str :string = "hello"; // 声明一个字符串常量
str = "hello world"; // 报错,不允许重新赋值
🌈注意事项:
- 当前
uts
并未限制使用var
来声明变量,但除非你知道你在做什么,否则不要轻易使用它,因为有不同平台差异:- 编译至 JavaScript 平台时,等同于 JavaScript 平台的
var
。存在变量提升现象,具体参考var
和let
的区别 - 编译至 Kotlin 平台时,等同于 Kotlin 平台的
var
(允许重新赋值)
- 编译至 JavaScript 平台时,等同于 JavaScript 平台的
- swift 中
let
是定义常量,而uts
和ts
中,let
是定义变量。注意勿混淆。
类型定义的冒号,左右可以有一个空格,也可以没有空格。let str:string 和 let str :
string
和let str :string
和let str: string
都是合法的。
3.3 变量命名规则
在 uts
中,使用变量名需要遵守一定的规则。
- 变量名称可以包含数字和字母。
- 除了下划线
_
外,不能包含其他特殊字符,包括空格。 - 变量名不能以数字开头。
3.4 方法参数及返回值类型定义
方法的参数、返回值,也通过冒号定义。
如下示例,方法 test
,有一个参数 score
,是 number
类型,方法返回值类型为boolean
类型。
function test(score: number): boolean {
return (score>=60)
}
test(61) // 返回true
方法无返回值时,使用 :void
。
function add(x :string, y :string) :void {
let z :string = x + " " + y
console.log(z)
// 不需要return
}
3.5 vue data类型定义
vue
选项式开发时,冒号被用于赋值,无法通过 let
、const
和冒号来定义 data
数据的类型。
此时可以使用字面量赋值自动推导;也可以使用 as
关键字来显式声明类型。
<script lang="uts">
export default {
data() {
const date = new Date()
return {
s1 : "abc", // 根据字面量推导为string
n1 : 0 as number, // 这里其实可以根据字面量自动推导,as number写不写都行
n2, // 不合法,必须指定类型
n3 as number, // 不合法,uts不支持undefined,必须通过冒号初始化赋值,哪怕赋值为null,见下
n4 : null as number | null // 合法。定义为可为null的数字,初始值是null,但在使用n4前必须为其赋值数字。(number | null)是一个或的写法,前后顺序没有关系。uts的联合类型只支持 |null 。
year: date.getFullYear() as number, // 在data里,目前无法通过变量类型推导data项的类型,需使用 as 显式声明类型为number
}
}
}
</script>
🌈注意:述示例仅在 uni-app x 的
uvue
页面生效。老版 uni-app,即js
引擎版,不支持在页面里写uts
代码,只支持在uts
插件里写uts
代码。
四、设计思路
uts
这门语言不是为了发明中国自己的语言而诞生的,它是为了寻找跨平台开发的最佳方案。
跨平台有几种做法:
- 利用一种各平台都支持的语言,比如js。之前的uni-app就是这么做的。
- 把A平台的语言翻译成B、C、D平台的语言。比如kotlin编译为js。
- 重新设计一门与各平台无关的语言,独立的规范,较重的运行时。比如dart。还有跨windows、mac、linux的java,也是这种思路。
A翻译B、C、D其实是一条不归路。因为这些语言设计之初就是为了服务它自己的平台,所以A、B、C、D有很多无法兼容的设计,没办法顺畅翻译。想走这条路的产品也大多被扔进了垃圾桶。
所以如果开发者期待
uts
完全兼容ts
,那就期待错了。ts
直接翻译为kotlin
、swift
是不现实的。
而全新语言,又会有几个问题:
- 较重的运行时,会增大发行包体积、增加内存消耗、减缓运行性能。
- 新语言与系统原生语言需要通信,通信耗时会造成性能损失。详见评测
而uts的设计,不是上述3种方案中的某个,也完美的规避了上述3个方案的缺点。
uts
是全面了解 ts、kotlin、swift、arkts
等不同的语言后,全新设计的一套跨平台语言。
它抽象了各个平台语言的共性,保证了跨平台的兼容,比如 uts
设计了 number
类型,并且通过编译 + 运行时的综合方案,在全平台实现了 number
。
同时 uts
又支持各平台原生语言的所有特性,比如 kotlin
的 int
,只不过这些特性的写法需要写条件编译,因为它们无法跨平台。
由于编译为平台原生语言,所以 uts
天生没有跨语言通信成本,也不需要新语言较重的运行时,对包体积、内存占用、运行性能的影响非常小。
所以
uts
被称为最佳的跨平台解决方案。
但不容易兼得的是用户的历史习惯,uts
在努力照顾 ts
开发者的习惯,尽可能贴近 ts
。
- 只有在编译到浏览器或小程序等
js
环境时,开发者才能完全使用所有ts
特性。 - 编译为
kotlin
和swift
时,开发者需要做好准备,学习uts
的跨平台约束。