-->

CommonJS的,AMD和RequireJS的关系?(Relation between Commo

2019-09-02 21:24发布

我仍然对CommonJS的,AMD和RequireJS很困惑。 即使在读了很多。

我知道,CommonJS的(以前ServerJS)是用于定义一些JavaScript规范的组(即模块)当语言被使用的浏览器之外。 CommonJS的模块规格有喜欢的Node.js或RingoJS一些实施,对不对?

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

Answer 1:

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,但都来自同一个起源。

  • 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"; };
});

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



Answer 2:

CommonJS的不止于此-这是一个项目定义为JavaScript的通用API和生态系统。 CommonJS的的一个部分是模块规范。 Node.js和受RingoJS是服务器端的JavaScript运行时,是的基础上,CommonJS的模块规范二者的实现模块。

AMD (异步模块定义)是用于模块的另一个规范。 RequireJS可能是最流行的实现AMD的。 从CommonJS的一个主要区别是,AMD指定模块被异步加载-这意味着模块并行加载,而不是通过等待负荷以完成阻断执行。

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



Answer 3:

简短的回答是:

CommonJS的AMD是如何模块和它们的依赖应该在JavaScript应用程序中声明的规格(或格式)。

RequireJS是一个脚本加载程序库,AMD兼容, curljs是另一个例子。

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的试图涵盖更广泛的关注更好的状态,这是由于其同步特性更适合于服务器端开发,以及AMD更适合于客户端(浏览器)的发展给予其异步特性和事实上,它有它的根在Dojo的模块声明的实施。

资料来源:

  • RequireJS -为什么AMD?
  • 阿迪·奥斯马尼-学习JavaScript设计模式-现代模块化的JavaScript设计模式


Answer 4:

引用

AMD:

  • 一个浏览器的第一种方法
  • 选择了异步行为和简化的向后兼容性
  • 它没有文件I / O的任何概念。
  • 它支持的对象,功能,构造,字符串,JSON和许多其它类型的模块。

CommonJS的

  • 一台服务器,第一种方法
  • 假设同步行为
  • 覆盖范围更广的一系列问题,如I / O,文件系统,承诺等等。
  • 支持展开的模块,它可以感受到多一点贴近ES.next/Harmony规范,从而使您的定义()包装的AMD强制执行。
  • 只支持对象作为模块。


Answer 5:

这是很正常的组织JavaScript程序模块化成几个文件并调用child-modulesmain 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的“缺陷”加载模块智能。



文章来源: Relation between CommonJS, AMD and RequireJS?