在 DevEco Studio 里新建 HarmonyOS 工程时,默认给你生成一个 entry 模块,很多开发者就这么一路写下去,页面越来越多、功能越堆越重,等到要上架才发现包体大得离谱、团队协作天天冲突、一个修改就要全量发版。我之前在一个个人记账项目里就踩过这个坑,后来认真梳理了 Feature 模块的玩法,才真正体会到它为什么被叫做动态化开发的“瑞士军刀”——它不是某个单一功能,而是一整套把 App 拆散、按需装配、动态下发的能力组合。这篇文章我就拿这个记账系统的实战过程,把 Feature 模块从设计思路到落地代码完整拆一遍,给正在被“模块过多”“发版困难”“包体膨胀”折磨的 HarmonyOS 开发者一个可以直接抄作业的参考。
1. Feature 模块到底是什么:先搞清楚它的定位
1.1 一个 App,三种模块形态
HarmonyOS NEXT 的应用工程里,模块大致有三种形态:entry、feature、shared。
entry 是一个 App 的门面,也是整个应用启动时默认加载的入口模块,每个应用有且只能有一个 entry。feature 则是在 entry 之外按业务维度拆出来的功能模块,一个应用可以有多个 feature,比如电商 App 里的“购物车”“订单详情”都可以各拆一个 feature。shared 是动态共享包 HSP(HarmonyOS Shared Package),它不独立运行,专门给其他模块提供公共代码、公共资源和公共 UI 组件。
形象一点说,entry 是“总装车间”,负责把各种零件拼起来;feature 是“功能刀头”,切菜有菜刀、开瓶有开瓶器;shared 是“刀柄里的轴”,所有刀头能转动、能弹出的基础机构都靠它。所以我说它是瑞士军刀:一个刀柄(shared)挂多种刀头(feature),平时不用的刀头收在壳里(按需下载),要用的时候“咔哒”一声弹出来(动态加载)。这就是动态化开发的核心结构支撑。
1.2 为什么动态化开发离不开 Feature 模块
很多刚接触 HarmonyOS 的开发者会把“动态化”直接等同于 Web 加载或者解压远程资源包,其实在 HarmonyOS 的生态里,动态化是一整套链路,而 Feature 模块就是这条链路的地基。
我先说一个真实的包体数据。在记账这个项目里,如果把统计分析、预算管理、用户认证这三块都塞进 entry,编译出来的 HAP 大概有 47MB。拆成三个 Feature 模块后,entry 的安装包降到 20MB 左右,统计和预算这两个高频低频不一的模块被标记成按需分发,用户首次安装只需要拿到核心记账功能,等真正点击“统计报表”入口时再去下载对应模块。这个体验的差异非常明显:首次安装变快、内存占用变小、冷启动时间也缩短了大概 300ms。
动态化另外一个层面是“动态发布”。Feature 模块在 AppGallery Connect 上可以单独发版本、单独回退。我不用因为预算模块改了一个图表颜色,就把整个 App 重新提审一遍。团队并行开发时,两个人的代码仓库也可以做到物理隔离,各自维护各自的 module,合代码时只在 entry 和 hsp 层面做极少的集成操作。这些优势在没有模块化结构时是根本做不到的。
1.3 模块划分的决策依据
拆模块不是拆得越碎越好,拆太多会导致工程管理成本上升、依赖关系混乱。我自己在项目里总结了一套判断标准:
- 是否独立使用:这个功能用户可能在主流程外单独访问,比如“预算设置”,可以独立成模块。
- 是否低频重资源:比如统计报表涉及大量图表库,会显著增加包体,放主包里不划算。
- 是否需要独立发版:如果某个功能迭代频率高,或者经常要临时调整,拆出来更好。
- 是否团队隔离:多团队协作时,模块边界就是团队边界,减少互相踩脚。
在实际项目中,我倾向于把“用户认证”“统计分析”“预算管理”拆成独立 Feature,而“账单记录”“分类管理”这种主流程高频功能继续留在 entry 或放到 HSP 里做复用。这样的边界既保证了动态下发的能力,又不至于让工程碎片化。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 模块划分与工程搭建:动手前想清楚
2.1 开发环境要求
在开始创建 Feature 模块之前,先确认环境,这能省掉后面很多莫名其妙的报错。我的环境如下:
- DevEco Studio 5.0.0 及以上版本(建议用最新正式版)
- HarmonyOS NEXT SDK,API 12 及以上
- 本机 Node.js 18 以上,用于 ohpm 依赖管理
- 如果涉及真机验证,需要 HarmonyOS NEXT 5.0 系统的真机设备,以及注册好的 AppGallery Connect 项目
这里提醒一下,Feature 模块对开发工具版本有隐性的要求,老版本的 DevEco Studio 可能不支持某个模块类型,或者无法识别 module.json5 里的新字段。我见过有人用 DevEco Studio 4.x 打开新工程,feature 模块创建不出来,控制台直接报“Unsupported module type”。遇到这类问题,先升级工具再排查别的。
2.2 用 DevEco Studio 创建 Feature 模块
创建一个 Feature 模块在操作上很简单,我
