背景
时常接触到模块化,amd,cmd这些东西,但从来没认真去看过,去了解过,糊里糊涂的,这次就想把整个研究透彻。
CommonJS
CommonJS
定义的模块分为:- 模块引用(require)
- 模块输出(exports)
- 模块标识(module)
CommonJS
是一个更偏向于服务端的规范, 是同步加载模块。CommonJS
的一个模块就是一个脚本文件。require命令第一次加载该脚本时就会执行整个脚本,然后在内存中生成一个对象。1
2
3
4
5
6{
id: '...',
exports: { ... },
loaded: true,
...
}为什么不适合浏览器
由于CommonJS是同步加载模块,这对于服务器端不是一个问题,因为所有的模块都放在本地硬盘。等待模块时间就是硬盘读取文件时间,很小。
但是,对于浏览器而言,它需要从服务器加载模块,涉及到网速,代理等原因,一旦等待时间过长,浏览器处于”假死”状态。
所以在浏览器端,不适合于CommonJS规范。所以在浏览器端又出现了一个规范—AMD(AMD是RequireJs在推广过程中对模块定义的规范化产出)。
AMD (AMD是”Asynchronous Module Definition”的缩写,即”异步模块定义”)
- 特点:
- 它采用异步方式加载模块,模块的加载不影响它后面语句的运行。
- AMD也采用require命令加载模块: require([module], callback)