HarmonyOS 工程化实践:HAP、HAR、HSP 模块拆分与依赖治理

举报
yd_225040342 发表于 2026/11/14 01:32:17 2026/11/14
【摘要】 对比 HAP、HAR、HSP 三类包形态的定位差异,给出按业务域拆模块、依赖单向、版本管理以及用独立编译与改动范围验证模块边界的方法。

一、单 HAP 打天下会遇到什么

项目初期把所有代码放进一个 HAP 最省事。但随着业务增长,会出现四个典型问题:包体积持续膨胀导致安装与启动变慢;多人协作时模块边界模糊、改动互相影响;不同设备形态无法按需加载;公共代码复制粘贴、重复维护。

HarmonyOS 的工程化方案是 HAP + HAR + HSP 三类包形态,各司其职。

二、HAP、HAR、HSP 的区别

类型 定位 能否独立运行 典型内容
HAP 应用安装包,按设备/功能拆分 是(入口 Ability) 页面、Ability、入口逻辑
HAR 静态共享库,编译期打包进使用方 否 工具类、UI 组件、通用模型
HSP 动态共享包,运行时按需加载 否 大体积公共模块、按需功能

关键差异:HAR 在编译期被合入 HAP,会增加使用方体积;HSP 在运行时加载,多应用可共享同一份代码,适合体积大且不必首屏加载的公共能力。

三、拆分原则:按“变更原因”而不是按“文件类型”

常见的错误拆法是把所有 model 放一个 HAR、所有 view 放一个 HAR、所有 utils 放一个 HAR。这样每次业务变更都要同时改多个模块,反而更混乱。更合理的拆法是按业务域与复用范围:

  1. 基础层 HAR:日志、网络、存储、埋点等与业务无关的能力,变更频率低;
  2. 公共 UI HAR:设计系统组件(按钮、卡片、空态页),被多个业务模块复用;
  3. 业务 HAR:按域拆分,例如订单、消息、个人中心,各自独立演进;
  4. 按需 HSP:体积较大的低频能力,例如离线地图、音视频编辑。

四、依赖方向要单向

模块化最容易失控的是依赖成环:A 依赖 B,B 又依赖 A,最终无法独立编译,也无法单独测试。约定一条规则:业务模块可以依赖基础层与公共 UI,业务模块之间不直接依赖,跨域通信通过路由或事件总线。

// 通过路由跳转,而不是直接 import 另一个业务模块的页面
router.pushUrl({ url: 'pages/OrderDetail' });

五、版本与发布

HAR/HSP 也有自己的版本号与依赖声明。内部模块建议使用固定版本而非范围版本,避免一次依赖升级导致所有模块行为变化。发布到私有仓库时,注意同步维护 CHANGELOG,记录破坏性变更。

六、拆分后的验证

模块拆分是否有效,不看目录树有多整齐,而看三个指标:

  1. 单个模块能否独立编译通过;
  2. 修改一个业务模块,是否需要同时改动其它业务模块;
  3. 包体积与启动耗时是否因按需加载而下降。

如果拆分后第 2 条依然经常发生,说明边界划错了,应重新审视模块职责,而不是继续增加层级。

七、小结

HAP 负责交付形态,HAR 负责编译期复用,HSP 负责运行时共享。拆分时按变更原因划边界、保持依赖单向、用独立编译与改动范围来验证效果。模块化的目标不是“看起来专业”,而是让并行开发与长期维护变得可控。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。