鸿蒙 App 模块化拆分:架构解析 + 实战案例
大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。
图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG
我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。
展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
文章目录
- 引言
- 一、为什么鸿蒙 App 更需要模块化
- 二、模块化到底在解决什么问题
- 三、最常见的错误拆分
- 四、推荐的领域模块化
- 五、一个电商 App 的模块化设计
- 六、模块内部如何设计
- 七、模块之间如何通信
- 八、Store 不要跨模块共享
- 九、结合 Task 架构
- 十、结合 AI Native 架构
- 十一、模块化与分布式能力
- 十二、一个推荐的最终架构
- 十三、总结
引言
很多人第一次做鸿蒙 App 时,项目结构通常是这样的:
pages/ components/ utils/ services/刚开始:
页面不多 功能不复杂 开发效率很高但随着业务增长,很快就会出现一种熟悉的情况:
登录功能依赖订单模块 订单模块依赖支付模块 支付模块又依赖用户模块最后:
所有模块互相引用出现:
改一个功能 全项目一起编译甚至:
删代码不敢删 改逻辑不敢改很多团队最后会发现:
真正让项目失控的,不是代码量,而是模块边界消失了。
所以对于中大型鸿蒙项目来说:
模块化不是优化,而是架构基础。
一、为什么鸿蒙 App 更需要模块化
传统移动应用:
单设备 单入口 单运行时而鸿蒙天然具备:
- 手机
- 平板
- PC
- TV
- 穿戴设备
- 分布式协同
同时还有:
AI Task Store 分布式状态项目复杂度远高于传统 App。因此:
功能增长 ↓ 模块增长 ↓ 依赖增长 ↓ 复杂度爆炸如果没有模块化:
项目一定越来越难维护二、模块化到底在解决什么问题
很多人认为:
模块化就是拆目录。
其实不是,真正解决的是:
边界问题。
例如,错误结构:
PageA ↓ PageB ↓ PageC ↓ PageD形成:
网状依赖最终:
谁依赖谁已经说不清正确结构:
User Order Payment Message彼此独立:
模块内部高内聚 模块之间低耦合三、最常见的错误拆分
很多项目喜欢按技术层拆:
pages/ services/ repositories/ models/看起来很整齐,实际上:
一个订单功能 代码分散到十几个目录例如:
OrderPage ↓ pages/ OrderService ↓ services/ OrderRepository ↓ repositories/开发一个订单功能:
来回切目录非常痛苦。
四、推荐的领域模块化
鸿蒙项目更推荐:
按业务领域拆分。
例如电商项目:
user/ order/ product/ payment/ message/每个领域独立存在。
订单模块:
order/ ├── ui/ ├── store/ ├── task/ ├── system/ ├── repository/ └── model/用户模块:
user/ ├── ui/ ├── store/ ├── task/ ├── system/ ├── repository/ └── model/这样:
订单代码只在订单目录 用户代码只在用户目录查找成本极低。
五、一个电商 App 的模块化设计
假设:
商城项目主要能力:
- 登录
- 商品
- 购物车
- 订单
- 支付
- 消息
推荐结构:
src ├── app ├── common ├── user ├── product ├── cart ├── order ├── payment └── message公共能力:
common/负责:
网络层 日志 工具库 配置 基础组件例如:
HttpClient Logger Storage六、模块内部如何设计
以订单模块为例,目录:
order/ ├── ui ├── store ├── task ├── system ├── repository └── modelUI 负责:
页面展示例如:
OrderPage.etsStore 负责:
订单状态例如:
exportclassOrderStore{orders:Order[]=[]}Task 负责:
任务编排例如:
CreateOrderTask.tsSystem 负责:
业务处理例如:
OrderSystem.tsRepository 负责:
数据访问例如:
OrderRepository.ts七、模块之间如何通信
很多项目最容易出问题:
模块直接调用模块例如:
orderStore.userStore或者:
paymentStore.orderStore这样会形成:
循环依赖正确方式,通过接口通信。例如:
interfaceIUserService{getUser():Promise<User>}订单模块:
constructor(privateuserService:IUserService){}依赖:
能力而不是:
具体实现八、Store 不要跨模块共享
错误写法:
productStore.orders或者:
userStore.cart这样:
模块边界消失正确做法,模块只管理自己的状态。例如,订单模块:
orderStore.orders商品模块:
productStore.products用户模块:
userStore.user互不持有。
九、结合 Task 架构
未来鸿蒙 App 会越来越偏向:
Task 驱动而不是:
页面驱动例如,创建订单:
awaittaskCenter.run("create_order")任务内部:
classCreateOrderTask{asyncrun(){constorder=awaitorderSystem.create()orderStore.set(order)}}架构:
UI ↓ Task ↓ System ↓ Repository ↓ Store模块边界非常清晰。
十、结合 AI Native 架构
未来很多鸿蒙 App:
Agent会成为新入口,例如:
awaitagent.run("帮我购买这本书")此时,AI 不应该直接操作页面。正确方式:
Agent ↓ Task ↓ Module例如:
awaittaskCenter.run("create_order")订单模块执行、支付模块执行、消息模块执行。
每个模块:
独立自治十一、模块化与分布式能力
鸿蒙最大的特点:
分布式例如,手机:
创建订单PC:
查看订单TV:
展示订单如果没有模块化:
状态同步非常混乱正确结构:
Distributed State ↓ Order Module ↓ Order Store ↓ UI模块天然成为:
同步边界十二、一个推荐的最终架构
对于中大型鸿蒙 App,推荐结构:
App │ ├── Common │ ├── User │ ├── UI │ ├── Store │ ├── Task │ ├── System │ └── Repository │ ├── Order │ ├── UI │ ├── Store │ ├── Task │ ├── System │ └── Repository │ ├── Payment │ ├── Message │ └── Product核心原则:
按领域拆 而不是按技术拆十三、总结
如果用一句话总结模块化:
模块化的本质,不是拆代码,而是建立边界。
优秀鸿蒙项目都有一个共同点:
状态有边界 模块有边界 任务有边界 设备有边界这样即使项目做到:
几十万行代码依然能够:
快速迭代 快速定位 快速扩展很多鸿蒙项目后期越来越难维护,并不是因为:
- 页面太多
- 功能太复杂
- 分布式太难
真正的问题只有一个:
所有代码最终长成了一个“大模块”。
记住一句话:
没有模块边界的系统, 最终一定会变成一个巨大的耦合体。当你真正建立:
- 领域模块
- Store隔离
- Task中心化
- 无状态System
- 分布式边界
你会明显感受到:
项目开始拥有“可演进能力”而这也是鸿蒙 App 从 Demo 走向大型商业项目的重要分水岭。
