2012-03-19 11 views
8

Desidero esporre un'API JavaScript come libreria autonoma senza inquinare il loro spazio dei nomi globale. Ho creato il wrapper in modo da non inquinare il proprio requireJS in base a http://requirejs.org/docs/faq-advanced.html. Ho semplificato ciò che ho finora, ma non sono sicuro se questo è il modo corretto o se dovrei farlo in un altro modo.Qual è il modo corretto di esporre un modulo requireJS allo spazio dei nomi globale?

var MyApi = MyApi || {}; 
var MyApiRequireJS = (function() { 
    // require.js pasted here 
    return {requirejs: requirejs, require: require, define: define}; 
})(); 

(function(require, define, requirejs) { 
    require.config({ 
    baseUrl: 'js/scripts', 
    waitSeconds: 30, 
    }); 

    define('myapi', ['jquery', 'underscore'], 
    function($, _) { 
     $.noConflict(true); 
     _.noConflict(); 
     function api(method, args, callback) { 
     // do stuff here 
     } 
     return {api: api}; 
    } 
); 

    require(['myapi'], function(myapi) { 
    MyApi = myapi; 
    }); 
}(MyApiRequireJS.require, MyApiRequireJS.define, MyApiRequireJS.requirejs)); 

siti che utilizzano questa libreria dovrebbe includere un tag script che fa riferimento al codice di cui sopra e poi chiamare l'API utilizzando

MyApi.api('some_remote_method', {foo: 'bar'}, function(result) { 
    // handle the result 
}); 
+0

Stai dicendo che non vuoi 'require' e' define' per essere nel namespace globale, ma sei felice per 'MyApi' e' MyApiRequireJS' per essere nello spazio dei nomi globale? Posso chiedere perchè? –

+0

È più probabile che stiano già usando 'require' e' define' di 'MyApi' nel loro spazio dei nomi globale (' MyApi' non è la var che userò, ma l'ho usato per semplicità.) Allo stesso modo Facebook connect api inquina solo lo spazio dei nomi globale con 'FB'. –

+0

Usano 'require' o' define'? Puoi scoprirlo? In caso contrario, non c'è un problema. Se non sai quale sia il loro spazio dei nomi globale, allora non puoi essere sicuro che tutte le globali che definisci non saranno già in uso. –

risposta

0

penso che stai cercando di anticipare problema di qualcun altro, rendendo il vostro problema, ma non penso che tu possa davvero farlo ragionevolmente. La pagina a cui ci si collega è progettata per consentire alle persone che hanno già globals Javascript denominati "require" o "define" di rinominare le globali RequireJS con qualcosa di diverso. Non è inteso creare due istanze RequireJS separate che risolvano in modo indipendente le dipendenze.

Detto questo, se si sta veramente cercando di ridurre al minimo l'inquinamento dello spazio dei nomi, è necessario esporre esattamente un nome: MyApi. Scrivi una chiusura mostro che includa la tua copia privata di RequireJS così come il tuo codice API, e fagli restituire solo i metodi che vuoi esporre sulla tua API.

Probabilmente è molto più semplice/semplice consegnare l'API in due versioni, una che definisce un modulo requireJS e una che non ha alcuna dipendenza requireJS.

Problemi correlati