我在想这些代码片段之间的区别是什么。
var $ = require('jquery');
var _ = require('underscore');
var BackBone = require('backbone');
和
require(['jquery','underscore','backbone'],function ($, _, BackBone){
//code goes here
})
对我来说两者都可以,但不确定上述两种方式背后是否有任何目的。
我在想这些代码片段之间的区别是什么。
var $ = require('jquery');
var _ = require('underscore');
var BackBone = require('backbone');
和
require(['jquery','underscore','backbone'],function ($, _, BackBone){
//code goes here
})
对我来说两者都可以,但不确定上述两种方式背后是否有任何目的。
var $ = require('jquery');
var _ = require('underscore');
var BackBone = require('backbone');
require
返回时,它返回您请求的模块。CommonJS require
调用是同步的。有一个提案支持异步形式的 require
,但据我所知,它还没有超出提案阶段。Node.js 曾经有 require.async
,但已被删除。不过有一个 包 实现了它。使用这个包看起来很像使用 AMD 风格的模块。require(['jquery','underscore','backbone'],function ($, _, BackBone){
//code goes here
})
require
调用是异步的,正如其名称“异步模块定义(AMD)”所示。你不能依赖require
的返回值来获取模块值,而必须使用回调函数。define
调用的工作方式类似,但除了要求模块外还定义了一个模块。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读取第二种形式的回调代码并创建依赖项列表,以便最终被解释为:
define(['require', 'jquery','underscore','backbone'], function (require) {
var $ = require('jquery');
var _ = require('underscore');
var BackBone = require('backbone');
//code goes here
})
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
});
main.js
文件。<script data-main="src/main.js" src="vendor/require.js"></script>