2012-08-01 8 views
36

Gibt es eine Möglichkeit, auf alle geladenen Module von require.js zuzugreifen?require.js: Auf alle geladenen Module zugreifen

Hintergrund:
Ich möchte eine init() Funktion meiner Javascript-Module automatisch aufzurufen, nachdem sie alle geladen werden, siehe require.js + backbone.js: How to structure modules that have an initialize function? Ohne require.js ich mein eigenes Modul-Speicher geschlungen über und jede init() Funktion aufgerufen.
Ich möchte dies jetzt mit require.js tun. Mir ist bewusst, dass ein Aufruf eines my_custom_init_function_favoritecolor_petname_love123 jedes geladenen Moduls (einschließlich externer Bibliotheken) gefährlich ist. Ich hoffe, dass dies weniger Ärger verursacht als das manuelle Führen einer Liste aller Module (und der Anforderungen dieser Module) auf dem neuesten Stand. Das Vergessen eines Moduls init() ist viel wahrscheinlicher als das einer Bibliothek eines Drittanbieters, die meinen benutzerdefinierten Funktionsnamen hat (obwohl Letzteres wahrscheinlich schwieriger zu debuggen ist).

Oder hat jemand eine bessere Vorstellung davon, wie man das erreicht?

Antwort

59

Ja, require.s.contexts._.defined ist ein Objekt, das sein Schlüssel der Modulnamen sind und die Werte sind der Wert aus diesem Modul zurückgegeben.

require.s.contexts._.defined umfasst alle Module (entweder define() oder require() wie die JavaScript-Datei, die der Ausgangspunkt des Programms ist, und wird unter Verwendung data-main für RequireJS angedeutet).

+4

Was ist der Unterschied zwischen Registrierung und definiert im Kontext? Ich sehe ein neues Objekt im Kontext ._. Registry-Objekt nach einer Definition ('Mod', ...), aber nicht auf Kontext ._. Definiert. Nach einem Require (['Mod'], ...) Aufruf sehe ich das Modul auf Kontext ._. Definiert. – alexK85

11

Ich habe gerade ein ähnliches Verhalten in meinem RequireJS-Projekt abgeschlossen. require.s.contexts['_'].registry enthält die Liste der registrierten Module.

Ich verwende Underscore.js zum Abrufen, Filtern und Iterieren der Liste der Module. Vielleicht ist das folgende Codefragment hilft Ihnen:

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

Ich bin faul, so habe ich nur das:

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

Basierend auf anderen Antworten hier.

Verwandte Themen