RequireJS – 垫片中的“exports”属性的用途是什么
下面介绍的“出口”财产的目的是什么? 它真的需要吗?
requirejs.config({ shim: { 'backbone': { deps: ['underscore', 'jquery'], exports: 'Backbone' } } });
我问,因为它似乎是多余的 – 当模块包含在一个依赖列表中,我们将再次指定导出的名称作为函数参数:
define(['backbone'], function (Backbone) { return Backbone.Model.extend({}); });
如果在你的例子中没有使用shim
,那么你作为参数传入的Backbone
对象将是未定义的,因为Backbone不是AMD兼容的,并且不返回RequireJS使用的对象。
define(['backbone'], function (Backbone) { // No shim? Then Backbone here is undefined as it may // load out of order and you'll get an error when // trying to use Model return Backbone.Model.extend({}); });
为了给出一些上下文,我将使用r.js优化器吐出的代码,但是我将在这个例子中简化它。 它通过阅读优化器产生的内容帮助我理解它的重点。
Shimmed Backbone将会是这样的:
// Create self invoked function with the global 'this' // passed in. Here it would be window define("backbone", (function (global) { // When user requires the 'backbone' module // as a dependency, simply return them window.Backbone // so that properites can be accessed return function () { return global.Backbone; }; }(this)));
关键是要求RequireJS在你请求一个模块的时候返回给你,并且确保在这之前先加载。 在优化器的情况下,它将简单地embedded图书馆。
如果您不使用“导出” 骨干 ,那么您不能在模块中获取骨干网中定义的骨干(window.Backbone)的语言环境引用。
//without export Backbone shim : { 'bbn':{ //exports:'Backbone', deps:['underscore'] }, 'underscore': { exports: '_' } }; require(['bbn'], function(localBackbone) { //localBackbone undefined. console.log('localBackbone:,' localBackbone); });
RequireJs解释如下:
//RequireJS will use the shim config to properly load 'backbone' and give a local //reference to this module. The global Backbone will still exist on //the page too. define(['backbone'], function (Backbone) { return Backbone.Model.extend({}); });
RequireJS将使用shim config来获取全局骨干
function getGlobal(value) { if (!value) { return value; } var g = global; each(value.split('.'), function (part) { g = g[part]; }); return g; }
另外请注意,您可能希望在“出口”中使用插件的实际导出。 例如,
requirejs.config({ shim: { 'jquery.colorize': { deps: ['jquery'], exports: 'jQuery.fn.colorize' }, 'jquery.scroll': { deps: ['jquery'], exports: 'jQuery.fn.scroll' }, 'backbone.layoutmanager': { deps: ['backbone'] exports: 'Backbone.LayoutManager' }, "jqueryui": { deps: ["jquery"], //This is because jQueryUI plugin exports many things, we would just //have reference to main jQuery object. RequireJS will make sure to //have loaded jqueryui script. exports: "jQuery" }, "jstree": { deps: ["jquery", "jqueryui", "jquery.hotkeys", "jquery.cookie"], exports: "jQuery.fn.jstree" }, "jquery.hotkeys": { deps: ["jquery"], exports: "jQuery" //This plugins don't export object in jQuery.fn }, "jquery.cookie": { deps: ["jquery"], exports: "jQuery" //This plugins don't export object in jQuery.fn } } });
更多: https : //github.com/jrburke/requirejs/wiki/Upgrading-to-RequireJS-2.0#wiki-shim
Shim出口是让requirejs知道如何处理非AMD模块。 没有它,定义块中的依赖关系仍将被加载,而模块启动。 它表示requirejs已经停止加载资源,并且模块可以开始使用它。
至less,这就是我的看法。
- 组织jQuery / JavaScript代码的最佳方式(2013)
- 如何在RequireJS中模拟unit testing的依赖关系?
- 为什么使用Object.prototype.hasOwnProperty.call(myObj,prop)而不是myObj.hasOwnProperty(prop)?
- Require.js正在伤害我的大脑。 关于加载脚本/模块的一些基本问题
- 如何使用jquery ui与requirejs
- RequireJS如何处理多个页面和部分视图?
- Require.js错误:模块的加载超时:backbone,jquerymobile
- 我如何一起使用requireJS和jQuery?
- 如何在没有.d.ts的情况下使用来自typescript的外部非打字稿库?