一、背景
公司鸿蒙项目采用壳工程 + 外部模块化 的架构模式,核心是将业务拆分为可复用的模块。其中模块化引入分为本地引入 和私仓引入:本地引入适配开发阶段,代码修改可实时同步到壳工程,调试效率更高;私仓引入则适用于模块稳定后(如通过测试待上架、需跨项目共享)的场景。本文主要介绍一下两种方式的使用方法与差异。
二、为什么要分"本地引入" 和 "私仓引入"?
本质是用不同技术形态适配 "不同复用范围 + 开发阶段"
本地引入:属于源码级复用 ,组件以源码形式嵌入壳工程,修改后实时生效,无需打包,适合项目内开发调试期的快速迭代;
私仓引入:属于HAR 包级复用 ,组件被编译为预归档的 HAR 包,上传至企业私有仓库后供多项目下载,版本可控、依赖隔离,适合跨项目 / 团队的稳定期规模化共享。
三、本地引入:源码级复用引入方式
3.1、技术原理
本地引入是将外部模块以源码模块的形式注册到壳工程的编译体系中,鸿蒙编译器会将外部模块的源码与壳工程代码一起编译。这种方式相当于把外部模块 "嵌入" 壳工程,修改外部模块的代码后,壳工程能实时感知变化,无需额外的打包、导入步骤,是开发阶段的高效复用方案。
案例:当前壳工程项目是lucyTest,我需要在这个壳工程内本地引入外部文件的home模块与my模块,其中home模块是在homeTest项目文件内,my模块是在myTest项目文件内,应该如何引入
3.2、具体步骤:
3.2.1、给外部模块配置"入口文件"
这一步的核心是让壳工程识别外部模块的 "主入口",知道从哪个文件加载组件。
操作:打开外部home模块根目录(homeTest/home),创建 / 修改oh-package.json5文件,指定模块的入口文件路径与模块名称(模块名需唯一且与后续注册名一致):

3.2.2、在壳工程项目外层build-profile.json5注册组件模块
这一步是告诉鸿蒙编译器:"该外部模块是壳工程的一部分,编译时需包含其源码"。
操作:打开壳工程lucyTest根目录的build-profile.json5,在modules数组中添加外部模块的名称与路径:

3.2.3、在壳工程项目外层oh-package.json5声明依赖路径
这一步是告诉壳工程的依赖管理工具:"外部模块的源码存放在哪个位置"。
操作:打开壳工程lucyTest根目录的oh-package.json5,在dependencies中添加外部模块的本地路径依赖

3.2.4、壳工程使用本地引入的外部模块
配置完成后,在壳工程的页面中通过模块名引入组件并使用:

3.2.5、注意项:
鸿蒙对 UI 组件有严格的语法规范,外部模块的组件需满足首字母大写 + 显式导出,否则壳工程会报 "组件语法不匹配" 或 "找不到导出" 错误。
操作:打开homeTest/home/src/main/ets/components/home.ets,按规范编写组件:

四、私仓引入:HAR包级复用引入方式
4.1、技术原理
私仓引入是把组件编译成 HAR 包(鸿蒙的 "组件归档包",相当于把组件源码打包成一个 "压缩包"),上传到公司内部的 "私有仓库",其他项目从仓库里下载这个 HAR 包来用 ------ 相当于组件是 "成品",不用看源码,直接用,版本升级也更可控。
4.2、具体步骤
4.2.1、把模块编译成 HAR 包
操作:在 DevEco Studio 中选中home模块 → 点击顶部菜单栏Build → 选择Make Module 'home',编译完成后,会在模块的build/outputs/har/目录下生成home.har包


4.2.2、把 HAR 包上传到私仓
把 HAR 包传到公司的 OpenHarmony 私仓,拿到私仓里的组件地址和版本号。
备注:这一步待验证,项目中我还未完整走过这一步,后续再详细补充
4.2.3、在entry的oh-package.json5里引入私仓组件
TypeScript
{
"name": "@xx/home",
"version":"2.0.0-alpha.26",
"description": "xx鸿蒙-首页模块",
"main": "Index.ets",
"author": "",
"license": "Apache-2.0",
"dependencies": {
"xxx/cloudhttp": "^1.0.1-alpha.46", // 私仓组件名@版本号
"xxx/router": "^1.0.0"
},
}
xxx/cloudhttp:是私仓里的组件名;- ^1.0.1-alpha.46:是组件的版本号(语义化版本,方便升级)。
4.2.4、下载依赖并使用
操作:在壳工程entry目录下打开终端,执行以下命令下载私仓依赖:
ohpm clean # 清理旧依赖
ohpm install # 从私仓下载HAR包并安装
依赖安装完成后,在壳工程中通过组件名直接引入使用:
TypeScript
import { Router } from "xxx/router";
五、两种方式的技术对比
| 对比项 | 本地引入 | 私仓引入 |
| 组件形态 | 源码(.ets 文件) | HAR 包(打包后的成品) |
| 复用范围 | 仅当前项目 | 跨项目 / 跨团队 |
| 开发效率 | 高(改代码实时生效) | 中(改代码要重新打包上传) |
| 版本管理 | 无(靠项目代码同步) | 有(语义化版本,比如 1.0.0→1.1.0) |
| 维护成本 | 高(多模块要同步改) | 低(改组件只改 HAR 包) |
| 适用场景 | 项目内频繁修改的公共组件 | 公司内多个项目共用的稳定组件 |
|---|