スクリプト タグを手動で書き込むアプリケーションを、YUI3 ローダーを使用してスクリプトの依存関係を管理するアプリケーションに移行する作業を行っています。jQuery のようなスクリプトを 2 回ロードしてはならないという問題に直面しています。これは、場合によってはレガシー コードがスクリプトをページにドロップし、YUI ローダーが後でスクリプトを再度ロードするためです。これを防ぐ方法はありますか?ローダーは、新しいタグを挿入する前に、作成しようとしているものと同じ src を持つスクリプト タグを照会できるように思われます。
2 に答える
0
このビデオの約 4 分の 3 で 、YUI 用に作成されていない外部モジュールをロードする方法と、ロード済みであることをローダーに通知して、2 回実行しようとしないようにする方法を説明します。基本的に、ローダーの onProgress イベントを監視し、起動したら、モジュールに付けたい名前で YUI.add() を呼び出します。これにより、ローダーはそのモジュールをロード済みとしてマークします。
于 2013-10-05T16:57:47.963 に答える
0
これを行う 1 つの方法は、モジュール名に対して積極的に Y.add() を呼び出すことです。これは、Y.add() で定義されていないモジュール (jQuery プラグインなど) でうまく機能します。ただし、Y.add() で定義されているモジュールでこれを行うと、競合状態が発生する可能性があります。たとえば、次のシーケンスを考えてみましょう。
- モジュール A のスクリプトが実行されます (Y.add('A', ...) を呼び出します)。
- YUI は、コールバックを実行する前に、モジュール A の要件をロードするためにオフになります
- Y.add('A') が空のコールバックで再度呼び出されます (A のスクリプト ファイルがページ上にあることを YUI に通知するため)。
- YUI は非同期ロードがまだ返されていないため、YUI は空のコールバックを A の定義として受け取ります。
修正は、次のスクリプトを使用することです。
var preloadedModules = ['a', ... ]; // list of module scripts already on the page
, noop = function (Y) { }, version = '@VERSION@', i, len, moduleName;
for (var i = 0, len = preloadedModules.length; i < len; ++i) {
moduleName = preloadedModules[i];
if (!YUI.Env.mods[moduleName]) { // avoids overwriting YUI module definitions
YUI.add(moduleName, noop, version);
}
}
于 2013-10-28T18:27:33.363 に答える