私のバックボーンアプリでは、ファイルを配信するCDNに障害が発生した場合に備えて、必要なファイルごとにフォールバックを提供する必要があります。
require.onError
私はそのように上書きしようとしました:
require.onError = function (err) {
if (err.requireType === 'timeout') {
var url = err.requireModules;
if (!!~url.indexOf("jquery/"))
console.warn("CDN timed out, falling back to local jQuery.js")
require(["libs/jquery"]);
return;
if (!!~url.indexOf("jqueryui/"))
console.warn("CDN timed out, falling back to local jQueryUI.js")
require(["libs/jqueryui"]);
return;
if (!!~url.indexOf("underscore"))
console.warn("CDN timed out, falling back to local underscore.js")
require(["libs/underscore"]);
return;
if (!!~url.indexOf("backbone"))
console.warn("CDN timed out, falling back to local backbone.js")
require(["libs/backbone"]);
return;
}
}
問題は、これがフォールバックファイルを非同期的にロードすることです。order!
プラグインを使用する元のrequireステートメントと同じように、これらのファイルを順番にロードする必要があります。
オーバーライドさonError
れた場合:CDNのロードに失敗すると、フォールバックロードが開始されますが、待機されません。スクリプトは依存関係に基づいてロードされるように順序付けられているため、これには問題があります。require
CDNに依存する私の元のステートメントを見てみましょう。
require([
"order!http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js",
"order!http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js",
"order!http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min.js",
"order!http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min.js",
"order!utils/date",
"order!core/core",
"order!core/errors",
"order!core/constants"
], function() {
...
}