RequireJS和CommonJS之间的区别

pow*_*r23 17 javascript node.js requirejs

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

var $ = require('jquery');
var _ = require('underscore');
var BackBone = require('backbone');
Run Code Online (Sandbox Code Playgroud)

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

两者对我来说都很好,但不确定它们背后的任何目的.

Lou*_*uis 26

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

var $ = require('jquery');
var _ = require('underscore');
var BackBone = require('backbone');
Run Code Online (Sandbox Code Playgroud)

这些调用是同步调用:require返回时,它返回您请求的模块.CommonJS require调用是同步的.有一个支持异步形式的提议,require但据我所知,它没有超出提案级别.Node.js过去require.async已被删除.虽然有一个实现它的.使用这个软件包很像使用AMD风格的模块.

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

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

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

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

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

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

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

它可以很容易地将CommonJS样式模块转换为与RequireJS一起使用:只需使用define上面的调用将其包装起来即可.有一个工具可以帮助转换.

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

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

可能令人惊讶的是(假设AMD是异步的)require回调中的调用是同步的.这是RequireJS支持CommonJS风格的一部分.RequireJS支持一种同步require调用,但有以下警告:如果在调用同步之前已经定义了模块require,则同步require返回模块的值,否则立即失败.也就是说,它不会尝试加载模块.因为RequireJS解释使用如我上面所示---仿佛依赖性是在实际列举的CommonJS的风格模块定义define参数---然后这些模块被保证由时间加载到同步调用require由.

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