不少刚接触鸿蒙的开发者,翻开官方文档迎面就是三个陌生名词:ArkTS、ArkUI、Ability。
文档里各自有各自的章节,看起来是独立的三个模块,但实际写代码时它们又搅在一起。到底先学哪个?它们之间是什么关系?搞不清楚这个问题,后续的学习就会像拼图少了核心的那一块——每个碎片都认识,但拼不出完整的画面。
这篇文章用一张图把三者的关系说透,然后逐一拆解每个模块到底是什么、解决什么问题。
一、一张图看懂三者的关系
把鸿蒙应用开发想象成盖一栋楼:
这三者组合起来,才构成一个能住人的房子。

对应到代码层面:
一个鸿蒙应用的基本结构是:用ArkTS语言,调用ArkUI框架的组件构建界面,把这些界面放到Ability容器中运行。
下面逐一展开。
二、ArkTS:鸿蒙的“开发母语”
ArkTS(Ark TypeScript)是华为为鸿蒙生态定制的应用开发语言。它源于TypeScript,是TS的一个超集——所有合法的TS代码在语法层面都可以直接搬到ArkTS文件里编译通过。
但ArkTS不只是换了个名字的TS。它在TS的基础上做了两类改动:
第一,加法。 ArkTS增加了声明式UI语法、状态管理装饰器(@State、@Link、@Prop等)、跨设备分布式API,以及ArkUI的组件化能力。这些新增能力是鸿蒙应用开发的根基——没有它们,你只能用TS写纯逻辑代码,但无法构建鸿蒙的UI界面,也无法调用鸿蒙的分布式能力。
第二,减法。 ArkTS禁止了动态类型、限制any的使用、不支持with语句等容易带来运行时开销或隐患的写法。它强化了静态类型检查能力,采用名义类型系统——即使两个类型结构完全一致,若名称不同也视为不兼容,从编译阶段就规避了大量运行时异常。
为什么华为要“做减法”?因为鸿蒙的目标场景不仅是手机,还包括手表、车机、IoT设备。这些设备的算力和内存远不如手机,任何运行时的不确定性都可能导致性能问题。ArkTS通过更严格的类型约束,把错误拦截在编译期,换来了运行时的稳定性和性能。

ArkTS还针对分布式全场景特性进行了深度优化,被称为鸿蒙生态的“开发母语”。配合华为自研的ArkCompiler,ArkTS代码可直接静态编译为原生机器码,执行效率相比解释型语言有明显提升。
一个关键问题:会TS就能直接写鸿蒙吗?
答案是:可以用TS的语法思维写业务逻辑,但不能直接用纯TS开发鸿蒙应用。纯TS代码只能跑在Node.js、浏览器等标准JS运行时;鸿蒙终端上没有V8或JSC这类传统JS引擎,而是自带ArkCompiler和ArkVM。你必须在DevEco Studio里创建ArkTS工程,用.ets后缀写代码,通过ArkCompiler编译成方舟字节码或本地机器码,再打包成鸿蒙HAP。
文件后缀、编译器、工程配置、UI描述方式都要切到ArkTS范式,否则无法生成鸿蒙可执行包。但好消息是,有TS基础的开发者上手ArkTS非常快——只需学习ArkTS新增的鸿蒙专属能力,无需重新学习基础语法。
三、ArkUI:声明式UI开发框架
ArkUI是鸿蒙的UI开发框架,官方名称是“方舟开发框架”。它提供了一套开发极简、高性能、支持跨设备的UI开发能力。
声明式范式,而非命令式。
ArkUI最核心的特征是声明式开发范式。传统命令式UI开发,是一步步操作控件:创建按钮、设置文字、监听点击、手动改颜色。声明式则不同——开发者描述页面在某个状态下应该长什么样,框架负责把状态变化自动同步到界面上。
举个例子。在ArkUI中创建一个按钮:
@Entry@Componentstruct ButtonComponent { build() { Button('点击我') .width(200) .height(80) .backgroundColor(Color.Blue) .onClick(() => { console.log('按钮被点击'); }); }}
这段代码描述的是“一个蓝色、宽200高80、文字为‘点击我’的按钮”,而不是“创建一个按钮对象、设置宽度为200、设置高度为80……”。框架接管了UI的创建和更新逻辑,开发者只需要关注“界面长什么样”。
ArkUI的核心构成:
布局:提供线性布局(Column/Row)、层叠布局(Stack)、弹性布局(Flex)、相对布局、栅格布局等多种方式。
组件:分为系统组件(Button、Text、Image等)和自定义组件(开发者用@Component装饰的结构体)。
状态管理:通过@State、@Prop、@Link等装饰器管理UI状态,数据变化自动触发界面更新。
动画与交互:提供属性动画、显式动画、手势事件等能力。
ArkUI的设计目标之一是“一次开发,多端部署”。通过弹性布局容器和自适应组件,一套代码可以自动适配手机、平板、车机、穿戴设备等不同屏幕尺寸与交互方式。这也是ArkUI区别于传统移动端UI框架的核心优势。
四、Ability:应用组件的容器
Ability是鸿蒙应用组件的统称。当前主推的是从API 9开始支持的Stage模型。Stage模型提供了两种类型的应用组件:
UIAbility:包含UI的应用组件,主要用于和用户交互。每个UIAbility实例都与一个WindowStage绑定,后者起到了窗口管理器的作用,为ArkUI提供绘制区域。UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态。
在onCreate回调中可以进行页面初始化操作,例如变量定义和资源加载。在onWindowStageCreate回调中通过loadContent方法设置应用要加载的页面。UIAbility的生命周期只包含创建/销毁/前台/后台等状态,与显示相关的状态通过WindowStage的事件暴露给开发者。
ExtensionAbility:面向特定场景的应用组件。开发者不直接从ExtensionAbility派生,而是使用其派生类,例如FormExtensionAbility(卡片场景)、InputMethodExtensionAbility(输入法场景)、WorkSchedulerExtensionAbility(延时任务场景)等。
一个HAP包中可以包含一个或多个UIAbility或ExtensionAbility组件,这些组件在运行时共用同一个AbilityStage实例。

理解Ability的关键在于“容器”思维。 UIAbility不是页面本身,而是页面的容器——它管理页面的生命周期(创建、销毁、前后台切换),提供运行环境,而页面内部的具体UI内容由ArkUI构建。一个UIAbility可以承载多个ArkUI页面,通过路由实现页面间的跳转。
五、三者如何协作:一个完整的调用链路
从用户点击应用图标到界面呈现,完整的链路是这样的:
系统启动UIAbility实例,触发onCreate回调——开发者在此做初始化。
系统创建WindowStage,触发onWindowStageCreate回调——开发者在此调用loadContent加载ArkUI页面。
ArkUI框架解析页面中的ArkTS代码,根据build()函数的描述构建UI树并渲染到屏幕。
用户与界面交互(点击按钮、输入文字),触发ArkUI的事件回调,回调中更新状态(@State变量),ArkUI自动重新渲染受影响的UI部分。
用户退出应用,UIAbility经历Background→Destroy,释放资源。
这条链路中:ArkTS是书写工具,ArkUI是界面构建器,UIAbility是运行容器。三者各司其职,缺一不可。
六、学习路径建议
明确了三者的关系之后,学习的顺序也就清晰了:
第一步:ArkTS语言基础。 如果你已有TypeScript或JavaScript经验,这一步最快——重点学习ArkTS的声明式UI语法和状态管理装饰器(@State、@Prop、@Link)。如果没有任何编程基础,需要先补充变量、函数、类等基本概念。
第二步:ArkUI界面构建。 掌握常用组件(Text、Button、Image、TextInput)、布局容器(Column、Row、Stack、Flex)、链式属性调用和事件绑定。能独立搭建一个简单的页面。
第三步:UIAbility与生命周期。 理解Stage模型的基本概念,掌握UIAbility的生命周期回调(onCreate、onWindowStageCreate、onForeground、onBackground、onDestroy),知道在不同生命周期阶段应该做什么。
第四步:综合实战。 在一个完整的项目中把三者串起来——用ArkTS写逻辑,用ArkUI搭界面,用UIAbility管理页面生命周期。这时你才算真正入了鸿蒙开发的门。
回到最初的问题:鸿蒙开发到底学什么?
学ArkTS——它是你书写一切代码的语言工具。
学ArkUI——它是你构建用户界面的框架方法。
学Ability——它是你管理应用组件的容器机制。
三者组合在一起,才构成一个完整的鸿蒙应用。单独拎出任何一个,都只是一块拼图。理解了它们如何协作,你就拿到了拼出整张图的那把钥匙。