我想知道这些片段之间的区别是什么。
var $ = require('jquery');
var _ = require('underscore');
var BackBone = require('backbone');
和
require(['jquery','underscore','backbone'],function ($, _, BackBone){
//code goes here
})
对我来说这两种方法都很好,但不确定它们背后的任何目的是什么。
答案 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的核心规范,但针对的是不同的执行环境。