Perché non entrambi ¯ \ _ (ツ) _ / ¯? Scott Hanselman ha pubblicato un ottimo articolo sull'uso di una CDN per ottenere prestazioni migliori, ma ricadendo con grazia su una copia locale nel caso in cui la CDN sia inattiva .
Specifico per bootstrap, è possibile effettuare le seguenti operazioni per caricare da un CDN con un fallback locale :
<head>
<!-- Bootstrap CSS CDN -->
<link rel="stylesheet" href="~https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css">
<!-- Bootstrap CSS local fallback -->
<script>
var test = document.createElement("div")
test.className = "hidden d-none"
document.head.appendChild(test)
var cssLoaded = window.getComputedStyle(test).display === "none"
document.head.removeChild(test)
if (!cssLoaded) {
var link = document.createElement("link");
link.type = "text/css";
link.rel = "stylesheet";
link.href = "lib/bootstrap.min.css";
document.head.appendChild(link);
}
</script>
</head>
<body>
<!-- APP CONTENT -->
<!-- jQuery CDN -->
<script src="~https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
<!-- jQuery local fallback -->
<script>window.jQuery || document.write('<script src="lib/jquery.min.js"><\/script>')</script>
<!-- Bootstrap JS CDN -->
<script src="~https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
<!-- Bootstrap JS local fallback -->
<script>if(typeof($.fn.modal) === 'undefined') {document.write('<script src="lib/bootstrap.min.js"><\/script>')}</script>
</body>
aggiornamenti
Migliori pratiche
Alla tua domanda sulle migliori pratiche, ci sono molte ottime ragioni per usare una CDN in un ambiente di produzione :
- Aumenta il parallelismo disponibile.
- Aumenta la possibilità che si verifichi un hit nella cache .
- Assicura che il carico utile sia il più piccolo possibile .
- Riduce la quantità di larghezza di banda utilizzata dal server.
- Assicura che l'utente abbia una risposta geograficamente vicina .
Per quanto riguarda il controllo delle versioni, qualsiasi CDN che valga il suo peso in termini di sale ti consente di scegliere come target una versione specifica della libreria in modo da non introdurre accidentalmente modifiche che si interrompono ad ogni versione.
utilizzando document.write
Secondo il mdn in poi document.write
Nota : mentre document.write
scrive nel flusso di documenti , la chiamata document.write
a un documento chiuso (caricato) chiama automaticamente document.open
, il che cancella il documento .
Tuttavia, l'uso qui è intenzionale. Il codice deve essere eseguito prima che il DOM sia completamente caricato e anche nell'ordine corretto. Se jQuery fallisce, dobbiamo iniettarlo nel documento in linea prima di provare a caricare bootstrap, che si basa su jQuery.
Output HTML dopo il caricamento :
In entrambi i casi, però, chiamiamo mentre il documento è ancora aperto, quindi dovrebbe incorporare il contenuto, anziché sostituire l'intero documento. Se stai aspettando fino alla fine, dovrai sostituirlo con document.body.appendChild
per inserire fonti dinamiche.
A parte : in MVC 6, puoi farlo con gli helper dei link e dei tag di script
rgb(51, 51, 51)
sembra rischioso: cosa succede se qualcuno cambia colore e si dimentica di aggiornarlo? C'è una proprietà più stabile che si potrebbe usare?