Sunday, May 12, 2024
 Popular · Latest · Hot · Upcoming
83
rated 0 times [  85] [ 2]  / answers: 1 / hits: 16721  / 12 Years ago, wed, august 22, 2012, 12:00:00

In my backbone app, I need to provide a fallback for each required file, in the case that the CDN that delivers them fails.



I have tried overwriting require.onError like so:



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;
}
}


The problem is that this will asynchronously load the fallback files. I need these files to load in order, just like the original require statement, where I use the order! plugin.



With the overridden onError: when the CDN fails to load, the fallback load is started, but not waited for. This presents a problem because the scripts are ordered to be loaded based on their dependencies. Here is a look at my original require statement, that depends on the 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() {
...
}

More From » requirejs

 Answers
53

What version of RequireJS are you using? It seems you might want to configure jQuery's fallback as a path in your config, then set up jQuery as a dependency on the other modules that need it. If you're using ~> 2.0, something like (untested):



// in your requirejs config
requirejs.config({
//To get timely, correct error triggers in IE, force a define/shim exports
// check.
enforceDefine: true,
paths: {
jquery: [
'http://somecdn.com/jquery.min', // your cdn
'lib/jquery' // your fallback
],
jqueryui: http://somecdn.com/jquery-ui.min.js
},
shim: {
jqueryui: ['jquery']
}
});

// then in your requires
require([jquery, jqueryui, foo, bar], function($) {
// stuff
});


They talk about how to do it in the wiki. If you are not using v2.x, there is a method for handling that here too.



If all the modules are configured to specify their own dependencies, you shouldn't need to worry about the order! directives either.


[#83482] Tuesday, August 21, 2012, 12 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
jackelyn

Total Points: 303
Total Questions: 103
Total Answers: 102

Location: Turks and Caicos Islands
Member since Sun, Mar 7, 2021
3 Years ago
;