質問

AMDを使用してDojo 1.6.1からプロジェクトをアップグレードし、新しいAMDローダーを使用してDojo 1.7.1にJsを要求しています。 AMDモジュールとして書かれていない古いJavaScriptファイルを処理する必要があり、正しい順序でロードする必要があります。

requirejs Orderプラグインを使用する前に、Dojo AMDローダーでは動作しないようです。 LoaderドキュメントやDojo Build Systemドキュメントには何も見つかりません。

これについて何か考えはありますか?注文プラグインがない場合、Dojo 1.7と一緒にプレーンJavaScriptファイルをどのように処理する必要がありますか?それらを個別に処理する必要がありますか、それともローダーまたはビルドシステムにこれの機能がありますか?

役に立ちましたか?

解決

私はこれについて自分で学んでいますが、私が見つけたドキュメントは 一般的なスクリプトインジェクション

ドキュメントで説明されているように一般的なスクリプトをロードしながら、{async:0}をrequire()の構成オプションとして指定します。これは、私の理解のために、2番目のパラメーター(スクリプトファイル名/パスを含む配列)で指定する順序でスクリプトをロードします。

私の例:

require({async:0},['test1.js','test2.js','test3.js'],function(){
    //do stuff with reference to loaded scripts

});

私のローカルテストでは、configを{async:1}に変更するかどうかがわかります。これまでのところ、私はこれをDojo Loaderコードで追跡していませんが、それは理にかなっていて、機能し、ハックではないようです。

他のヒント

上記のコメントに記載されているような依存性モジュールの別のアプローチを提案したいと思います。問題はそれです define 受け入れません async パラメーター。シンプルを使用します require 内側 define 必要なモジュールのコードがまだ実行されていないため、関数は人種条件を導入します。

例 (違う):
oldcode.js

window.foo = function(){};

LegacyWrapper.js

define(["require"],function(require){
    require({async:0},["./oldCode"]);
})

code.js

define(["./legacyWrapper"],function(){
    window.foo(); //throws exception, foo has not been loaded yet.
})

(jsfiddleデモ)

ただし、この問題には解決策があります。 返品する必要があります 延期 すべてのモジュールがロードされるとすぐに解決されます。次の例は、a、b、c、dを順番にロードします。

define(["require","dojo/Deferred"],function(require,Deferred){
    var def = new Deferred();
    require({async:0},
            ["./moduleA",
             "./moduleB",
             "./moduleC",
             "./moduleD"],
             function(){
        def.resolve();
    });
    return def;
})

ModuleAで定義されているプロパティにアクセスするには、今すぐ使用できます

require(["legacyDeps"],function(legacyDeps){
    legacyDeps.then(function(){
        //It's save to assume that all legacy modules have been loaded here.
    });
});

プラグインは一般にAMDローダー間で互換性があるとは思わない。最適ではありませんが、おそらくDojo/Textを使用できます!評価付き。これにより、BuildTimeでコンテンツがインラインになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top