模块规范

AMD 规范和 CommonJS

以同样的方式编写模块,就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。

CommonJS

node.js的模块系统,就是参照CommonJS规范实现的。在CommonJS中,有一个全局性方法require(),用于加载模块。假定有一个数学模块math.js,就可以像下面这样加载。

1
var math = require('math');

然后,就可以调用模块提供的方法:

1
2
var math = require('math');
math.add(2,3); // 5

主要适用于 node 环境

AMD

AMD 是 “Asynchronous Module Definition” 的缩写,意思就是”异步模块定义”。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

AMD 也采用 require() 语句加载模块,但是不同于 CommonJS ,它要求两个参数:

1
require([module], callback);

第一个参数 [module],是一个数组,里面的成员就是要加载的模块;第二个参数 callback,则是加载成功之后的回调函数。如果将前面的代码改写成AMD形式,就是下面这样:

1
2
3
require(['math'], function (math) {
math.add(2, 3);
});

math.add()与math模块加载不是同步的,浏览器不会发生假死。所以很显然,AMD比较适合浏览器环境。

目前,主要有两个Javascript库实现了AMD规范:require.js和curl.js。

按照AMD的规定,模块必须采用特定的define()函数来定义

1
2
3
4
5
6
7
8
9
// math.js
define(function (){
var add = function (x,y){
return x+y;
};
return {
add: add
};
});

如 Zepto 只使用了 AMD 规范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* Zepto v1.2.0 - zepto event ajax form ie - zeptojs.com/license */
(function(global, factory) {
if (typeof define === 'function' && define.amd)
define(function() { return factory(global) })
else
factory(global)
}(this, function(window) {
var Zepto = (function() {

// ...

return $
})()

window.Zepto = Zepto
window.$ === undefined && (window.$ = Zepto)

return Zepto
}))

只使用了 AMD 规范的模块导出方法 define,没有用 CommonJs 规范的方法 module.exports 来导出模块

CMD

SeaJS 的 CMD 规范,与 AMD 非常类似,是国人开发的。

本文结束,感谢您的阅读