【鸿蒙开发进阶】第16篇:项目分层架构:从一锅粥到清晰三层
·
📚 鸿蒙进阶专栏 · 第 16 篇 / 共 20 篇(进阶篇 11-20)
上一篇:异步并发:async/await 与 Promise | 下一篇:动效入门:属性动画与转场动画
目录
项目分层架构:从一锅粥到清晰三层
当页面代码超过 300 行、接口超过 10 个,就该分层了。这篇给出鸿蒙项目最实用的三层结构,并动手改造第 9 篇的网络请求。

一、目录结构长这样
MyApp/entry/src/main/ets/
├── pages/ # 表现层:页面,只管 UI
│ ├── Index.ets
│ └── NoteDetail.ets
├── components/ # 通用组件(第 11 篇)
├── viewmodels/ # 视图模型:状态 + 业务逻辑
│ └── NoteViewModel.ets
├── models/ # 数据层
│ ├── Note.ets # 实体类
│ ├── NoteApi.ets # 网络接口
│ └── NoteDao.ets # 数据库
└── common/ # 工具:http 封装、常量、日志
二、动手改造:从面条代码到三层
// models/Note.ets —— 实体
export class Note {
id: number = 0
title: string = ''
content: string = ''
}
// common/HttpUtil.ets —— 网络封装
import { http } from '@kit.NetworkKit'
export async function get<T>(url: string): Promise<T> {
const req = http.createHttp()
try {
const res = await req.request(url, { method: http.RequestMethod.GET })
if (res.responseCode !== 200) throw new Error(`HTTP ${res.responseCode}`)
return JSON.parse(res.result as string) as T
} finally {
req.destroy()
}
}
// models/NoteApi.ets —— 数据源
import { Note } from './Note'
export function fetchNotes(): Promise<Note[]> {
return get<Note[]>('https://api.example.com/notes')
}
// viewmodels/NoteViewModel.ets —— 业务
import { Note, fetchNotes } from '../models/NoteApi'
export class NoteViewModel {
private _notes: Note[] = []
get notes(): Note[] { return this._notes }
async load(): Promise<void> {
this._notes = await fetchNotes()
}
}
页面里只剩三行:创建 ViewModel、调 load()、渲染 notes。
三、分层的收益,用场景说话
| 场景 | 不分层 | 分层后 |
|---|---|---|
| 接口地址变了 | 全项目搜索替换十几处 | 只改 NoteApi.ets |
| 从网络换成数据库 | 重写页面代码 | 只换数据源,UI 零改动 |
| 新人接手 | 读 3000 行面条 | 看目录就知道在哪改 |
四、多模块(HAP/HAR/HSP)预告
更大的项目会拆成多个模块:entry(主包)+ HAR(静态共享包,放工具和组件)+ HSP(动态共享包,放业务模块)。这是应用市场上架 2GB+ 大应用的必经之路,作为专题留到后续。
五、下一篇预告
功能齐了,怎么让界面「活」起来?下一篇:鸿蒙动效,三种武器让按钮、列表、页面都会动。
进阶系列持续更新中,点赞 + 收藏 + 关注不迷路。
遇到问题评论区贴报错信息 + 关键代码,看到都会回。也欢迎留言点播你想看的进阶主题。
更多推荐




所有评论(0)