CommonJS、AMD 和 RequireJS 之间的关系?

2022-08-29 22:15:15

我仍然对CommonJS,AMDRequireJS感到非常困惑,即使在阅读了很多之后。

我知道CommonJS(以前称为ServerJS)是一个组,用于定义一些JavaScript规范(即模块),当语言在浏览器之外使用时。CommonJS模块规范有一些实现,如Node.jsRingoJS,对吧?

CommonJSAsynchronous Module Definition (AMD) 和 RequireJS 之间有什么关系?

RequireJSCommonJS 模块定义的实现吗?如果是,那么AMD是什么?


答案 1

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.jsrequire()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更适合浏览器,因为它支持异步加载模块依赖关系。
  • RequireJSAMD的一种实现,同时试图保持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"; };
});

答案 2

CommonJS不仅如此 - 它是一个为JavaScript定义通用API和生态系统的项目。CommonJS的一部分是模块规范。Node.js和RingoJS是服务器端的JavaScript运行时,是的,它们都基于CommonJS Module规范实现模块。

AMD(异步模块定义)是模块的另一个规范。RequireJS可能是AMD最流行的实现。与CommonJS的一个主要区别是AMD指定模块是异步加载的 - 这意味着模块是并行加载的,而不是通过等待加载完成来阻止执行。

因此,AMD通常更多地用于客户端(浏览器内)JavaScript开发,而CommonJS模块通常用于服务器端。但是,您可以在任一环境中使用任一模块规范 - 例如,RequireJS提供了在Node中运行的说明.jsbloodsify是可以在浏览器中运行的CommonJS Module实现。