首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CommonJS、AMD与RequireJS的关系

CommonJS、AMD与RequireJS的关系
EN

Stack Overflow用户
提问于 2013-05-13 11:56:23
回答 6查看 192.2K关注 0票数 894

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

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

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-05-13 13:14:08

RequireJS实现AMD API (来源)

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

代码语言:javascript
复制
// 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实现了适合浏览器环境(来源)的AMD。很明显,AMD最初是CommonJS传输格式的副产品,后来演变成了自己的模块定义API。因此两者有相似之处。AMD的新功能是define()功能,允许模块在加载之前声明其依赖项。例如,定义可以是:

代码语言:javascript
复制
define('module/id/string', ['module', 'dependency', 'array'], 
function(module, factory function) {
  return ModuleContents;  
});

因此,CommonJS和AMD是JavaScript模块定义API,它们有不同的实现,但它们都来自相同的起源。

  • AMD更适合浏览器,因为它支持模块依赖项的异步加载。
  • RequireJSAMD的一种实现,同时试图保持CommonJS的精神(主要是模块标识符)。

更让您困惑的是,RequireJS虽然是一个CommonJS实现,但它提供了一个CommonJS包装器,这样CommonJS模块几乎可以直接导入以供RequireJS使用。

代码语言:javascript
复制
define(function(require, exports, module) {
  var someModule = require('someModule'); // in the vein of node    
  exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});
票数 807
EN

Stack Overflow用户

发布于 2013-05-13 13:06:50

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

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

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

票数 211
EN

Stack Overflow用户

发布于 2013-12-29 23:05:49

简短的答案是:

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

RequireJS是一个符合AMD的脚本加载程序库,卷曲是另一个例子。

符合CommonJS标准:

取自阿迪·奥斯马尼的书

代码语言:javascript
复制
// 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标准的:

代码语言:javascript
复制
// 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
    }
});

在其他地方,模块可以与以下内容一起使用:

代码语言:javascript
复制
require(["package/myModule"], function(myModule) {
    myModule.foobar();
});

一些背景:

实际上,CommonJS不仅仅是一个API声明,它只处理其中的一部分。AMD最初是作为CommonJS列表中模块格式的草案开始的,但是还没有达成完全的共识,该格式的进一步开发也转移到了amdjs群上。围绕哪种格式更好的争论表明,CommonJS试图涵盖更广泛的关注点,并且考虑到它的同步特性,它更适合服务器端的开发,并且考虑到它的异步特性以及它的根源在于Dojo的模块声明实现,它更适合于客户端(浏览器)的开发。

资料来源:

  • RequireJS -为什么是AMD?
  • Addy学习JavaScript设计模式-现代模块化JavaScript设计模式
票数 200
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16521471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档