动态加载(动态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');
})

最低0.47元/天 解锁文章
9840

被折叠的 条评论
为什么被折叠?



