2012-01-11 13 views
5

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

以前はRequireJSオーダー・プラグインを使用しましたが、Dojo AMDローダーでは動作しません。ローダーのドキュメントやDojoビルド・システムのドキュメントでは、何も見つかりません。

これについてのご意見はありますか?注文プラグインがない場合、Dojo 1.7と一緒にプレーンJavaScriptファイルをどのように扱うべきですか?別々に処理する必要がありますか、またはローダーやビルドシステムでこれに対応する機能がありますか?

+0

を使用することができますか? – hugomg

+0

jQuery(AMDモジュールとしては使用されていません)のような普通のJavaScriptファイルは、どんなスタイルで書かれていてもかまいません。 –

答えて

4

私はこのことについて自分自身を学んでいる、しかし、私が見つけたドキュメントがドキュメントで説明するように指定して、あなたの一般的なスクリプトをロードGeneric Script Injection

を指し{非同期:0}必要とするための構成オプションとして() 。

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

}); 

私のローカルテストがあれば示しています。これは、私の理解に、あなたは

私の例(スクリプトファイル名/パスを含む配列)2番目のパラメータで指定した順序でスクリプトをロードしませんconfigを{async:1}に変更すると、スクリプトは指定した順序とは異なる順序で読み込まれます。これまでdojoローダーコードでこれを追跡していませんでしたが、それは意味をなさないと思われ、うまく動作し、ハックではありません。

+0

私はこの答えをacceptiong、それは働くので!私はこのように依存モジュールを作成しました: 'define([require"]、function(require){require {{async:0}、["script1.js"、 "script2.js"、 "script3.js" ]);}); '。私はそれが大丈夫だと思う。ありがとう! –

+0

しかし、1つの警告。私はそれをさらに調査していませんが、(少なくとも上記のように別のモジュールにスクリプトをロードすると)スクリプトは従来のスクリプトタグを使用してロードされた場合とは異なるスコープでロードされます。たとえば、 'var uglyGlobal = true'を' window.uglyGlobal = true'に置き換えなければなりませんでした。 –

+0

'{async:1}' configのスクリプトインジェクションメソッドは、注入された '

2

私はプラグインが一般にAMDローダー間で互換性があるとは思わない。最適ではありませんが、おそらくdojo/textを使うことができます!評価付き。それはビルド時にコンテンツをインライン展開します。

+0

このような意味ですか? –

+0

それは動作し、私はdohテストでそれを使用しています( '' myScript''、 '' text!myScript2''、function(s、s2){eval(s); eval(s2)})しかし、私はそれを受け入れられた答えとしてマークすることを嫌っている、それはハック=) –

3

私は、上記のコメントで述べたような依存モジュールの別のアプローチを提案したいと思います。問題はdefineasyncパラメータを受け入れないことです。 define関数の中にシンプルなrequireを使用すると、必要なモジュールのコードがまだ実行されていないため、競合条件が発生します。

例(WRONG):
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 demo

ただし、この問題の解決方法があります。Deferredを返す必要があります。すべてのモジュールがロードされるとすぐに解決されます。次の例では、a、b、c、dを順にロードします。 moduleAで定義されたアクセスプロパティに

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

、あなたは今、あなたはモジュールのないファイルや古いスタイル同期モジュールについて話している

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