Se l'esempio shim
non viene utilizzato nell'esempio, l'oggetto Backbone
che si passa come parametro non è definito in quanto Backbone non è compatibile con AMD e non restituisce un oggetto per RequireJS da utilizzare.
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({});
});
Per dare un po 'di contesto userò il codice che il r.js ottimizzatore sputa ma io semplificare per questo esempio. Mi ha aiutato a capire il punto di ciò leggendo ciò che produce l'ottimizzatore.
la spina dorsale spessorato sarebbe un po 'come questo:
// 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)));
Il punto è quello di dare RequireJS qualcosa per tornare di nuovo voi quando si chiede un modulo e lo farà in modo che viene caricato prima di fare così. Nel caso dell'ottimizzatore, incorporerà semplicemente la libreria in anticipo.
fonte
2012-12-31 03:04:15
Grazie Simon. Non stavo chiedendo perché lo shim è usato, ma perché la proprietà "exports" è necessaria all'interno dello shim? Comunque, la tua risposta mi ha dato un indizio, ad esempio "esportazioni" è usato per identificare il globale che il modulo non AMD introduce. Ora che ho letto di nuovo i documenti, loro dicono: "Una volta caricato, usa il backbone globale come valore del modulo". L'uso di "Backbone" come argomento di funzione fornisce semplicemente un riferimento locale a questo modulo. – Naresh
E solo per aggiungere un altro punto, a volte avere un riferimento locale al globale può essere molto importante, ad esempio, su una pagina in cui possono essere caricate più versioni della stessa libreria. Ad esempio, se stai scrivendo un plugin che dipende da una versione specifica di Knockout, potresti non voler utilizzare la variabile globale 'ko', ma solo il locale che viene passato al callback. –
Almeno Backbone.js 1.3.3 è compatibile con AMD – Legends