# 静态方式加载Native模块

在ES6(ECMAScript 6.0)模块设计中，使用import语法加载其他文件导出的内容是ECMA规范所定义的语法规则。为支持开发者使用该功能导入Native模块（so）导出的内容，ArkTS进行了相关适配，并提供了以下三类支持写法：直接导入、间接导入和动态导入。

## 直接导入

在Native模块的Index.d.ts文件中导出，并在文件内直接导入。

### 具名导入

```TypeScript
// libentry.so对应的Index.d.ts
export const add: (a: number, b: number) => number;
```

```TypeScript
// NameImport.ets
import { add } from 'libentry.so';
add(2, 3);
```

### 默认导入

```TypeScript
// libentry.so对应的Index.d.ts
export const add: (a: number, b: number) => number;
```

```TypeScript
// DefaultImport.ets
import entry from 'libentry.so';
entry.add(2, 3);
```

### 命名空间导入

```TypeScript
// libentry.so对应的Index.d.ts
export const add: (a: number, b: number) => number;
```

```TypeScript
// NamespaceImport.ets
import * as entry from 'libentry.so';
entry.add(2, 3);
```

## 间接导入

### 转为具名变量导出再导入

```TypeScript
// libentry.so对应的Index.d.ts
export const add: (a: number, b: number) => number;
```

```TypeScript
// NameExport.ets
// 将libentry.so的API封装后导出
import { add } from 'libentry.so';
export { add };
```

```TypeScript
// NameImportFromExport.ets
// 从中间模块导入API
import { add } from './NameExport';
const result = add(2, 3);
```

### 转为命名空间导出再导入

```TypeScript
// libentry.so对应的Index.d.ts
export const add: (a: number, b: number) => number;
```

```TypeScript
// NamespaceExport.ets
export * from 'libentry.so';
```

```TypeScript
// NamespaceImportFromExport.ets
import { add } from './NamespaceExport';
add(2, 3);
```

> 注意
>
> 不支持在导出端使用命名空间导出（export *）的同时在导入端使用命名空间导入（import * as）。

**反例：**

```TypeScript
// test1.ets
export * from 'libentry.so';
```

```TypeScript
// test2.ets
import * as lib from './test1'
// 无法获取lib对象
```

## 动态导入

### 直接导入

```TypeScript
// libentry.so对应的Index.d.ts
export const add: (a: number, b: number) => number;
```

```TypeScript
// DynamicImport.ets
import('libentry.so').then((entry:ESObject) => {
  entry.default.add(2, 3);
})
```

### 间接导入

```TypeScript
// DynamicExport.ets
import entry from 'libentry.so';
export { entry }
```

```TypeScript
// DynamicImportFromExport.ets
import('./DynamicExport').then((ns:ESObject) => {
  ns.entry.add(2, 3);
})
```

> 注意
>
> 不支持动态加载时，导出文件使用命名空间。

**反例：**

```TypeScript
// test1.ets
export * from 'libentry.so';
```

```TypeScript
// test2.ets
import('./test1').then((ns:ESObject) => {
    // 无法获取ns对象
})
```

