我仍然非常困惑的CommonJS,AMD和RequireJS,即使在阅读了很多之后。
我知道,CommonJS (以前的ServerJS)是一个用于定义某些JavaScript规范(即模块)的组,当该语言在浏览器之外使用时。CommonJS模块规范有一些实现,比如Node.js或RingoJS,对吗?
CommonJS、异步模块定义和RequireJS之间有什么关系? RequireJS是CommonJS模块定义的实现吗?如果是,那么AMD是什么?
发布于 2013-05-13 13:14:08
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实现了适合浏览器环境(来源)的AMD。很明显,AMD最初是CommonJS传输格式的副产品,后来演变成了自己的模块定义API。因此两者有相似之处。AMD的新功能是define()功能,允许模块在加载之前声明其依赖项。例如,定义可以是:
define('module/id/string', ['module', 'dependency', 'array'],
function(module, factory function) {
return ModuleContents;
});因此,CommonJS和AMD是JavaScript模块定义API,它们有不同的实现,但它们都来自相同的起源。
更让您困惑的是,RequireJS虽然是一个CommonJS实现,但它提供了一个CommonJS包装器,这样CommonJS模块几乎可以直接导入以供RequireJS使用。
define(function(require, exports, module) {
var someModule = require('someModule'); // in the vein of node
exports.doSomethingElse = function() { return someModule.doSomething() + "bar"; };
});发布于 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模块实现。
发布于 2013-12-29 23:05:49
简短的答案是:
CommonJS和AMD是关于如何在javascript应用程序中声明模块及其依赖关系的规范(或格式)。
RequireJS是一个符合AMD的脚本加载程序库,卷曲是另一个例子。
符合CommonJS标准:
取自阿迪·奥斯马尼的书。
// 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试图涵盖更广泛的关注点,并且考虑到它的同步特性,它更适合服务器端的开发,并且考虑到它的异步特性以及它的根源在于Dojo的模块声明实现,它更适合于客户端(浏览器)的开发。
资料来源:
https://stackoverflow.com/questions/16521471
复制相似问题