web-dev-qa-db-fra.com

require.js: accéder à tous les modules chargés

Existe-t-il un moyen d'accéder à tous les modules chargés de require.js?

Contexte:
Je veux appeler automatiquement une fonction init() de mes modules javascript une fois qu'ils sont tous chargés, voir require.js + backbone.js: comment structurer les modules qui ont une fonction d'initialisation? Sans require.js, j'ai bouclé sur mon propre module de stockage et appelé chaque fonction init().
Je veux maintenant le faire avec require.js. Je sais qu'appeler un my_custom_init_function_favoritecolor_petname_love123 de chaque module chargé (y compris les bibliothèques externes) est dangereux. J'espère que cela causera moins de problèmes que la mise à jour manuelle d'une liste de tous les modules (et des exigences de ces modules). Oublier un module init () est beaucoup plus probable qu'une bibliothèque tierce ayant mon nom de fonction personnalisé (bien que ce dernier soit probablement plus difficile à déboguer).

Ou est-ce que quelqu'un a une meilleure idée de la façon d'accomplir cela?

44
Michael

Oui, require.s.contexts._.defined Est un objet dont les clés sont les noms des modules et les valeurs incluent la valeur renvoyée par ce module.

require.s.contexts._.defined Inclut tous les modules (define() ou require() tels que le fichier Javascript qui est le point de départ du programme et est indiqué en utilisant data-main pour RequireJS).

70
AlexStack

Je viens de terminer un comportement similaire dans mon projet RequireJS. require.s.contexts['_'].registry contient la liste des modules enregistrés.

J'utilise Underscore.js pour obtenir, filtrer et itérer la liste des modules. Peut-être que le fragment de code suivant vous aide:

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();
    });
});
11
Volker Rose

Je suis paresseux, alors je viens de faire ceci:

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

Basé sur d'autres réponses ici.

1
Zar Shardan