一、AMD
AMD
是英文 Asynchronous Module Definition
(异步模块定义)的缩写,它是由 JavaScript
社区提出的专注于支持浏览器端模块化的标准。从名字就可以看出它与 CommonJS
和 ES6Module
最大的区别在于它加载模块的方式是异步的。下面的例子展示了如何定义一个 AMD
模块。
define('getSum', ['calculator'], function(math) {
return function(a, b) {
console.log('sum: ' + calculator.add(a, b));
}
});
在 AMD
中使用 define
函数来定义模块,它可以接受3个参数。
-
第1个参数是当前模块的
id
,相当于模块名; -
第2个参数是当前模块的依赖,比如上面我们定义的
getSum
模块需要引入calculator
模块作为依赖; -
第3个参数用来描述模块的导出值,可以是函数或对象。如果是函数则导出的是函数的返回值;如果是对象则直接导出对象本身。
和 CommonJS
类似,AMD
也使用 require
函数来加载模块,只不过采用异步的形式。
require(['getSum'], function(getSum) {
getSum(2, 3);
});
通过 AMD
这种形式定义模块的好处在于其模块加载是非阻塞性的,当执行到 require
函数时并不会停下来去执行被加载的模块,而是继续执行 require
后面的代码,这使得模块加载操作并不会阻塞浏览器。
尽管 AMD
的设计理念很好,但与同步加载的模块标准相比其语法要更加冗长。另外其异步加载的方式并不如同步显得清晰,并且容易造成回调地狱(callback hell)。在目前的实际应用中已经用得越来越少,大多数开发者还是会选择 CommonJS
或 ES6 Module
的形式。
网友评论