即使阅读了很多书,我仍然对 CommonJS,AMD 和 RequireJS 感到非常困惑。
我知道 CommonJS (以前称为 ServerJS )是用于在浏览器之外使用该语言时定义一些 JavaScript 规范(即模块)的组。 CommonJS 模块规范具有一些实现,例如 Node.js 或 RingoJS ,对吗?
CommonJS , 异步模块定义 (AMD)和 RequireJS 之间有什么关系?
是 RequireJS 的的实现 CommonJS的 模块定义?如果是,那么 AMD 是什么?
RequireJS 实现 AMD API
CommonJS 是在exports对象的帮助下定义模块的方法,该对象定义了模块的内容。简而言之,CommonJS实现可能如下所示:
exports
// someModule.js exports.doSomething = function() { return "foo"; }; //otherModule.js var someModule = require('someModule'); // in the vein of node exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
基本上,CommonJS指定您需要具有一个require()用于获取依赖项的函数,一个exports用于导出模块内容的变量以及一个用于要求依赖项的模块标识符描述了该模块相对于该模块的位置。CommonJS具有各种实现,包括您提到的 Node.js。
require()
CommonJS并不是专门为浏览器而设计的,因此它不太适合浏览器环境我确实没有相关资源-它在包括[RequireJS网站在内的所有地方都这么说显然,这有一些不足之处异步加载等
另一方面,RequireJS实现了AMD,旨在适应浏览器环境。显然,AMD最初是从CommonJSTransport格式衍生出来的,后来演变为自己的模块定义API。因此,两者之间的相似之处。AMD中的新功能是define()允许模块在加载之前声明其依赖性的功能。例如,定义可以是:
define()
define('module/id/string', ['module', 'dependency', 'array'], function(module, factory function) { return ModuleContents; });
因此,CommonJS和AMD是 JavaScript 模块定义API,它们具有不同的实现,但是它们来自相同的来源。
更令人困惑的是,RequireJS在作为AMD实现时提供了CommonJS包装器,因此CommonJS模块几乎可以直接导入以与RequireJS一起使用。
define(function(require, exports, module) { var someModule = require('someModule'); // in the vein of node exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; }; });
我希望这有助于澄清问题!