【HarmonyOS】HMRouter关键原理-动态import

动态加载(动态import)

使用场景

如果希望根据条件导入模块或者按需导入模块,可以使用动态导入代替静态导入

  • 当静态导入的模块明显降低了代码的加载速度而且被使用的可能性较低
  • 当静态导入的模块明显占用的大量内存资源且被使用的可能很低
  • 当被导入的模块在加载时并不存在,需要异步获取
  • 当被导入的模块说明符,需要动态构建时(静态导入只能使用静态说明符)
  • 当被导入的模块有副作用,如模块中会直接运行的代码时

动态import介绍

  • 当前所有import中使用的模块名是依赖方oh-package.json5的dependencies中的别名
  • import一个模块名,实际上机会import该模块的入口文件,一般为Index.ets

常量动态import

//HAR模块的Index.ets
export {
   
   add,swap} from './src/main/ets/pages/page2'
//HAP模块
import('testhar/Index').then((ns: ESObject) => {
   
   
  console.log('[result:]' + ns.add(1,2))
})
  

变量动态import

概述

  • 在方舟编译器中,模块间的依赖关系通过oh-package.json5中的dependencies字段来配置,这字段中的所有模块都会进行安装,但是默认不参与编译
  • HAP编译时会以入口文件开始搜索依赖关系,搜索的到的模块会加入编译,import顺序为后序遍历(不同的模块之间的联系抽象为树结构)
  • 在编译时,静态import和常量动态import可以被打包工具识别,并被加入依赖树种,参与编译,最终生成方舟字节码。
  • 但是如果是变量动态import,在编译时无法确定变量的值,也就无法加入编译,而要加入编译,就要额外进行一些配置,用于指定动态import的变量实际的值

配置runtimeOnly

//在在HAP/HSP/HAR的build-profile.json5中
"buildOption": {
   
   
  "arkOptions": {
   
   
    "runtimeOnly": {
   
   
      "packages": [ "myhar" ],  // 配置本模块变量动态import其他模块名,要求与dependencies中配置的名字一致。
      "sources": [ "./src/main/ets/utils/Calc.ets" ]  // 配置本模块变量动态import自己的文件路径,路径相对于当前build-profile.json5文件。
    }
  }
}

使用实例

// 变量动态import其他模块myhar
let harName = 'myhar';
import(harName).then((obj: ESObject) => {
   
   
    console.info('DynamicImport I am a har');
})

// 变量动态import本模块自己的单文件src/main/ets/index.ets
let filePath = './utils/Calc';
import(filePath).then((obj: ESObject) => {
   
   
    console.info('DynamicImport I am a file');
})

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值