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,这就是我的看法。