HarmonyOS7 工程化:hvigor 构建与多模块拆分配置

📅 2026/7/17 7:20:19 👁️ 阅读次数 📝 编程学习
HarmonyOS7 工程化:hvigor 构建与多模块拆分配置

文章目录

    • 前言
    • hvigor 是什么
      • 代码实现
    • 模块类型:HAP / HAR / HSP
    • 新建一个 HAR 库模块
      • 核心代码
      • 完整示例
    • 主模块引用库
      • 代码解析
      • 实现拆解
    • 多模块构建配置
      • 代码清单
    • 拆分的经验法则
    • 常见误区(小白必踩)
    • 完整可运行示例:hvigor 多模块配置
      • 关键代码
    • 写在最后

前言

项目小的时候,所有代码塞一个entry模块没问题。但等项目变大、多人协作、要复用组件库,就必须做模块化拆分

HarmonyOS 用hvigor(基于 TS 的构建工具,类似前端的 Gradle/Webpack)管理构建和模块。这篇文章讲清:hvigor 是干嘛的、模块怎么拆(HAR/HSP)、多模块工程怎么配置。

hvigor 是什么

hvigor是鸿蒙的构建引擎,负责把你的 ArkTS 代码编译、打包成 app。你平时点 DevEco 的"运行"按钮,背后就是它在干活。

工程根目录的关键文件:

代码实现

project/ ├── build-profile.json5 # 工程级构建配置(签名、设备类型) ├── hvigorfile.ts # 根构建脚本 ├── entry/ # 主模块 │ └── hvigorfile.ts └── library/ # 共享库模块 └── hvigorfile.ts

每个模块都有自己的hvigorfile.ts,决定它是"应用模块"还是"库模块"。

模块类型:HAP / HAR / HSP

类型全称用途
HAPHarmonyOS Ability Package可独立运行的业务模块(如 entry)
HARHarmonyOS Ability Resource静态共享库,编译时拷贝进引用方
HSPHarmonyOS Shared Package动态共享包,运行时共享

记忆法:HAP 是"能跑的 app 模块";HAR 是"打包时复制的库"(每个引用方都留一份);HSP 是"运行时共享的库"(多模块共用一份,省包体)。

新建一个 HAR 库模块

把通用组件、工具函数抽到 HAR,供多个业务模块复用:

核心代码

// library/index.ets 导出的公共能力exportclassDateUtil{staticformat(ts:number):string{returnnewDate(ts).toLocaleString()}}exportconstCOLORS={primary:'#4A90E2'}

library/hvigorfile.ts里声明它是 HAR:

完整示例

import{harTasks}from'@ohos/hvigor-ohos-plugin'exportdefault{system:harTasks,// 标记为 HAR 库plugins:[]}

主模块引用库

entry/oh-package.json5里依赖这个库:

代码解析

{ "dependencies": { "mylibrary": "file:../library" } }

然后代码里直接 import 用:

实现拆解

import{DateUtil,COLORS}from'mylibrary'Text(DateUtil.format(Date.now())).fontColor(COLORS.primary)

多模块构建配置

build-profile.json5里声明产品形态和签名:

代码清单

{ "modules": [ { "name": "entry", "srcPath": "./entry", "targets": [{ "name": "default" }] }, { "name": "library", "srcPath": "./library" } ], "app": { "signingConfigs": [{ "name": "default", "material": { /* 签名文件 */ } }], "products": [{ "name": "default", "signingConfig": "default" }] } }

拆分的经验法则

  • 通用 UI 组件、工具类 → 抽HAR(如uicomponentsutils)。
  • 多个 HAP 都要用的"大块功能"(如分享、登录)→ 抽HSP,省包体。
  • 业务逻辑独立、可单独上架 → 抽HAP(feature 模块)
  • 模块之间禁止循环依赖(A 依赖 B,B 不能又依赖 A)。

常见误区(小白必踩)

误区说明
模块循环依赖A 依赖 B、B 又依赖 A,编译直接死循环,画依赖图避免。
HAR/HSP 选错小轻通用件用 HAR,重大块共用件用 HSP 省包体,别乱用。
通用件不抽库CommonButton复制了三遍还不抽,维护噩梦。

下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲,改一改文末「动手改一改」里的参数,亲眼看看效果。

完整可运行示例:hvigor 多模块配置

build-profile.json5里拆出独立feature模块。

关键代码

// build-profile.json5(节选) { "modules": [ { "name": "entry", "srcPath": "./entry", "targets": [{ "name": "default" }] }, { "name": "feature_home", "srcPath": "./feature_home", "targets": [{ "name": "default" }] } ] }

你会看到什么entry是主模块,feature_home是独立业务模块。编译后各模块可单独构建、按需加载,大项目协作不再互相阻塞。

动手改一改

  • 新建feature_cart模块并在modules注册,体验增量编译。
  • oh-package.json5里把公共库抽成 HAR 依赖。
  • hvigorw assembleHap只构建指定模块,看速度提升。

写在最后

工程化前期麻烦,后期省命。模块拆分的核心判断是:这段代码会不会在别处复用?会,就抽库(HAR/HSP);业务独立,就拆 HAP

别等项目烂到改一处崩三处才想起重构。现在就看看你的entry里有没有"明显通用"的组件,先抽一个 HAR 出来练手——模块化思维一旦建立,后面越写越顺。