ECMAScript 6 模块规范出现之前,虽然浏览器原生不支持模块的行为,但迫切需要这样的行为。
ECMAScript 同样不支持模块,因此希望使用模块模式的库或代码库必须基于 JavaScript 的语法和词法特性“伪造”出类似模块的行为。

26.1 理解模块模式

26.2 凑合的模块系统

26.3 使用es6之前的模块加载器

26.3.1 CommonJS

CommonJS 规范概述了同步声明依赖的模块定义。这个规范主要用于在服务器端实现模块化代码组织,但也可用于定义在浏览器中使用的模块依赖,CommonJS 模块语法不能在浏览器中直接运行。

CommonJS 模块定义需要使用 require()指定依赖,而使用 exports 对象定义自己的公共 API。

  1. var moduleB = require('./moduleB');
  2. module.exports = {
  3. stuff: moduleB.doStuff();
  4. };

无论一个模块在 require()中被引用多少次,模块永远是单例。在下面的例子中,moduleA 只会被打印一次。无
论请求多少次,moduleA 只会被加载一次。

  1. var a1 = require('./moduleA');
  2. var a2 = require('./moduleA');
  3. console.log(a1 === a2); // true

26.3.2 异步模块定义

CommonJS 以服务器端为目标环境,能够一次性把所有模块都加载到内存,而异步模块定义(AMD)的模块定义系统则以浏览器为目标执行环境,这需要考虑网络延迟的问题。
AMD 的一般策略是让模块声明自己的依赖,而运行在浏览器中的模块系统会按需获取依赖,并在依赖加载完成后立即执行依赖它们的模块。

26.3.3 通用模块定义

26.4 使用es6模块

CommonJS 运行时加载 值为缓存
es6 编译时加载 值为动态绑定

  • CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
  • CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。
  • CommonJS 模块的require()是同步加载模块,ES6 模块的import命令是异步加载,有一个独立的模块依赖的解析阶段。