HarmonyOS鸿蒙Next中多模块import动态导入
HarmonyOS鸿蒙Next中多模块import动态导入
同一个项目中,我有三个本地模块entry,XuYangGameSDK,yiyuan,其中XuYangGameSDK和yiyuan模块已源码的形式存在
现在entry已经依赖了xuyanggamesdk模块
"dependencies": {
"xuyanggamesdk": "file:../xuyanggamesdk",
}
同时yiyuan模块也依赖了xuyanggamesdk模块
"dependencies": {
"xuyanggamesdk": "file:../xuyanggamesdk",
}
现在想xuyanggamesdk模块动态导入yiyuan模块实现解耦,将具体的实现放在yiyuan模块中,我尝试了在xuyanggamesdk中添加如下
"dependencies": {
"yiyuansdk": "file:./libs/YiYuanSDK.har",
"yiyuan": "file:../yiyuan"
}
try {
let harName = 'yiyuan';
import(harName).then((module : ESObject) => {
//通过字符串动态访问类
LogUtils.info("initSDK channel SDK11111111111")
const className = 'subsubTransferChannelManager';
const classTypeneed:ESObject = module[className]
// 通过字符串动态访问方法
const methodName = 'init';
const staticmethodName = 'initchannel';
const funcmethodName = 'inita';
const instance:ESObject = new classTypeneed();
instance[methodName]()
classTypeneed[staticmethodName]()
module[funcmethodName]()
LogUtils.info("initSDK channel SDK22222222222")
})
} catch (err) {
}
然后在yiyuan模块中,编写类如下
import { LogUtils } from 'xuyanggamesdk';
import hilog from "@ohos.hilog"
// import { LogUtils } from 'xuyanggamesdk/src/main/ets/utils/LogUtils';
//具体子类的执行
export class subsubTransferChannelManager {
constructor() {
}
public init(): void {
hilog.info(0xFF00,"XuYangGameSDK","start initSDK channel SDK subsubTransferChannelManager init")
LogUtils.info("start initSDK channel SDK subsubTransferChannelManager init")
}
public static initchannel(): void {
hilog.info(0xFF00,"XuYangGameSDK","start initSDK channel SDK subsubTransferChannelManager initchannel")
LogUtils.info("start initSDK channel SDK subsubTransferChannelManager init")
}
}
export function inita(){
hilog.info(0xFF00,"XuYangGameSDK","start initSDK channel SDK subsubTransferChannelManager inita")
}
现在的问题是:yiyuan模块内的日志没有打印,xuyanggamesdk模块动态导入的前后日志能够打印,不知道具体原因
烦请大佬们,告知一下,该如何修改:因为xuyanggamesdk模块最后动态导入类似于很多yiyuan这样的模块,每个模块实现不一样
更多关于HarmonyOS鸿蒙Next中多模块import动态导入的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中实现模块动态导入需要注意以下几点:
-
模块路径问题:确保动态导入的模块名称与package.json中的依赖名称完全匹配。当前代码中
let harName = 'yiyuan'
,但实际应该使用完整的模块标识符。 -
模块导出规范:确保yiyuan模块正确导出了所有需要动态访问的类和方法。当前代码看起来导出是正确的。
-
依赖循环问题:XuYangGameSDK和yiyuan模块互相依赖可能导致问题。建议采用接口抽象的方式解耦。
-
日志问题:检查hilog的日志级别设置,确保不是被过滤掉了。
建议修改方案:
- 在XuYangGameSDK中定义接口:
export interface IChannelManager {
init(): void;
static initchannel(): void;
}
- 修改动态导入代码:
try {
import('yiyuan').then((module: ESObject) => {
const ChannelManager = module['subsubTransferChannelManager'] as IChannelManager;
new ChannelManager().init();
ChannelManager.initchannel();
module['inita']();
});
} catch (err) {
console.error('Dynamic import failed:', err);
}
-
确保yiyuan模块的package.json中正确声明了exports字段。
-
检查构建配置,确保动态导入的模块被打包到最终产物中。