2012-03-19 14 views
8

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

¿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? –

+0

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'. –

+0

¿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. –

Respuesta

0

Creo que está tratando de anticipar el problema de otro por lo que es su problema, pero no creo que realmente puedas hacer eso. La página a la que se vincula está diseñada para permitir que las personas que ya tienen JavaScript globales llamadas "requerir" o "definir" cambien el nombre de RequireJS globales a algo diferente. No tiene la intención de crear dos instancias RequireJS separadas que resuelvan dependencias de forma independiente.

Dicho esto, si realmente está tratando de minimizar la contaminación del espacio de nombres, entonces debe exponer exactamente un nombre: MyApi. Escribe un cierre de monstruo que incluya tu copia privada de RequireJS y tu código API, y haz que devuelva solo los métodos que deseas exponer en tu API.

Probablemente sea mucho más simple/más fácil entregar su API en dos versiones, una que defina un módulo requireJS y otra que no requiera dependencia de JS.

Cuestiones relacionadas