欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript模块化编程 - CommonJS, AMD ,CMD和 RequireJS之间的关系

程序员文章站 2022-06-13 22:02:17
...
     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();
};});