CommonJs、AMD和CMD比较

作者:Kinglong    发表时间:2023-07-16 07:05   

关键词:  

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更大。