requirejs注文プラグインとDojo 1.7.1
-
27-10-2019 - |
質問
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. })
ただし、この問題には解決策があります。 返品する必要があります 延期 すべてのモジュールがロードされるとすぐに解決されます。次の例は、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でコンテンツがインラインになります。