2012-02-01 8 views
2

これはセットアップです。私のベースファイルは、私が構築しているサイトのすべてのページで必要とされるスクリプトを定義するmain.jsです。require.jsが間違って依存関係をロードする

define([ 
     '/javascript/requirePlugins/require-order.js!http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js', 
     '/javascript/requirePlugins/require-order.js!/javascript/jquery-global-plugins.js', 
     '/javascript/requirePlugins/require-order.js!/javascript/globals.js' 
    ], function() { 
     loadFonts(); 
    } 
); 

これは、jQuery、一部のプラグイン、およびグローバルスクリプトファイルを読み込みます。 1つのページで、jQueryプラグインをロードしようとしていますが、プラグインはjQueryがロードされる前にロードしようとします。

require(['/javascript/requirePlugins/require-order.js!/main','/javascript/requirePlugins/require-order.js!/javascript/3rdparty/lemon-slider-0.2.js'], function() { 
     $j('#carousel<%= ClientID %>').lemmonSlider({loop:false}); 
    }); 

機能は要求された注文に従っていないようです。私はこのような順序付けられた関数をネストすることさえできるのかどうか分からない。また、私はちょうど依存関係としてのjQueryを適用しようとしたが、これも失敗:

require(['/javascript/requirePlugins/require-order.js!/jquery','/javascript/requirePlugins/require-order.js!/javascript/3rdparty/lemon-slider-0.2.js'], function() { 
     $j('#carousel<%= ClientID %>').lemmonSlider({loop:false}); 
    }); 

を、私はこの間違ったをやっているところに任意の提案が高く評価され、感謝

答えて

4

オーダープラグインは、いくつかのトップレベルスクリプトをロードしておき、それらのスクリプトがrequirejsでサポートされているモジュールAPIを使用していない場合に便利です。あなたがそれを混ぜる/それを使ってdefine()モジュールAPIを使用するモジュールをロードするとうまくいきません。

特に、スクリプトが最初に読み込まれるようにするだけです。しかし、define()APIはロードする他のスクリプトを指定しており、orderプラグインはそれらのスクリプトがロードされるのを待つことを知らない。

この特定の問題については、sinsedrixが推奨するようにrequire-jquery.jsを使用することをお勧めします。つまり、define()呼び出しで使用するスクリプトをラップします。 voloあなたがそのamdifyコマンドでこれを行うことができます。

volo.js amdify path/to/lemon-slider-0.2.js depends=jquery 

また、私はbaseUrlに設定し、代わりに完全なパスの依存関係のための「モジュールの命名」を使用します。これにより、オプティマイザが正しく動作するようになります。また、requirePluginsパスに 'order'をマップすることもできます。これにより、回線ノイズの一部を削減できます。また、jqueryパスエントリを作成して、定義呼び出しで他のプラグインをラップすると、main.jsファイルにロードされたjqueryにマップされます。だから、あなたのページのトップレベルのスクリプトで:次に

requirejs.config({ 
    baseUrl: '/javascript/', 
    paths: { 
     order: 'requirePlugins/require-order', 
     jquery: 'http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min' 
    } 
}); 

あなたmain.jsはそうのように書くことができます:ここでは、順序の使用は、これらの限り、大丈夫です

define([ 
     'order!jquery', 
     'order!jquery-global-plugins', 
     'order!globals' 
    ], function() { 
     loadFonts(); 
    } 
); 

注意依存関係はdefine()自身を呼び出さない。

しかし、定義呼び出しで使用するスクリプトをラップすると、その順序を取り除くことができます。上記の使用法。 jqueryパスを設定したままにしておきます。

+0

@ jrburke、パスの目的は何ですか?なぜjqueryを要求してコールバックで使用できないのですか? jqueryを動作させるためにjqueryを設定パスに追加する必要があるのはなぜですか?私は(["lib/jquery"]、function($){ $( "#app-main")html( "jQueryが読み込まれました"); })を要求できるようにしたいと思います。それを働かせてください。これは動作しません。 – kr1zmo

+0

@ kr1zmo:jQueryは「jquery」という名前のモジュールとして登録します。したがって、依存関係は「jquery」と呼ばれる必要があります。また、pathsエントリを使用することで、ビルドプロセスで別のファイルにマップすることができます。さらに、自分のモジュールをさらに紹介する場合は、短い「jquery」という名前を使うのがいいですね。 – jrburke

+0

voloの提案に感謝します:) – vacetahanna

0

たぶんあなたが必要と使用TUを試してみてください-jquery:http://requirejs.org/docs/jquery.html

jqueryがロードされると、心配する必要はありません。

+0

これは、ロードされているjQueryの問題のみを解決します。それは私が間違っていることについての私の主な問題を解決するものではありません。それは他の依存関係に関してうまくいくでしょう –

+0

それは進歩しました。これで、可読性(パス)と、おそらく依存関係のグラフ・イメージを簡単にする必要があります。 – sinsedrix

7

ためのプラグインが削除され、順番にプラグインをロードするために、シム設定を試すことが

requirejs.config({ 
    paths: { 
     'jquery': 'https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min', 
     'bootstrap': '../bootstrap/js/bootstrap.min', 
     'select2': 'vendor/select2', 
     'jshashtable': 'vendor/jshashtable-2.1', 
     'jquery.numberformatter': 'vendor/jquery.numberformatter-1.2.3.min', 
     'jq-datepicker': 'vendor/bootstrap-datepicker', 
     'jq-datepicker.da': 'vendor/bootstrap-datepicker.da' 
    }, 

    // Use shim for plugins that does not support ADM 
    shim: { 
     'bootstrap': ['jquery'], 
     'select2': ['jquery'], 
     'jq-datepicker': ['jquery'], 
     'jshashtable': ['jquery'], 
     'jquery.numberformatter': ['jquery', 'jshashtable'] 
    }, 
    enforceDefine: true 
}); 

EDIT:

必要-jqueryのも維持するもうありません。

関連する問題