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
});
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è? –
È 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'. –
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. –