2012-08-01 30 views
36

¿Hay alguna forma de acceder a todos los módulos cargados de require.js?require.js: Acceda a todos los módulos cargados

Antecedentes:
Quiero llamar automáticamente a una función de JavaScript init() de mis módulos después de que todos ellos están cargados, consulte require.js + backbone.js: How to structure modules that have an initialize function? Sin require.js I en bucle por encima de mi propio módulo de almacenamiento y llamó a cada función init().
Ahora quiero hacer esto con require.js. Soy consciente de que llamar a my_custom_init_function_favoritecolor_petname_love123 de cada módulo cargado (incluidas las bibliotecas externas) es peligroso. Espero que esto cause menos problemas que actualizar manualmente una lista de todos los módulos (y los requisitos de estos módulos). Olvidar un módulo init() es mucho más probable que una biblioteca de terceros que tenga mi nombre de función personalizado (aunque este último probablemente sea más difícil de depurar).

¿Alguien tiene una mejor idea de cómo lograr eso?

Respuesta

59

Sí, require.s.contexts._.defined es un objeto que sus teclas son los nombres de los módulos y los valores incluyen el valor devuelto por dicho módulo.

require.s.contexts._.defined incluye todos los módulos (ya sea define() o require() como el archivo de Javascript que es el punto de partida del programa y se indica utilizando data-main para RequireJS).

+4

¿Cuál es la diferencia entre registro y definida en el contexto? Veo un objeto nuevo en el contexto ._. Objeto de registro después de una definición ('Mod', ...), pero no en el contexto ._. Defined. Después de una llamada a require (['Mod'], ...) Veo el módulo en contexto ._. Defined. – alexK85

11

Acabo de terminar un comportamiento similar dentro de mi proyecto RequireJS. require.s.contexts['_'].registry contiene la lista de los módulos registrados.

Estoy usando Underscore.js para obtener, filtrar e iterar la lista de módulos. Tal vez el siguiente fragmento de código que ayuda a:

var modules_registered = _.keys(require.s.contexts['_'].registry); 
var modules_to_be_initialized = _.filter(modules_registered, function(module_title) { 
    return module_title.indexOf('modules') > -1; 
}); 

_.each(modules_to_be_initialized, function(module_name) { 
    require([module_name], function(current_module) { 
     current_module.init(); 
    }); 
}); 
1

soy vago, por lo que acabo de hacer esto:

var modulesToLoad = Object.keys(require.s.contexts['_'].registry); 
    require(modulesToLoad); 

Basándonos en las otras respuestas aquí.

Cuestiones relacionadas