web-dev-qa-db-fra.com

chargement synchrone require.js

Je voudrais définir un module qui calcule une nouvelle dépendance, la récupère puis retourne le résultat. Ainsi:

define(['defaults', 'get_config_name'], function(defaults, get_config_name) {
    var name = get_config_name();
    var config;
    require.synchronous([configs / '+name'], function(a) {
        config = defaults.extend(a);
    });
    return config;
});

Existe-t-il un moyen de le faire ou un meilleur moyen d'attaquer ce problème?

22
Jake
  • Vous pouvez essayer d'utiliser appel RequireJS synchronerequire('configs/'+get_config_name()), mais il ne chargera un module de manière synchrone que s'il est déjà chargé , sinon il lèvera une exception. Le chargement synchrone du module/fichier JavaScript est techniquement impossible. UPD: C'est possible (voir la réponse de Henrique) mais hautement déconseillé. Il bloque l'exécution de JavaScript qui provoque le gel de la page entière. Donc, RequireJS ne le prend pas en charge.

  • D'après votre cas d'utilisation, il semble que vous n'avez pas besoin de RequireJS synchrone, vous devez retourner le résultat de manière asynchrone . AMD pattern permet de définir les dépendances et de les charger de manière asynchrone, mais la fonction d'usine du module doit retourner le résultat de manière synchrone. La solution peut être d'utiliser le plugin du chargeur (détails ici et ici ):

    // config_loader.js
    define(['defaults', 'get_config_name'], function(defaults, get_config_name) {
        return {
            load: function (resourceId, require, load) {
                var config_name = 'configs/' + get_config_name();
                require([config_name], function(config) {
                    load(defaults.extend(config));
                })
            }
        }
    });
    
    // application.js
    define(['config_loader!'], function(config) {
        // code using config
    });
    
  • Si get_config_name() contient une logique simple et ne dépend pas d'un autre module, le meilleur et le plus simple est de calculer à la volée option de configuration des chemins , ou dans le cas où votre configuration dépend du contexte - - option de configuration de la carte .

    function get_config_name() {
        // do something
    }
    require.config({
        paths: {
            'config': 'configs/' + get_config_name()
        }
    });
    require(['application', 'defaults', 'config'], function(application, defaults, config) {
        config = defaults.extend(config);
        application.start(config);
    });
    
18
Maxim Kulikov

Le chargement synchronisé de JavaScript n'est PAS techniquement impossible.

function loadJS(file){  
   var js = $.ajax({ type: "GET", url: file, async: false }).responseText; //No need to append  
}

console.log('Test is loading...');
loadJS('test.js');
console.log('Test was loaded:', window.loadedModule); //loadedModule come from test.js
15
Henrique