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

2 回复

在HarmonyOS Next中,多模块动态导入可使用动态import()语法实现按需加载。开发者需在模块的oh-package.json5中声明依赖关系,通过异步方式加载模块。具体代码示例:

// 动态导入模块
const module = await import('modulePath');
module.functionName();

模块路径需遵循系统规范,支持相对路径和绝对路径。动态导入的模块会被单独打包,运行时按需加载。注意模块需提前配置在项目的模块依赖中。该特性适用于代码分割和资源优化场景。

更多关于HarmonyOS鸿蒙Next中多模块import动态导入的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中实现模块动态导入需要注意以下几点:

  1. 模块路径问题:确保动态导入的模块名称与package.json中的依赖名称完全匹配。当前代码中let harName = 'yiyuan',但实际应该使用完整的模块标识符。

  2. 模块导出规范:确保yiyuan模块正确导出了所有需要动态访问的类和方法。当前代码看起来导出是正确的。

  3. 依赖循环问题:XuYangGameSDK和yiyuan模块互相依赖可能导致问题。建议采用接口抽象的方式解耦。

  4. 日志问题:检查hilog的日志级别设置,确保不是被过滤掉了。

建议修改方案:

  1. 在XuYangGameSDK中定义接口:
export interface IChannelManager {
  init(): void;
  static initchannel(): void;
}
  1. 修改动态导入代码:
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);
}
  1. 确保yiyuan模块的package.json中正确声明了exports字段。

  2. 检查构建配置,确保动态导入的模块被打包到最终产物中。

回到顶部