本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
在鸿蒙(HarmonyOS)开发中,引用本地模块文件是模块化开发的核心能力。以下是从基础到高级,包含多种引用方式、实际示例和避坑技巧:
一、模块化基础概念
1. 模块类型
模块类型 | 作用 | 示例 |
---|---|---|
应用主模块 | 入口模块,默认名为entry | entry/src/main/ets |
功能模块 | 独立功能单元(可跨应用复用) | feature/src/main/ets |
静态共享包 | 提供工具类、公共组件等 | library.har |
2. 关键配置文件
oh-package.json5
:声明模块依赖关系module.json5
:模块能力声明
二、引用本地模块的5种方式
方式1:通过相对路径引用(同模块内)
// 文件结构
// entry/src/main/ets/
// ├── pages/
// │ └── Index.ets
// └── utils/
// └── Logger.ets
// Index.ets 中引用Logger工具
import { log } from '../utils/Logger'; // 相对路径
@Entry
@Component
struct Index {
onPageShow() {
log('页面加载'); // 调用Logger模块的方法
}
}
适用场景:同一模块内的文件引用。
方式2:引用另一个本地模块(跨模块)
步骤1:配置依赖关系
在主模块的oh-package.json5
中添加依赖:
// entry/oh-package.json5
{
"dependencies": {
"feature": "file:../feature" // 指向本地feature模块
}
}
步骤2:导入并使用
// entry/src/main/ets/pages/Index.ets
import { NewsService } from 'feature/src/main/ets/service/NewsService';
@Entry
@Component
struct Index {
private newsService: NewsService = new NewsService();
build() {
Button('获取新闻')
.onClick(() => {
this.newsService.fetchNews(); // 调用其他模块的方法
})
}
}
关键点:
- 路径格式为
模块名/src/main/ets/...
- 需要先通过
oh-package.json5
建立依赖
方式3:引用静态共享包(.har文件)
步骤1:生成.har包
在模块目录执行:
npm run build # 生成feature.har
步骤2:主模块引用har
// entry/oh-package.json5
{
"dependencies": {
"feature": "file:../feature/build/feature.har" // 指向har文件
}
}
步骤3:导入har中的组件
import { CustomButton } from 'feature';
@Entry
@Component
struct Index {
build() {
Column() {
CustomButton() // 使用har包中的组件
}
}
}
优势:模块代码被编译封装,保护源代码。
方式4:动态加载模块(API 9+)
// 动态导入feature模块的某个文件
import('feature/src/main/ets/utils/Calculator').then((module) => {
const result = module.add(1, 2); // 调用动态加载的方法
});
适用场景:按需加载减少启动耗时。
方式5:通过$r
引用资源文件
// 引用resources目录下的图片
Image($r('app.media.logo'))
// 引用其他模块的资源(需模块导出)
Image($r('feature.media.news_icon'))
资源配置:
resources/
├── base/
│ ├── element/
│ ├── media/ # 图片放这里
│ └── profile/
三、完整项目结构示例
MyApp/
├── entry/ # 主模块
│ ├── oh-package.json5 # 声明依赖feature和library
│ └── src/main/ets/
│ └── pages/...
├── feature/ # 功能模块
│ ├── oh-package.json5 # 声明依赖library
│ └── src/main/ets/
│ ├── service/
│ └── components/...
└── library/ # 静态共享包
├── build/library.har
└── src/main/ets/
└── utils/...
四、避坑指南
1. 路径错误解决方案
错误现象 | 检查点 |
---|---|
Module not found | 1. oh-package.json5 依赖路径是否正确 2. 模块是否被添加到工程配置 |
Resource not found | 1. 资源是否放在resources 目录 2. 文件名是否拼写正确 |
2. 真机调试技巧
// 打印所有已加载模块
console.log(require.context.keys());
// 输出示例:['@entry', '@feature']
3. 多模块资源冲突
若多个模块有同名资源:
// 明确指定模块名
$r('feature.media.icon')
// 替代模糊引用
$r('app.media.icon')
五、高级技巧:模块间通信
1. 使用EventHub
// 发送方(feature模块)
import emitter from '@ohos.events.emitter';
emitter.emit({
eventId: 'refresh_event',
data: { msg: '数据更新' }
});
// 接收方(entry模块)
emitter.on('refresh_event', (data) => {
console.log(data.msg); // 输出:数据更新
});
2. 导出Ability
在目标模块的module.json5
中:
{
"abilities": [{
"name": "DataAbility",
"srcEntry": "./ets/DataAbility.ets",
"exported": true // 允许跨模块访问
}]
}
六、总结
引用方式 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
相对路径 | 同模块内文件引用 | 简单直接 | 无法跨模块 |
跨模块依赖 | 功能拆分的大型项目 | 代码解耦 | 配置稍复杂 |
.har静态包 | 复用公共组件/工具 | 保护源代码 | 更新需重新打包 |
动态导入 | 按需加载 | 减少启动耗时 | 代码分割管理成本高 |
$r资源引用 | 图片/字符串等资源 | 自动适配多分辨率 | 仅限资源文件 |