当前位置: 首页 > article >正文

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 的处理下也可以平滑的在 kotlinswift 中使用。但有一些无法抹平,需要使用条件编译。

uni-app 的条件编译类似,uts 也支持条件编译。写在条件编译里的,可以调用平台特有的扩展语法。

二、用途和关系

uts 是一门语言。也仅是一门语言,不包含 ui 框架。

uvueDCloud 提供的跨平台的、基于 uts 的、使用 vue 方式的 ui 框架。

uts 相当于 jsuvue相当于 htmlcss 。它们类似于 v8webkit 的关系,或者类似于 dartflutter 的关系。

uts 这门语言,有2个用途:

  1. 开发 uni-appuni-app x 的原生扩展插件:因为 uts 可以调用所有原生能力。
    2.utsuvue 一起组合,开发原生级的项目,也就是 uni-app x 项目。

uts 可以在 uni-app 中使用,也可以在 uni-app x 中使用。

主语言区分:

  1. uni-app 中,主编程语言是 jsuts可以开发原生插件,包括API插件和组件插件。
  2. uni-app x 中,主编程语言是 uts 。不管是应用逻辑还是扩展插件,均使用 uts 编程。仅在Web平台和iOS的 js 驱动模式下可以使用 js

可以通过表格更清晰的了解 uts 语言在 uni-appuni-app x 下的编译关系。

在这里插入图片描述
这里的概念解释是:

  • uts 插件,指 uni_modules 目录下 utssdk 目录下的代码。
  • uts 插件外,其他都属于 普通页面和脚本,包含 vue、nvue、uvue 等页面及单独的 uts 文件。
  • uni-app xiOS 平台,目前普通页面和脚本是编译为 js 的,而不是Swift 。 这个策略主要是为了解决 windows 电脑开发 uni-app x 的问题。它并不影响性能,uni-app x 的iOS通过优化解决了 js 性能问题。同时未来也会提供 js 驱动和 Swift 驱动双选。

除了查阅表格,也可以简单的记3个原则:

  1. 所有的 uts 插件,都会编译为原生语言。
  2. web 和小程序上,原生语言就是 js
  3. App上,目前仅 uni-app x 的 ·Android· 平台会编译为原生语言,其他都编译为 js

三、类型声明

js 是无类型的,TypeScripttype 就是类型的意思,给 js 加上了类型。它的类型定义方式是在变量名后面通过加冒号和类型来进行定义。

uts 中声明变量可以用 letconst,详见下。

3.1 变量定义(let)

声明一个可重新赋值的变量。语法 let [变量名] : [类型] = 值;

相当于 TypeScript 中的 letkotlin 中的 varswift 中的 var

let str :string = "hello"; // 声明一个字符串变量
str = "hello world"; // 重新赋值

3.2 常量定义(const)

声明一个只读常量,只能为其赋值一次。语法 const [变量名] : [类型] = 值;

相当于 TypeScript 中的 constkotlin 中的 valswift 中的 let

const str :string = "hello"; // 声明一个字符串常量
str = "hello world"; // 报错,不允许重新赋值

🌈注意事项:

  • 当前 uts 并未限制使用 var 来声明变量,但除非你知道你在做什么,否则不要轻易使用它,因为有不同平台差异:
    • 编译至 JavaScript 平台时,等同于 JavaScript 平台的 var 。存在变量提升现象,具体参考 varlet 的区别
    • 编译至 Kotlin 平台时,等同于 Kotlin 平台的 var(允许重新赋值)
  • swift 中 let 是定义常量,而 utsts 中,let 是定义变量。注意勿混淆。
    类型定义的冒号,左右可以有一个空格,也可以没有空格。let str:string 和 let str :
  • stringlet str :stringlet 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 选项式开发时,冒号被用于赋值,无法通过 letconst 和冒号来定义 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 这门语言不是为了发明中国自己的语言而诞生的,它是为了寻找跨平台开发的最佳方案。

跨平台有几种做法:

  1. 利用一种各平台都支持的语言,比如js。之前的uni-app就是这么做的。
  2. 把A平台的语言翻译成B、C、D平台的语言。比如kotlin编译为js。
  3. 重新设计一门与各平台无关的语言,独立的规范,较重的运行时。比如dart。还有跨windows、mac、linux的java,也是这种思路。

A翻译B、C、D其实是一条不归路。因为这些语言设计之初就是为了服务它自己的平台,所以A、B、C、D有很多无法兼容的设计,没办法顺畅翻译。想走这条路的产品也大多被扔进了垃圾桶。

所以如果开发者期待 uts 完全兼容 ts ,那就期待错了。ts 直接翻译为 kotlinswift 是不现实的。

而全新语言,又会有几个问题:

  1. 较重的运行时,会增大发行包体积、增加内存消耗、减缓运行性能。
  2. 新语言与系统原生语言需要通信,通信耗时会造成性能损失。详见评测
    而uts的设计,不是上述3种方案中的某个,也完美的规避了上述3个方案的缺点。

uts是全面了解 ts、kotlin、swift、arkts 等不同的语言后,全新设计的一套跨平台语言。

它抽象了各个平台语言的共性,保证了跨平台的兼容,比如 uts 设计了 number类型,并且通过编译 + 运行时的综合方案,在全平台实现了 number

同时 uts 又支持各平台原生语言的所有特性,比如 kotlinint ,只不过这些特性的写法需要写条件编译,因为它们无法跨平台。

由于编译为平台原生语言,所以 uts 天生没有跨语言通信成本,也不需要新语言较重的运行时,对包体积、内存占用、运行性能的影响非常小。

所以 uts 被称为最佳的跨平台解决方案。

但不容易兼得的是用户的历史习惯,uts 在努力照顾 ts 开发者的习惯,尽可能贴近 ts

  • 只有在编译到浏览器或小程序等 js 环境时,开发者才能完全使用所有 ts 特性。
  • 编译为 kotlinswift 时,开发者需要做好准备,学习 uts 的跨平台约束。

http://www.kler.cn/a/572932.html

相关文章:

  • 《DeepSeek从部署到安全分析实战》
  • 学习日记-250305
  • 2024 年 6 月大学英语四级考试真题(第 2 套)——解析版
  • Vue3 Suspense 终极指南:原理、用法与替代方案
  • 【Linux】使用问题汇总
  • 聊天室Python脚本——ChatGPT,好用
  • 我们来学nginx -- 优化下游响应速度
  • centos搭建 Node.js 开发环境
  • 深入解析SpringMVC中Http响应的实现机制
  • ESP8266连接网络实时上传数据
  • 安当KSP密钥管理系统:为无线局域网安全运行构建双重认证与密钥管理一体化解决方案
  • ZYNQ-PL学习实践(四)IP核之读写RAM
  • 使用vivado2023.2新版Vitis创建hello world项目以及新版vitis的一些说明
  • 前端基础之组件自定义事件
  • 项目工坊 | Python驱动淘宝信息爬虫
  • CSS设置文字渐变色样式(附带动画效果)
  • 鸿蒙5.0实战案例:基于OpenGL渲染视频画面帧
  • 网络编程之TCP协议
  • 数据结构:八大排序(冒泡,堆,插入,选择,希尔,快排,归并,计数)详解
  • CHAPTER 5 Data Class Builders