RequireJS 实现了 AMD API (来源)。
CommonJS 是一种通过 exports
对象来定义模块内容的方式。简单来说,CommonJS 的实现可能像这样:
exports.doSomething = function() { return "foo"; };
var someModule = require('someModule');
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
基本上,CommonJS 指定你需要一个
require()
函数来获取依赖项,一个
exports
变量来导出模块内容,并且还需要一个模块标识符(它描述了与该模块有关的模块位置),该模块标识符用于要求依赖项 (来源:
source)。 CommonJS 有各种实现,包括你提到的 Node.js。
CommonJS 并没有特别考虑浏览器环境,所以它在浏览器环境中不太适用(*我真的找不到任何来源来证明这一点-到处都是这么说,包括
the RequireJS site.*) 显然,这与异步加载等有关。
另一方面,RequireJS 实现了 AMD,它旨在适应浏览器环境 (
source)。 显然,AMD 起初是 CommonJS 传输格式的一个分支,并发展成其自己的模块定义 API。 因此两者之间存在相似之处。 AMD 中的新功能是
define()
函数,允许模块在加载之前声明其依赖项。 例如,定义可以是:
define('module/id/string', ['module', 'dependency', 'array'],
function(module, factory function) {
return ModuleContents;
});
所以,CommonJS 和 AMD 是 JavaScript 模块定义的 API ,虽然它们有不同的实现方式,但它们都源于相同的起源。
- AMD 更适合浏览器,因为它支持异步加载模块依赖项。
- RequireJS 是 AMD 的一种实现,同时试图保持 CommonJS 的精神(主要在模块标识符方面)。
更令人困惑的是,虽然 RequireJS 是 AMD 的实现,但它提供了一个 CommonJS 包装器,这样 CommonJS 模块几乎可以直接导入并与 RequireJS 一起使用。
define(function(require, exports, module) {
var someModule = require('someModule');
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});