【HarmonyOS】鸿蒙应用子模块module资源如何获取
在多模块的鸿蒙应用中获取子模块HAR/HSP的资源主要有三种方式。从API 12开始官方推荐的语法是$r([模块名].type.name)和$rawfile([模块名].filename)这让跨模块资源的访问变得和访问本模块资源一样直观。下面整理了三种主流方案你可以根据实际情况选择。方案一使用$r/$rawfile直接引用推荐这是从 API 12 开始支持的语法写法最简洁也最符合直觉。ts// 引用 HSP/HAR 模块中的字符串资源 Text($r([hsp_module_name].string.test_string)) .fontSize($r([hsp_module_name].float.font_size)) .fontColor($r([hsp_module_name].color.font_color)) // 引用 HSP/HAR 模块 rawfile 目录下的图片资源 Image($rawfile([hsp_module_name].icon.png))关键点[模块名]必须是方括号括起来且与oh-package.json5中定义的模块名完全一致。如果rawfile下有多层目录需要从rawfile后面的第一个目录开始写例如$rawfile([hsp].oneFile/twoFile/icon.png)。注意使用这种方式编译器无法在编译时校验资源是否存在需要开发者自行确保资源在对应模块中。方案二通过createModuleContext创建上下文获取如果需要通过代码动态获取或需要更精细地控制资源加载可以使用createModuleContext接口来获取指定模块的Context然后通过ResourceManager来获取资源。注意getContext(this).createModuleContext()从API Version 12开始废弃推荐使用application.createModuleContext替代。tsimport { application, common } from kit.AbilityKit; import { BusinessError } from kit.BasicServicesKit; try { // 1. 通过 application 创建子模块的 Context (API 12) const moduleContext await application.createModuleContext(this.context, 模块名); // 2. 通过这个 Context 获取资源 const stringRes await moduleContext.resourceManager.getStringByNameSync(app.string.xxx); const rawFd await moduleContext.resourceManager.getRawFd(test.mp3); } catch (error: BusinessError) { // 处理获取失败的情况 }说明这种方式本质上是为不同模块创建了一个独立的上下文环境从而允许你通过它去访问该模块独有的资源目录。方案三封装资源管理类导出这是一种比较经典的工程化方案。在子模块中定义一个类将资源以Resource类型的形式封装好并导出其他模块通过调用这个类的方法来获取资源。1. 在子模块如hsp_library中封装ts// hsp_library/src/main/ets/ResManager.ets export class HspResManager { // 封装图片资源 static getAppIcon(): Resource { return $r(app.media.app_icon); } // 封装字符串资源 static getAppDesc(): Resource { return $r(app.string.shared_desc); } }ts// hsp_library/Index.ets export { HspResManager } from ./src/main/ets/ResManager;2. 在使用方模块如entry中调用tsimport { HspResManager } from hsp_library; // 使用 Text(HspResManager.getAppDesc()) .fontSize(20) Image(HspResManager.getAppIcon()) .height(100)优点编译时检查、代码提示完善、资源归属清晰。 资源覆盖与优先级规则当多个模块定义了同名资源时遵循以下覆盖规则优先级从高到低当前 HAP 包自身模块。直接依赖的 HAR 模块。如果依赖了多个 HAR按照oh-package.json5中dependencies的声明顺序前面的优先级高于后面的。传递依赖的 HAR 模块。小技巧为了避免资源被意外覆盖可以为不同模块的资源添加命名前缀例如moduleA_primary_color。