小编典典

CommonJS、AMD 和 RequireJS 之间的关系?

all

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

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

CommonJS异步模块定义 (AMD) 和 RequireJS 之间有什么关系?

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


阅读 128

收藏
2022-03-01

共1个答案

小编典典

RequireJS 实现了 AMD API
(source)

CommonJS 是一种借助exports对象定义模块的方法,它定义了模块的内容。简单地说,CommonJS 实现可能是这样工作的:

// 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 。

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"; };
});
2022-03-01