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. Без него зависимости в блоке определения по-прежнему будут загружаться, а модуль запускается. Он сигнализирует, что он прекратил загрузку ресурса и что модули могут начать его использовать.

По крайней мере, как я это вижу.