Nella mia app per backbone, è necessario fornire un fallback per ciascun file richiesto, nel caso in cui il CDN che li consegna non riesca.RequireJS: fallback locale per il fallimento del CDN
ho cercato di sovrascrivere require.onError
in questo modo:
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;
}
}
Il problema è che questo modo asincrono caricare i file di fallback. Ho bisogno che questi file vengano caricati in ordine, proprio come nella richiesta originale, dove uso il plugin order!
.
Con l'override onError
: quando il CDN non riesce a caricare, il caricamento fallback viene avviato, ma non è atteso. Questo presenta un problema perché gli script sono ordinati per essere caricati in base alle loro dipendenze. Ecco uno sguardo al mio require
dichiarazione originale, che dipende dalla 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() {
...
}
Entrambi CDN di non sono terribili, non solo non riescono, in media, una volta al giorno per una finestra di circa un minuto al massimo, e sono gratuiti. Indipendentemente da ciò, ritengo che questo sia un problema interessante da risolvere. Sempre buono avere fallback anche se si dispone di un CDN perfetto, per preservare l'esperienza dell'utente. Puoi suggerire altri CDN? – Austin
Capisco da dove vieni, ma non sono nella posizione di suggerire l'acquisto di qualcosa di simile per la nostra azienda senza fornire un'ampia prova che ho provato di tutto per far funzionare il sistema attuale. Inoltre, sono interessato a qualsiasi impresa di programmazione, e posso vedere questa particolare soluzione essere utile a molte persone, dal momento che molti sviluppatori (freelance in particolare) non utilizzano CDN a pagamento. – Austin
CDN è molto economico ora (da $ 2 a $ 3 al mese) ... Sto usando AccuWebHosting.Com CDN e non ho mai avuto alcun tempo morto. Bene, se un server fallisce in CDN, il contenuto viene immediatamente consegnato dal POP successivo disponibile più vicino ... E ci sono solitamente da 40 a 50 POP in un buon CDN ... –