Warum nicht beide ¯ \ _ (ツ) _ / ¯? Scott Hanselman hat einen großartigen Artikel über die Verwendung eines CDN für Leistungssteigerungen, greift jedoch auf eine lokale Kopie zurück, falls das CDN ausfällt .
Speziell für Bootstrap können Sie Folgendes tun, um von einem CDN mit lokalem Fallback zu laden :
<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>
Aktualisierung
- Sie können denselben Test auch mit YepNope oder fallback.js durchführen
- gemäß Flashs Kommentar und dieser Lösung , aktualisierte Antwort, um nach
.visible
Klasse zu suchen , anstatt nach zu testenrgb(51, 51, 51)
- per destes Kommentar , aktualisiert für die Verwendung
.hidden
und .d-none
entweder für Boostrap 3.x oder 4
- Wenn Sie testen, ob ein Stylesheet geladen wurde , müssen Sie nach einem Stil suchen, der angewendet wurde, ein Element erstellen und prüfen , ob es angewendet wurde.
- Das Stylesheet wurde aktualisiert, um mithilfe von Vanilla Js sofort in den Kopf geladen zu werden. Sie müssen ein Testelement mit erstellen
Document.createElement()
, Bootstrap-Klassen anwenden, Window.getComputedStyle()
zum Testen verwenden display:none
und dann ein Stylesheet mit js bedingt einfügen .
Empfohlene Vorgehensweise
Für Ihre Frage zu Best Practices gibt es viele sehr gute Gründe, ein CDN in einer Produktionsumgebung zu verwenden :
- Es erhöht die verfügbare Parallelität .
- Es erhöht die Wahrscheinlichkeit, dass es zu einem Cache-Treffer kommt .
- Es stellt sicher, dass die Nutzlast so klein wie möglich ist .
- Dies reduziert die von Ihrem Server verwendete Bandbreite .
- Es stellt sicher, dass der Benutzer eine geografisch enge Antwort erhält .
Für Ihr Versionsproblem können Sie mit jedem CDN, das sein Gewicht in Salz wert ist, eine bestimmte Version der Bibliothek auswählen, damit Sie nicht versehentlich mit jeder Version Änderungen vornehmen.
Verwenden von document.write
Nach dem mdn auf document.write
Hinweis : als document.write
Schreibvorgänge in dem Dokument Strom , Aufruf document.write
auf einem geschlossenen (geladen) Dokument automatisch aufruft document.open
, die das Dokument klar wird .
Die Verwendung hier ist jedoch beabsichtigt. Der Code muss ausgeführt werden, bevor das DOM vollständig geladen ist und auch in der richtigen Reihenfolge. Wenn jQuery fehlschlägt, müssen wir es inline in das Dokument einfügen, bevor wir versuchen, Bootstrap zu laden, das auf jQuery basiert.
HTML-Ausgabe nach dem Laden :
In beiden Fällen rufen wir jedoch auf, während das Dokument noch geöffnet ist, sodass der Inhalt eingefügt werden sollte, anstatt das gesamte Dokument zu ersetzen. Wenn Sie bis zum Ende warten, müssen Sie diese ersetzen document.body.appendChild
, um dynamische Quellen einzufügen.
Nebenbei : In MVC 6 können Sie dies mit Hilfe von Link- und Skript-Tags tun
rgb(51, 51, 51)
scheint riskant - was ist, wenn jemand die Farbe ändert und vergisst, sie zu aktualisieren? Gibt es eine stabilere Eigenschaft, die man nutzen könnte?