Quiero exponer una API de Javascript como una biblioteca independiente sin contaminar su espacio de nombres global. Creé el contenedor para no contaminar sus propios requisitos de acuerdo con http://requirejs.org/docs/faq-advanced.html. He simplificado lo que tengo hasta ahora, pero no estoy seguro de si esta es la forma correcta o si debería hacerlo de otra manera.¿Cuál es la forma correcta de exponer un módulo requireJS al espacio de nombre global?
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));
Los sitios que usan esta biblioteca incluiría una etiqueta de script haciendo referencia al código anterior y luego llamar a la API usando
MyApi.api('some_remote_method', {foo: 'bar'}, function(result) {
// handle the result
});
¿Estás diciendo que no quieres que 'require' y' define' estén en el espacio de nombres global, pero te alegra que 'MyApi' y' MyApiRequireJS' estén en el espacio de nombres global? ¿Puedo preguntar por que? –
Es más probable que ya estén usando 'require' y' define' que 'MyApi' en su espacio de nombres global (' MyApi' no es la var que voy a usar, simplemente lo usé para simplificar). facebook connect api solo contamina el espacio de nombre global con 'FB'. –
¿Están usando 'require' o' define'? ¿Puedes averiguar? Si no, no hay un problema. Si no sabe qué utiliza su espacio de nombres global, no puede estar seguro de que los globales que defina ya no estarán en uso. –