即使在阅读了很多内容之后,我仍然对 CommonJS、AMD 和 RequireJS感到非常困惑。
我知道 CommonJS (以前称为 ServerJS )是一组用于定义一些 JavaScript 规范(即模块),当该语言在浏览器之外使用时。 CommonJS 模块规范有一些实现,比如 Node.js 或 RingoJS ,对吧?
CommonJS 、 异步模块定义 (AMD) 和 RequireJS 之间有什么关系? RequireJS 是 CommonJS 模块定义的实现吗?如果是,那么 AMD 是什么?
CommonJS 、 异步模块定义 (AMD) 和 RequireJS 之间有什么关系?
RequireJS 是 CommonJS 模块定义的实现吗?如果是,那么 AMD 是什么?
RequireJS 实现了 AMD API (source)。
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用于导出模块内容的变量和一个模块标识符(它描述了与该模块相关的模块的位置),用于需要依赖项(source)。CommonJS 有各种实现,包括你提到的 Node.js 。
require()
CommonJS 的设计并没有特别考虑浏览器,所以它不太适合浏览器环境(*我真的没有这方面的来源——它只是到处都这么说,包括RequireJS 站点。*)显然,这有与异步加载等有关。
另一方面,RequireJS 实现了 AMD,它旨在适应浏览器环境(源代码)。显然,AMD 最初是从 CommonJS 传输格式衍生出来的,并演变成自己的模块定义 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"; }; });