在ES6(ECMAScript 6.0)模块设计中,使用import语法加载其他文件导出的内容是ECMA规范所定义的语法规则。为支持开发者使用该功能导入Native模块(so)导出的内容,ArkTS进行了相关适配,并提供了以下三类支持写法:直接导入、间接导入和动态导入。
// libentry.so对应的Index.d.ts export const add: (a: number, b: number) => number;
// NameImport.ets
import { add } from 'libentry.so';
add(2, 3); // libentry.so对应的Index.d.ts export const add: (a: number, b: number) => number;
// DefaultImport.ets import entry from 'libentry.so'; entry.add(2, 3);
// libentry.so对应的Index.d.ts export const add: (a: number, b: number) => number;
// NamespaceImport.ets import * as entry from 'libentry.so'; entry.add(2, 3);
// libentry.so对应的Index.d.ts export const add: (a: number, b: number) => number;
// NameExport.ets
// 将libentry.so的API封装后导出
import { add } from 'libentry.so';
export { add }; // NameImportFromExport.ets
// 从中间模块导入API
import { add } from './NameExport';
const result = add(2, 3); // libentry.so对应的Index.d.ts export const add: (a: number, b: number) => number;
// NamespaceExport.ets export * from 'libentry.so';
// NamespaceImportFromExport.ets
import { add } from './NamespaceExport';
add(2, 3);
不支持在导出端使用命名空间导出(export *)的同时在导入端使用命名空间导入(import * as)。
反例:
// test1.ets export * from 'libentry.so';
// test2.ets import * as lib from './test1' // 无法获取lib对象
// libentry.so对应的Index.d.ts export const add: (a: number, b: number) => number;
// DynamicImport.ets
import('libentry.so').then((entry:ESObject) => {
entry.default.add(2, 3);
}) // DynamicExport.ets
import entry from 'libentry.so';
export { entry } // DynamicImportFromExport.ets
import('./DynamicExport').then((ns:ESObject) => {
ns.entry.add(2, 3);
})
不支持动态加载时,导出文件使用命名空间。
反例:
// test1.ets export * from 'libentry.so';
// test2.ets
import('./test1').then((ns:ESObject) => {
// 无法获取ns对象
})