鸿蒙开发手册HARMONYOS

CHAPTER 05代码组织 · ARCHITECTURE

应用
架构

当 UI 逻辑都堆在组件里就成了"上帝组件"。本章讲解 Stage 模型、MVVM、状态管理、依赖组织与模块拆分。

开始阅读难度进阶约2.5小时
05.1

为什么需要架构

架构让人改得动:可测试、可复用、可并行开发。鸿蒙推荐 UI 层 → 领域层 → 数据层 分层,UI 只渲染状态。

没有银弹

小项目组件内聚即可;状态与交互复杂时再引入 ViewModel/Repository,避免过度设计。

05.2

Stage 模型

Stage 是 NEXT 的默认应用模型:UIAbility 承载界面与生命周期,WindowStage 管理窗口,更利于多窗口与后台。

export default class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage) {
    windowStage.loadContent('pages/Index')
  }
}
05.3

MVVM

ViewModel 持有状态与业务逻辑,UI 通过 @State/@Link 或自定义状态持有者观察,事件回传 VM。

class LoginVM {
  @State userName: string = ""
  @State loading: boolean = false
  login() { this.loading = true /* 调 repo */ }
}
// 组件持有 VM 实例,绑定状态
VM 与 UI 解耦

VM 不依赖 UI 组件,可在无界面下做单元测试:直接调用方法、断言状态。

05.4

状态管理

AppStorage 是应用级全局单例状态,LocalStorage 是页面级;跨组件共享用 @StorageLink/@StorageProp。

AppStorage.setOrCreate('theme', 'dark')
// 组件中
@StorageLink('theme') theme: string = 'light'
05.5

Repository 模式

Repository 统一数据来源(网络+本地),对外暴露领域模型,UI/VM 不关心数据来自哪里。

05.6

依赖组织

用单例或工厂集中创建数据/服务实例,避免在组件里散落 new,便于替换与测试。

export class ServiceLocator {
  static userRepo: UserRepository = new UserRepository()
}
05.7

模块拆分

用 HAR/HSP 模块按特性(:feature:home、:library:network)拆分,控制耦合、提升复用与编译速度。

依赖方向向下

上层依赖下层,下层不反向引用上层,否则循环依赖且无法单独测试。

05.8

常见陷阱

为什么把请求放 aboutToAppear 不好测?

逻辑绑在组件生命周期里,无法脱离 UI 测。抽到 ViewModel/Repository,组件只触发调用、观察状态。

AppStorage 被滥用会怎样?

全局状态满天飞会导致隐式耦合与难以追踪的刷新。仅在真正跨页面共享时使用,局部用 @State。

05.9

实战练习

延伸资源