协慌网

登录 贡献 社区

CommonJS,AMD 和 RequireJS 之间的关系?

我对 CommonJS,AMD 和 RequireJS 仍感到非常困惑。即使阅读了很多。

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

CommonJS,异步模块定义(AMD)和 RequireJS 之间有什么关系? RequireJS 是 CommonJS 模块定义的实现吗?如果是的话,那么什么是 AMD 呢?

答案

RequireJS实现了AMD API (源代码)

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变量导出模块的内容和模块标识符(其描述了相对于该模块的问题的模块的位置),其被用于需要依赖( )。 CommonJS 有各种实现,包括你提到的Node.js。

CommonJS 并没有特别考虑到浏览器的设计,所以它不适合浏览器环境( 我真的没有这方面的资源 - 它只是说到处都是,包括RequireJS 网站。 )显然,这有一些东西做异步加载等

另一方面,RequireJS 实现了 AMD,其设计适合浏览器环境( )。显然,AMD 最初是作为 CommonJS Transport 格式的衍生产品,并发展成为自己的模块定义 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"; };
});

我希望这有助于澄清事情!

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

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

由于这一点,AMD 通常更多地用于客户端(浏览器内)JavaScript 开发,而 CommonJS 模块通常用于服务器端。但是,您可以在任一环境中使用任一模块规范 - 例如,RequireJS 提供在 Node.js 中运行的指导browserify是可以在浏览器中运行的 CommonJS 模块实现。

简短的回答是:

CommonJSAMD是关于如何在 javascript 应用程序中声明模块及其依赖项的规范(或格式)。

RequireJS是一个符合 AMD 标准的脚本加载器库, curljs是另一个例子。

符合 CommonJS:

取自Addy Osmani 的书

// package/lib is a dependency we require
var lib = require( "package/lib" );

// behavior for our module
function foo(){
    lib.log( "hello world!" );
}

// export (expose) foo to other modules as foobar
exports.foobar = foo;

符合 AMD 标准:

// package/lib is a dependency we require
define(["package/lib"], function (lib) {

    // behavior for our module
    function foo() {
        lib.log( "hello world!" );
    }

    // export (expose) foo to other modules as foobar
    return {
        foobar: foo
    }
});

在其他地方,该模块可用于:

require(["package/myModule"], function(myModule) {
    myModule.foobar();
});

一些背景:

实际上, CommonJS不仅仅是一个 API 声明,只有一部分涉及到它。 AMD 最初是作为 CommonJS 列表中模块格式的规范草案,但未达成完全共识,格式的进一步发展转移到amdjs 组 。关于哪种格式更好的说法 CommonJS 试图涵盖更广泛的关注点,并且鉴于其同步特性,它更适合服务器端开发,并且 AMD 更适合客户端(浏览器)开发,因为它具有异步性和事实上,它源于 Dojo 的模块声明实现。

资料来源: