
文章目录前言HAR静态共享库编译时拷贝代码实现HSP动态共享包运行时共享核心代码核心差异一张表实践踩坑常见误区小白必踩完整可运行示例HAR 共享库完整示例写在最后前言项目做大了你会发现很多代码在重复每个业务模块都写了一遍日期格式化“网络封装”“通用按钮”。这时候就该组件化——把公共部分抽成共享库。HarmonyOS 里共享库有两类HAR和HSP。它们名字像、用途像但有个关键区别影响包体。这篇文章把两者的实践差异讲透帮你选对。HAR静态共享库编译时拷贝HAR 在编译阶段被拷贝进每个引用它的模块。A 模块用了、B 模块也用了打包后 A、B 里各有一份这份代码的副本。代码实现// 定义 HAR 导出的 UI 组件// mycomponents/Index.etsexportstruct CommonButton{Proplabel:stringbuild(){Button(this.label).width(100%).height(44).borderRadius(8)}}// 引用方 oh-package.json5{dependencies:{mycomponents:file:../mycomponents}}HAR 适合导出组件、工具、资源。多个模块引用各留一份副本——代码量小没关系大了就占包体。HSP动态共享包运行时共享HSP 只存在一份所有引用方运行时共享它。A、B 都用包里只有一份代码。核心代码// hsp 模块的 hvigorfile.tsimport{hspTasks}fromohos/hvigor-ohos-pluginexportdefault{system:hspTasks,plugins:[]}// 声明为 HSP// 引用方式和 HAR 一样在 oh-package.json5 依赖即可HSP 适合体积大、被多个模块共用的能力如分享 SDK、地图 SDK。省包体但构建配置稍复杂且 HSP 不能被独立分发。核心差异一张表维度HARHSP存在时机编译时拷贝到引用方运行时共享一份包体影响多引用方→多副本多引用方→一份省空间资源图片等可带资源可带资源适用小组件、工具大块共用能力独立上架可随引用方不可独立一句话决策小、轻、可能被多处直接用的 UI/工具 → HAR大、重、明确多模块共用的 → HSP。实践踩坑循环依赖HAR A 依赖 HAR BB 不能又依赖 A否则编译死循环。HSP 引用 HARHSP 可以依赖 HAR反过来 HAR 不能依赖 HSP。资源冲突两个库都定义了同名资源注意命名空间避免覆盖。API 9 之前没 HSP老项目只有 HAR新项目优先 HSP 省包体。常见误区小白必踩误区说明模块循环依赖HAR A 依赖 B、B 又依赖 A编译死循环。HSP 依赖 HAR 反了HSP 可以依赖 HAR反过来 HAR 不能依赖 HSP。资源命名冲突两个库都定义了同名资源注意命名空间避免覆盖。老项目只用 HAR包体吃紧时把最大的共用块转 HSP 省空间。下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲改一改文末「动手改一改」里的参数亲眼看看效果。完整可运行示例HAR 共享库把通用组件打成 HAR多模块复用。完整示例// 在 HAR 模块里导出组件// my-har/src/main/ets/Button.etsComponentexportstruct PrimaryButton{Proplabel:string按钮build(){Button(this.label).width(100%).backgroundColor(#007DFF)}}// 使用方 oh-package.json5声明依赖 { dependencies: { my/har: file:../my-har } }你会看到什么主工程import { PrimaryButton } from my/har即可复用按钮改一处 HAR 全工程生效。HSP则更进一步——多模块共享同一份运行时实例适合主题、登录态等。动手改一改把PrimaryButton抽成HSP对比与 HAR 的引用方式。给 HAR 加Index.ets统一导出多个组件。用ohpm publish把 HAR 发到私有仓团队共享。写在最后组件化的本质是分而治之 复用。HAR 和 HSP 不是二选一难题轻量通用件用 HAR重量共用件用 HSP。把项目的通用按钮、网络层、工具类先抽成 HAR 跑通等体量上来、包体吃紧再把最大的那块转 HSP。别等代码重复到没法维护才动手。今天就把那个被复制了三遍的CommonButton抽成 HAR——这一步是你工程素养的分水岭。