模块化运行简介
=======

为了解决大型或复杂应用开发过程中，部分代码编译时被多次拷贝导致包体积增大、文件依赖、代码与资源共享困难以及单例和全局变量污染等问题，ArkTS支持应用模块化编译、打包和运行，简化代码的编写与维护。

模块化是将ArkTS/TS/JS模块（一个文件对应一个模块）以及so模块通过编译工具或运行时机制将这些[模块加载](#模块化运行加载流程)、解析、组合并执行的过程。

ArkTS支持的模块类型包括ets/ts/js文件、json文件、Native模块。ArkTS中支持[ECMAScript模块规范](#ecmascript模块)及[CommonJS模块规范](#commonjs模块)，此外，ArkTS也对加载方式进行了拓展，包含[动态加载](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-dynamic-import)、静态加载、[延迟加载](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-lazy-import)、[同步动态加载Native模块](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/js-apis-load-native-module)和[Node-API接口加载文件](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/load-module-base-nodeapi)。

#### 模块化运行加载流程

ArkTS模块化运行根据ECMAScript模块规范实现，以后序遍历的方式执行模块：从模块图的最左侧子树开始，执行模块，然后执行它们的同级，然后执行它们的父级。此算法递归运行，直至执行到模块图的根。

以下图为例，每个父节点加载对应子节点，并按import顺序执行同级。模块图文件执行顺序为：D->F->G->E->B->I->H->C->A。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/ce/v3/5iqd6JBCQC-gKhCfCgEf0Q/zh-cn_image_0000002594827586.png?HW-CC-KV=V1&HW-CC-Date=20260612T073250Z&HW-CC-Expire=86400&HW-CC-Sign=3C2D0F624623E20A6ACA6687BB0335FC1D10294988DFB9D7C37187EE732F07E6)

A文件称为入口文件，即执行起点。一些内置的加载接口，如[windowStage.loadContent](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-window-window#loadcontent9)和[路由跳转](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-navigation-architecture)等页面拉起接口（即不是通过import写法拉起的文件），入参文件都会作为入口文件执行。

以A文件为入口，会加载一整套文件，包括A文件及其依赖文件，以及这些文件后续依赖的文件，直到各分支的叶节点。

普通模块在同一线程内只加载一次，而在不同线程中会加载多次，每个线程都会生成新的模块对象。如果需要在进程内只加载一次，请使用[共享模块](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-sendable-module)。

#### ArkTS支持的模块化规范

#### \[h2\]ECMAScript模块

ECMAScript模块（ECMAScript Modules，后文称ES Module）是JavaScript自ECMAScript6.0之后，从标准层面（ECMAScript® 2025 Language Specification (tc39.es)）实现的模块功能。其模块功能由两个命令组成：export和import。

ArkTS中export和import用法详见[ArkTS语言介绍](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/introduction-to-arkts#模块)。

#### \[h2\]CommonJS模块

CommonJS模块是JavaScript社区2009年提出的标准，首先在Node.js采用部分标准并实现。CommonJS将每个文件视为一个模块，通过module变量代表当前模块，module.exports即为该模块对外导出的变量，每个模块还拥有exports变量（exports === module.exports）。

模块导入和模块导出写法参考下表：

| 加载类型 | 模块导入 | 模块导出（不能把module.exports与exports混用） |
| :-- | :-- | :-- |
| 变量 | const ohos = require('ohos') | exports.add = add或module.exports.name = name |
| 变量 | const ohos = require('ohos') | module.exports = add |
| 函数 | 
const ohos = require('ohos')

ohos.fun();

 | exports.fun = function foo () {}或module.exports.fun = function foo () {} |

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/c5/v3/NW_CBdItQ5C0FkmBOzbvvw/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073250Z&HW-CC-Expire=86400&HW-CC-Sign=E1D10E3A493598DD5929C9EAA9BB25DA790F9EB49C60C3636CFC3C8AC940E70C)

CommonJS模块仅适用于第三方包的导出，不支持在工程中创建和使用。

#### \[h2\]CommonJS与ES Module支持规格

CommonJS与ES Module互相引用的规格如下表所示，导入和导出语法需遵循各自的模块规范。

| 互相引用关系 | ES Module 导出 | CommonJS导出 |
| :-- | :-- | :-- |
| **ES Module 导入** | 支持 | 支持 |
| **CommonJS导入** | 不支持 | 支持 |

#### ArkTS支持加载的模块类型

#### \[h2\]ets/ts/js

加载ets/ts/js模块类型时，需遵循[ECMAScript模块规范](#ecmascript模块)及[CommonJS模块规范](#commonjs模块)。

#### \[h2\]JSON文件

JSON（JavaScript Object Notation）是一种轻量级的数据交互格式，采用完全独立于编程语言的文本格式来存储和表示数据。

JSON文件只能使用default方式导入，如下所示：

import data from './ImportJson.json';

#### \[h2\]Native模块

Native模块（so）的导入导出与加载ets/ts/js语法规格一致。详情请参考：[静态方式加载native模块](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-import-native-module)。

![](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_scene_100_1/b1/v3/9W5z6iHRS1GitibZwQSD8Q/note_3.0-zh-cn.png?HW-CC-KV=V1&HW-CC-Date=20260612T073250Z&HW-CC-Expire=86400&HW-CC-Sign=D6E22512CD1D2EB242B798F0B66ECE26814F96148F2E9D31A080EAE5BBAB4E18)

Native模块不支持在CommonJS模块中导入。

示例：

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

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