4

私はrequirejs2.xを使用しており、CDNからjQueryをロードし、ローカルファイルにバックアップを作成しています。shimconfigソリューションを使用してjQueryプラグインをロードしようとしています。これは高速接続とローカルブラウザで正常に機能するようですが、ワイヤレス接続または低速接続でテストしたところ、プラグインがjqueryを検索していて、まだロードされていない場合にランダムエラーが発生するようです。この問題に関連するドキュメントや他のサイトを調べましたが、セットアップは正常に見えます。

以下はサンプルです。

// main.js    
requirejs.config({
   baseUrl: "scripts",
   paths: {
      "jquery" : [
         "//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min",
         "libs/jquery/jquery-1.8.0.min"
      ],
      "$plugins":"./libs/jquery",
      "modules" : "./app/modules",
   },
   shim: {
      "jquery.easing" : ["jquery"],
      "jquery.urlutils": ["jquery"]
   },
   priority: ["jquery"]
});

// somemodule.js
define([
   'modules/otherModule',
   'jquery',
   '$plugins/jquery.urlutils'
], function( OtherModule, $ ) {
   // code...
});

ここで、「somemodule」がjQueryとotherModuleをロードしていることがわかります(正常に動作します)。一方、jqueryは、プラグインの前にロードされることがあります。直接パスを使用してプラグインをpathsオブジェクトに追加してみましたが、上記の「somemodule」で$pluginsパスを省略しました。これは毎回うまく設定されているようです。しかし、これはシムの目的を打ち負かしませんか?パスを設定して依存関係を設定する必要があるという事実は気に入らない。

どんな助けでもいただければ幸いです。それは私を狂わせています。:)

私は何かが足りないのですか?または、jqueryプラグインの前にshimキーの前に$ pluginsパスを付ける必要がありますか?

考えられる解決策

私は解決策を見つけました...私は信じています。クロスブラウザを確認するためにまだテスト中です。

shimのjqueryプラグイン(jquery.urlutils)のパスと、「somemodule」の依存関係リストの定義に注意してください。また、プラグインの実際の場所に移動するためのパスを使用していることにも注意してください。

また、「enforeDefine」を使用することになったわけではないことにも注意してください。使用すると、エラーが再度表示されるか、「definedoesnotexists」エラーが発生します。

requirejs.config({
   baseUrl: "scripts",
   paths: {
      "jquery" : [
         "//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min",
         "libs/jquery/jquery-1.8.0.min"
      ],
      "$plugins":"./libs/jquery",
      "modules" : "./app/modules",
   },
   shim: {
      "$plugins/jquery.easing" : ["jquery"],
      "$plugins/jquery.urlutils": ["jquery"]
   },
   priority: ["jquery"]
});

// somemodule.js
define([
   'modules/otherModule',
   'jquery',
   '$plugins/jquery.urlutils'
], function(OtherModule, $ ) {
   // code...
});
4

1 に答える 1

0

私は現在、RequireJS 2.0 のドキュメント全体を実際に読んでおり、問題を解決すると思われるものに出会いました。

次のように、require config に設定する必要がありますenforceDefinetrue

requirejs.config({
    //To get timely, correct error triggers in IE, force a define/shim exports check.
    enforceDefine: true,
})

これにより、エラー時にモデルが強制的に要求されundef()、続行する前にモデルが適切に定義されるまで待機します。ここでそれについて読んでください

ドキュメントをさらに読むとexports、含まれているスクリプトの戻り値に値を設定する必要があるようです。これにより、ロードが成功したかどうかを確認できる変数が require に含まれるようになります。シムに jquery と jquery-ui を追加します。

shim: {
    "jquery": {
        exports: "jQuery"
    },
    "jquery-ui": {
        deps: ['jquery'],
        exports: "jQuery.ui"
    }
}
于 2012-08-27T15:00:50.290 に答える