CommonJs、AMD和CMD比较
1.CommonJS
是以在浏览器环境之外构建 JavaScript 生态系统为目标而产生的项目,比如在服务器和桌面环境中,Node.JS遵循CommonJS的规范。CommonJS 规范是为了解决 JavaScript 的作用域问题而定义的模块形式,可以使每个模块它自身的命名空间中执行。该规范的主要内容是,模块必须使用"exports"对象来做为输出的唯一表示,module.exports 导出对外的变量或接口,通过 require() 来导入其他模块的输出到当前模块作用域中。如:var clock = require('clock'); clock.start();CommonJS 是同步加载模块,是主要为了JS在后端的表现制定的,不适合前端的。
2.AMD
AMD是Asynchronous Module Definition的缩写,意思就是"异步模块定义"(浏览器端模块不能采用"同步加载",只能采用"异步加载"。这是AMD规范诞生的背景)。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。requireJs就是AMD规范的实现。
AMD也采用require()语句加载模块,但是不同于CommonJS,它要求两个参数:require([module], callback);如:
require(['clock'],function(clock){
clock.start();
});
//定义模块:创建一个名为"alpha"的模块,使用了require,exports,和名为"beta"的模块:
define("alpha", ["require", "exports", "beta"], function (require, exports, beta) {
exports.verb = function() {
return beta.verb();
}
});
3.CMD
CMD(Common Module Definition), CMD则是依赖就近,用的时候再require。
CMD是seajs推崇的规范。
它写起来是这样的:
define(function(require, exports, module) {
var clock = require('clock');
clock.start();
});
AMD和CMD最大的区别是对依赖模块的执行时机处理不同。
AMD依赖前置,js可以方便知道依赖模块是谁,立即加载;而CMD就近依赖。
seajs专注于浏览器环境下的模块加载,而requirejs集成了在node环境以及Rhino 环境下的代码,这导致requirejs比seajs更大。