16.6 ECMAScript 6 模块加载器 API
模块除了声明式的语法之外,也有可动态编程的 API 。这允许你:
- 通过动态编程方法使用模块
- 配置模块加载
模块加载器 API 不是 ES6 标准的组成部分
将会在另外一份文档中说明,“ JavaScript 加载器标准”,此标准会比语言规范更加充满活力地改进。该文档的仓库表明:
[JavaScript 加载器规范] 巩固了 ECMAScript 模块加载语义化的工作,同时满足了 Web 浏览器和 Node.js 的模块加载需求。
模块加载器 API 仍然处于制定过程中
正如你在《 the repository of the JavaScript Loader Standard 》中看到的一样,模块加载器 API 仍然处于制定过程中。所有你在本书中读到的相关内容都是试探性的。要得到一个关于这些 API 样子的初步印象,可以看一下 GitHub 上的《the ES6 Module Loader Polyfill》。
16.6.1 加载器
加载器负责解析模块标识符(在 import-from
后的字符串 ID ),加载模块,等等。它们的构造器是 Reflect.Loader 。每一个平台都在全局变量 System
(系统加载器)中维护一个默认实例,该实例实现了模块加载的特殊风格。
16.6.2 加载器方法:引入模块
可以通过动态编程的方式引入模块,使用基于 Promise 的 API :
System.import('some_module')
.then(some_module => {
// Use some_module
})
.catch(error => {
···
});
System.import()
使你能够:
- 在 <script> 元素中(此处不支持模块语法,详细内容参考关于模块和脚本对比的小节)使用模块。
- 根据条件加载模块。
System.import()
获取一个单一的模块,可以使用 Promise.all()
来引入若干个模块:
Promise.all(
['module1', 'module2', 'module3']
.map(x => System.import(x)))
.then(([module1, module2, module3]) => {
// Use module1, module2, module3
});
16.6.3 更多加载器方法
加载器还有很多方法,其中有三个重要的:
System.modules(source, options?)
新建一个模块实例,并在其中执行source
指定的 JavaScript 代码,然后通过 Promise 异步返回创建的模块实例。System.set(name,module)
用于注册一个模块(例如通过System.module()
创建的)。System.define(name,source,options?)
执行source
中的模块代码,然后注册返回的模块实例。
16.6.4 配置模块加载
模块加载器 API 将会有大量的钩子用于配置加载过程。使用场景包括:
- 1、在模块引入的时候检测模块是否有语法错误(例如,通过 JSLint 或 JSHint )。
- 2、在引入的时候自动转换模块(有的模块可能包含 CoffeeScript 或者 TypeScript 代码)。
- 3、使用遗留的模块( AMD , Node.js )。
可配置的模块加载在 Node.js 和 CommonJS 中是做不到的。