RequireJS和CommonJS的区别

我想知道这些片段之间的区别是什么。

var $ = require('jquery'); var _ = require('underscore'); var BackBone = require('backbone'); 

 require(['jquery','underscore','backbone'],function ($, _, BackBone){ //code goes here }) 

两者都为我工作,但不知道他们的任何目的背后的上述两个。

考虑一下CommonJS风格的第一个代码片段:

 var $ = require('jquery'); var _ = require('underscore'); var BackBone = require('backbone'); 

这些调用是同步调用:当require返回时,它返回你请求的模块。 CommonJS require调用是同步的。 有一个build议,支持asynchronousforms的require但据我所知 ,还没有超出提案级别的进展。 Node.js过去有require.async已被删除。 有一个实现它的包虽然。 使用这个包看起来很像使用AMD风格的模块。

现在,考虑一下AMD风格的第二个代码片段:

 require(['jquery','underscore','backbone'],function ($, _, BackBone){ //code goes here }) 

由于RequireJS实现了AMDtypes的模块系统,因此上述代码与RequireJS一起使用。 这require调用—如asynchronous模块定义(AMD)的名称 – asynchronous。 您不能依靠require的返回值来获取模块值。 你必须使用callback。 define调用以类似的方式工作,但是除了需要模块外还定义了一个模块。

现在,如果你使用RequireJS,它提供的function允许你在定义模块的时候使用任何一种样式,这样你可以像这样定义一个模块:

 define(['jquery','underscore','backbone'],function ($, _, BackBone){ //code goes here }); 

或者使用一些看起来更像CommonJS成语的东西:

 define(function (require) { var $ = require('jquery'); var _ = require('underscore'); var BackBone = require('backbone'); //code goes here }); 

它使得将CommonJS风格的模块转换为RequireJS非常简单:只需要​​像上面那样用一个define调用来包装它。 有一个工具来帮助转换。

在幕后,RequireJS以第二种forms读取callback代码,并创build一个依赖关系列表,最后解释为:

 define(['require', 'jquery','underscore','backbone'], function (require) { var $ = require('jquery'); var _ = require('underscore'); var BackBone = require('backbone'); //code goes here }) 

令人惊讶的是(鉴于AMD是asynchronous的)callback中的require调用是同步的。 这是RequireJS对CommonJS风格的支持的一部分。 RequireJS支持一种同步require调用,但有以下警告:如果模块在调用同步require之前已经被定义,则同步require返回模块的值,否则立即失败。 也就是说,它不会尝试加载模块。 因为RequireJS解释了一个使用CommonJS风格的模块定义,正如我上面所显示的那样 – 就好像依赖关系实际上在define参数中列出了一样—所以这些模块保证在同步调用require的时候加载被做。

除了能够在RequireJS中使用CommonJS模块(提供了一个包装器)之外,还可以在CommonJS环境(如Node.js)中使用为RequireJSdevise的模块。 例如,我使用node-amd-loader来加载我在Node.js中devise为AMD模块的模块。

前面的代码片段遵循CommonJS规范,该规范概述了如何将模块导出/传输以用于其他模块。

所以,你可以写代码看起来像这样

SRC / ExpressModule.js

 var express = require('express'); // do initialization exports.express = express; 

然后你可以像这样使用它

SRC / UserExpressModule.js

 var express = require('./ExpressModule'); // do something else 

CommonJS规范主要是为了服务器端环境而构build的,并且通过扩展在Node.js中使用

另一方面是AMD,最着名的是RequireJS。 AMD是为浏览器环境或客户端代码而构build的,在这里您可以使用和定义模块,如代码中的后面的代码片段

一个示例使用可能是这样的

SRC / main.js

 requirejs.config({ baseUrl: '../vendor' path: '../src' }); require(['jquery', 'underscore', 'backbone'], function($, _, Backbone) { // do some client side computation here }); 

然后你可以像这样在你的index.html中包含这个main.js文件

 <script data-main="src/main.js" src="vendor/require.js"></script> 

本质上,CommonJS和AMD是模块化Javascript的核心规范,但是针对不同的执行环境。