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