我仍然对CommonJS的,AMD和RequireJS很困惑。 即使在读了很多。
我知道,CommonJS的(以前ServerJS)是用于定义一些JavaScript规范的组(即模块)当语言被使用的浏览器之外。 CommonJS的模块规格有喜欢的Node.js或RingoJS一些实施,对不对?
什么是CommonJS的,异步模块定义(AMD)和RequireJS之间的关系? 是RequireJS CommonJS的模块定义的实现? 如果是,什么是AMD呢?
我仍然对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的传输格式的剥离,并演变成自己的模块定义API。 因此,两者之间的相似性。 在AMD的新功能是define()
函数,其允许模块被加载之前声明它的依赖。 例如,定义可以是:
define('module/id/string', ['module', 'dependency', 'array'],
function(module, factory function) {
return ModuleContents;
});
所以,CommonJS的和AMD是有不同的实现的JavaScript模块定义的API,但都来自同一个起源。
为了迷惑你甚至更多,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的模块规范二者的实现模块。
AMD (异步模块定义)是用于模块的另一个规范。 RequireJS可能是最流行的实现AMD的。 从CommonJS的一个主要区别是,AMD指定模块被异步加载-这意味着模块并行加载,而不是通过等待负荷以完成阻断执行。
AMD一般在客户端(浏览器内)JavaScript开发,由于这更使用,CommonJS的模块通常用于服务器端。 但是,您可以在任何环境中使用任一模块的规格-例如,RequireJS提供方向在运行的Node.js和browserify是CommonJS的模块实现,可在浏览器中运行。
CommonJS的和AMD是如何模块和它们的依赖应该在JavaScript应用程序中声明的规格(或格式)。
RequireJS是一个脚本加载程序库,AMD兼容, curljs是另一个例子。
来自阿迪·奥斯马尼的书 。
// 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;
// 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的模块声明的实施。
引用
AMD:
CommonJS的 :
AMD
强制执行。 这是很正常的组织JavaScript程序模块化成几个文件并调用child-modules
从main js module
。
事情是JavaScript不提供此。 即使是今天在Chrome和FF的最新版本的浏览器。
但是,有没有在JavaScript中的任何关键字来调用另一个JavaScript模块?
这个问题可能是世界完全崩溃了很多,因为答案是没有 。
在JavaScript中有一个像进口没有关键字ES5(在2009年发布), 包括 ,或要求 。
ES6节省了一天(截至2015年发布)提出进口关键字( https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/import ),但没有浏览器实现这一点。
如果您使用巴贝尔6.18.0且仅ES2015选项transpile
import myDefault from "my-module";
你会得到require
一次。
"use strict";
var _myModule = require("my-module");
var _myModule2 = _interopRequireDefault(_myModule);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
这是因为require
意味着该模块将Node.js的加载 Node.js的将处理一切从阅读到包装功能集成到模块系统级的文件。
因为在JavaScript功能是唯一的包装来表示模块。
我有很多困惑CommonJS的和AMD?
无论CommonJS的和AMD只是两种不同的技术如何克服JavaScript的“缺陷”加载模块智能。