CommonJs是一个组织,它定了一个Modules规范,用来解决JS没有模块(js文件)化管理代码的功能。
关键部分是require - 引入依赖;export - 导出模块这两个函数。然而这个Modules规范当初是为服务器端设计的,是一个同步模式,这种模式并不适合浏览器端,因为浏览器同步模式一个一个加载模块会变得打开非常的慢。所以,这时候AMD就是为了解决这个问题而产生的,它最大的特点就是可以异步加载模块,具体不同在于AMD有一个define函数,他可以让当前模块运行时先加载当前模块所需要的模块。
而RequireJs就是AMD现在用的最广泛,最流行的实现。所以这三者之间的关系可以这样理解:CommonJs(泛指Modules规范)和AMD都是为了解决JS模块化的规范API,CommonJs更适合于服务器端,而AMD基本就是用于浏览器端(不过也可以用于服务器端,比如Node loader方向),而RequireJs就是AMD最流行的实现。
而CMD则是国内玉伯大神在开发SeaJs的时候提出来的,属于CommonJs的一种规范
AMD:RequireJs
CMD : SeaJs
CMD和AMD都是CommonJs的一种规范的实现主义,SeaJs和RequireJs就是对应的实践。说白了就是CMD和AMD是理论,SeaJs和RequireJs是对应的产物。
CMD和AMD的区别:CMD相当于按需加载,定义一个模块的时候不需要立即制定依赖模块,在需要的时候require就可以了(同步的),比较方便;而AMD则相反,定义模块的时候需要制定依赖模块,并以形参的方式引入factory中。
区别看下边例子:
//AMD
define(['dep1','dep2'],function(dep1,dep2){
//内部只能使用制定的模块
return function(){};
});
//CMD
define(function(require,exports,module){
//此处如果需要某XX模块,可以引入
var xx=require('XX');
});
AMD规范后来也允许输出的模块兼容CommonJs规范(同步),这时define方法需要写成下面这样:
define(function (require, exports, module){
var someModule = require("someModule");
var anotherModule = require("anotherModule");
someModule.doTehAwesome();
anotherModule.doMoarAwesome();
exports.asplode = function (){
someModule.doTehAwesome();
anotherModule.doMoarAwesome();
};});
网友评论