web-dev-qa-db-ja.com

require.js同期読み込み

新しい依存関係を計算してフェッチし、結果を返すモジュールを定義したいと思います。そのようです:

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

これを行う方法またはこの問題を攻撃するより良い方法はありますか?

22
Jake
  • synchronous RequireJS callrequire('configs/'+get_config_name())を使用することもできますが、がすでにロードされている場合にのみ、モジュールが同期的にロードされます、それ以外の場合は例外をスローします。 モジュール/ JavaScriptファイルを同期的にロードすることは技術的に不可能です。 UPD:可能ですが(Henriqueの回答を参照)、非常に非推奨です。ページ全体のフリーズを引き起こすJavaScriptの実行をブロックします。そのため、RequireJSはサポートしていません。

  • あなたのユースケースから、同期RequireJSは必要ないようです、結果を非同期で返す必要があります[〜#〜] amd [〜#〜] パターンにより、依存関係を定義して非同期にロードできますが、モジュールのファクトリー関数は結果を同期的に返す必要があります。解決策は、ローダープラグイン(詳細 ここ および ここ )を使用することです:

    _// 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
    });
    _
  • get_config_name()が単純なロジックを含み、別のモジュールに依存しない場合、オンザフライで計算 パス構成オプション 、または構成がコンテキストに依存する場合-- マップ構成オプション

    _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

JavaScriptを同期的にロードすることは技術的に不可能ではありません。

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