web-dev-qa-db-fra.com

RequireJS - Quel est le but de la propriété "exports" dans shim

Quel est le but de la propriété "exports" dans la cale ci-dessous? Est-ce vraiment nécessaire?

requirejs.config({
    shim: {
        'backbone': {
            deps: ['underscore', 'jquery'],
            exports: 'Backbone'
        }
    }
});

Je demande parce qu'il semble redondant - lorsque le module est inclus dans une liste de dépendances, nous spécifierons à nouveau le nom exporté comme argument de fonction:

define(['backbone'], function (Backbone) {
  return Backbone.Model.extend({});
});
49
Naresh

Si shim n'est pas utilisé dans votre exemple, l'objet Backbone que vous transmettez en tant que paramètre serait indéfini car Backbone n'est pas compatible AMD et ne renvoie pas d'objet à utiliser par 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({});
});

Pour donner un peu de contexte, je vais utiliser le code que l'optimiseur r.js crache, mais je vais le simplifier pour cet exemple. Cela m'a aidé à en comprendre l'intérêt en lisant ce que l'optimiseur produit.

Le Backbone calé serait un peu comme ceci:

// 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)));

Le but est de donner à RequireJS quelque chose à vous renvoyer lorsque vous demandez un module, et il s'assurera qu'il est chargé en premier avant de le faire. Dans le cas de l'optimiseur, il intégrera simplement la bibliothèque avant la main.

35
Simon Smith

Si vous n'utilisez pas "export"Backbone, vous ne pouvez pas obtenir la référence locale dans le module à Backbone (window.Backbone) qui est définie dans backbone.js .

//without export Backbone
shim : {
  'bbn':{
        //exports:'Backbone',
        deps:['underscore']
    },
    'underscore': {
        exports: '_'
    }
};


require(['bbn'], function(localBackbone) {
  //localBackbone undefined.
  console.log('localBackbone:,' localBackbone);
});

RequireJs explique comme suit:

//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 utilisera la configuration de shim pour obtenir le backbone global

function getGlobal(value) {
        if (!value) {
            return value;
        }
        var g = global;
        each(value.split('.'), function (part) {
            g = g[part];
        });
        return g;
    }
29
Ian Jiang

Notez également que vous souhaiterez peut-être utiliser l'exportation réelle du plug-in dans "exports". Par exemple,

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
        }
    }
});

Plus: https://github.com/jrburke/requirejs/wiki/Upgrading-to-RequireJS-2.0#wiki-shim

2
Shital Shah

Les exportations Shim permettent de faire savoir à requirejs comment gérer les modules non AMD. Sans cela, les dépendances dans le bloc define seront toujours chargées, tandis que le module démarre. Il signale à requirejs qu'il a cessé de charger la ressource et que les modules peuvent commencer à l'utiliser.

Du moins, c'est comme ça que je le vois.

1
asgoth