RequireJS实现了AMD API(源代码)。
CommonJS是一种在对象的帮助下定义模块的方法,它定义了模块内容。简单地说,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指定您需要有一个函数来获取依赖项,一个用于导出模块内容的变量和一个用于需要依赖项(源)的模块标识符(描述相关模块相对于该模块的位置)。CommonJS有各种实现,包括你提到的Node.js。require()
exports
CommonJS并不是专门为浏览器设计的,所以它不能很好地适应浏览器环境(*我真的没有这方面的来源 - 它只是在任何地方都这么说,包括RequireJS网站。
另一方面,RequireJS实现了AMD,它旨在适应浏览器环境(源代码)。显然,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'); // in the vein of node
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});