RequireJS和CommonJS之间的区别

时间:2014-01-09 13:29:34

标签: javascript node.js requirejs

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

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

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

对我来说这两种方法都很好,但不确定它们背后的任何目的是什么。

2 个答案:

答案 0 :(得分:26)

考虑第一个片段,它是CommonJS样式:

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

这些调用是同步调用:当require返回时,它返回您请求的模块。 CommonJS require调用是同步的。有一项支持require的异步形式的提案,但据我can tell而言,它尚未超出提案级别。 Node.js曾经删除了require.async。虽然有一个package来实现它。使用这个软件包看起来很像使用AMD风格的模块。

现在,考虑第二个片段,它采用AMD风格:

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

由于RequireJS实现了AMD类型的模块系统,因此上述代码适用于RequireJS。这个require调用是 - 由异步模块定义(AMD)这个名称建议---异步。您不能依赖require的返回值来获取模块值。你必须使用回调。 define调用以类似的方式工作,但除了需要模块外还定义了一个模块。

现在,如果您使用RequireJS,它提供了允许在定义模块时使用任一样式的工具,以便您可以定义这样的模块:

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调用将其包装起来。有tool来帮助转换。

在幕后,RequireJS以第二种形式读取回调代码并创建一个依赖项列表,以便最终解释为:

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

可能令人惊讶的是(假设AMD是异步的)回调中的require调用是同步的。这是RequireJS支持CommonJS风格的一部分。 RequireJS支持一种同步require调用,但有以下警告:如果在调用同步require之前模块已经定义,那么同步{{1} }返回模块的值,但否则立即失败。也就是说,它不会尝试来加载模块。因为RequireJS解释了一个使用CommonJS样式的模块定义,如上所示 - 好像依赖关系实际列在require参数中 - 然后这些模块保证在时间加载对define进行同步调用。

除了能够在RequireJS中使用CommonJS模块(如果添加了包装器),还可以在像Node.js这样的CommonJS环境中使用为RequireJS设计的模块。例如,我使用node-amd-loader加载我在Node.js中设计为AMD模块的模块。

答案 1 :(得分:1)

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

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

<强>的src / ExpressModule.js

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

然后你可以像这样使用它

<强>的src / UserExpressModule.js

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

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

另一方面,频谱是AMD,最值得注意的是由RequireJS实施。 AMD是为浏览器环境或客户端代码而构建的,在这里您可以使用和定义代码中的后一个代码段等模块

样本使用可能是这样的

<强>的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的核心规范,但针对的是不同的执行环境。