RequireJS - Какова цель свойства "экспорт" в прокладке
Какова цель свойства "экспорт" в прокладке ниже? Это действительно необходимо?
requirejs.config({
shim: {
'backbone': {
deps: ['underscore', 'jquery'],
exports: 'Backbone'
}
}
});
Я спрашиваю, потому что это кажется излишним - когда модуль включен в список зависимостей, мы снова укажем экспортированное имя как аргумент функции:
define(['backbone'], function (Backbone) {
return Backbone.Model.extend({});
});
Ответы
Ответ 1
Если shim
не используется в вашем примере, то объект Backbone
, который вы передаете в качестве параметра, будет undefined, поскольку 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-оптимизатор, но я упрощу его для этого примера. Это помогло мне понять суть этого, прочитав то, что производит оптимизатор.
Согласованная магистраль будет примерно такой:
// 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 что-то вернуть вам, когда вы попросите модуль, и он будет гарантировать, что он будет загружен первым, прежде чем делать это. В случае оптимизатора он просто вставляет библиотеку в руки.
Ответ 2
Если вы не используете "экспорт" Backbone, вы не можете получить ссылку на локаль в модуле Backbone (window.Backbone), которая определена в backbone.js.
//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, чтобы получить глобальную магистраль
function getGlobal(value) {
if (!value) {
return value;
}
var g = global;
each(value.split('.'), function (part) {
g = g[part];
});
return g;
}
Ответ 3
Также обратите внимание, что вы можете использовать фактический экспорт плагина в "export". Например,
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
Ответ 4
Экспорт Shim предназначен для того, чтобы позволить requirejs знать, как обрабатывать модули, отличные от AMD. Без него зависимости в блоке определения по-прежнему будут загружаться, а модуль запускается. Он сигнализирует, что он прекратил загрузку ресурса и что модули могут начать его использовать.
По крайней мере, как я это вижу.