Ich habe einige webbasierte Projekte durchgeführt, denke aber nicht zu viel über die Lade- und Ausführungsreihenfolge einer normalen Webseite nach. Aber jetzt muss ich Details wissen. Es ist schwierig, Antworten von Google oder SO zu finden, daher habe ich diese Frage erstellt.
Eine Beispielseite sieht folgendermaßen aus:
<html>
<head>
<script src="jquery.js" type="text/javascript"></script>
<script src="abc.js" type="text/javascript">
</script>
<link rel="stylesheets" type="text/css" href="abc.css"></link>
<style>h2{font-wight:bold;}</style>
<script>
$(document).ready(function(){
$("#img").attr("src", "kkk.png");
});
</script>
</head>
<body>
<img id="img" src="abc.jpg" style="width:400px;height:300px;"/>
<script src="kkk.js" type="text/javascript"></script>
</body>
</html>
Also hier sind meine Fragen:
- Wie wird diese Seite geladen?
- Wie ist die Reihenfolge des Ladens?
- Wann wird der JS-Code ausgeführt? (Inline und Extern)
- Wann wird das CSS ausgeführt (angewendet)?
- Wann wird $ (document) .ready ausgeführt?
- Wird abc.jpg heruntergeladen? Oder lädt es einfach kkk.png herunter?
Ich habe folgendes Verständnis:
- Der Browser lädt zuerst das HTML (DOM).
- Der Browser beginnt, die externen Ressourcen Zeile für Zeile von oben nach unten zu laden.
- Wenn a
<script>
erfüllt ist, wird das Laden blockiert und warten, bis die JS-Datei geladen und ausgeführt wird, und dann fortfahren. - Andere Ressourcen (CSS / Bilder) werden parallel geladen und bei Bedarf ausgeführt (wie CSS).
Oder ist es so:
Der Browser analysiert das HTML (DOM) und ruft die externen Ressourcen in einem Array oder einer stapelartigen Struktur ab. Nachdem das HTML geladen wurde, beginnt der Browser, die externen Ressourcen in der Struktur parallel zu laden und auszuführen, bis alle Ressourcen geladen sind. Dann wird das DOM entsprechend dem JS entsprechend dem Verhalten des Benutzers geändert.
Kann jemand eine detaillierte Erklärung geben, was passiert, wenn Sie die Antwort einer HTML-Seite erhalten? Unterscheidet sich dies in verschiedenen Browsern? Irgendwelche Hinweise zu dieser Frage?
Vielen Dank.
BEARBEITEN:
Ich habe in Firefox ein Experiment mit Firebug durchgeführt. Und es zeigt sich wie folgt:
quelle
Antworten:
Nach Ihrer Stichprobe,
Der Ausführungsfluss ist ungefähr wie folgt:
<script src="jquery.js" ...
jquery.js
wird heruntergeladen und analysiert<script src="abc.js" ...
abc.js
wird heruntergeladen, analysiert und ausgeführt<link href="abc.css" ...
abc.css
wird heruntergeladen und analysiert<style>...</style>
<script>...</script>
<img src="abc.jpg" ...
abc.jpg
wird heruntergeladen und angezeigt<script src="kkk.js" ...
kkk.js
wird heruntergeladen, analysiert und ausgeführtBeachten Sie, dass der Download aufgrund des Verhaltens des Browsers möglicherweise asynchron und nicht blockierend ist. In Firefox gibt es beispielsweise diese Einstellung, die die Anzahl gleichzeitiger Anforderungen pro Domäne begrenzt.
Abhängig davon, ob die Komponente bereits zwischengespeichert wurde oder nicht, wird die Komponente möglicherweise in naher Zukunft nicht erneut angefordert. Wenn die Komponente zwischengespeichert wurde, wird die Komponente anstelle der tatsächlichen URL aus dem Cache geladen.
Wenn die Analyse beendet ist und das Dokument bereit und geladen ist, werden die Ereignisse
onload
ausgelöst. Wennonload
also abgefeuert wird,$("#img").attr("src","kkk.png");
wird der ausgeführt. So:$("#img").attr("src", "kkk.png");
kkk.png
wird heruntergeladen und geladen in#img
Das
$(document).ready()
Ereignis ist tatsächlich das Ereignis, das ausgelöst wird, wenn alle Seitenkomponenten geladen und bereit sind. Lesen Sie mehr darüber: http://docs.jquery.com/Tutorials:Introducing_$ (document) .ready ()Bearbeiten - In diesem Abschnitt wird mehr auf den parallelen oder nicht parallelen Teil eingegangen:
Standardmäßig und nach meinem derzeitigen Verständnis führt der Browser jede Seite normalerweise auf drei Arten aus: HTML-Parser, Javascript / DOM und CSS.
Der HTML-Parser ist für das Parsen und Interpretieren der Auszeichnungssprache verantwortlich und muss daher in der Lage sein, die beiden anderen Komponenten aufzurufen.
Zum Beispiel, wenn der Parser auf diese Zeile stößt:
Der Parser führt drei Aufrufe durch, zwei an Javascript und einen an CSS. Zunächst erstellt der Parser dieses Element und registriert es im DOM-Namespace zusammen mit allen Attributen, die sich auf dieses Element beziehen. Zweitens ruft der Parser auf, um das Ereignis onclick an dieses bestimmte Element zu binden. Zuletzt wird der CSS-Thread erneut aufgerufen, um den CSS-Stil auf dieses bestimmte Element anzuwenden.
Die Ausführung erfolgt von oben nach unten und mit einem Thread. Javascript mag multithreaded aussehen, aber Tatsache ist, dass Javascript Single-Threaded ist. Aus diesem Grund wird beim Laden einer externen Javascript-Datei das Parsen der HTML-Hauptseite angehalten.
Die CSS-Dateien können jedoch gleichzeitig heruntergeladen werden, da CSS-Regeln immer angewendet werden. Dies bedeutet, dass Elemente immer mit den aktuellsten definierten CSS-Regeln neu gestrichen werden, wodurch die Blockierung aufgehoben wird.
Ein Element ist im DOM erst verfügbar, nachdem es analysiert wurde. Wenn Sie also mit einem bestimmten Element arbeiten, wird das Skript immer nach oder innerhalb des Fenster-Onload-Ereignisses platziert.
Ein solches Skript verursacht Fehler (in jQuery):
Denn wenn das Skript analysiert wird, ist das
#mydiv
Element immer noch nicht definiert. Stattdessen würde dies funktionieren:ODER
quelle
<script>
blockiert andere Komponenten, richtig? Gibt es einen Verweis auf die Spezifikation für jeden Browser?1) HTML wird heruntergeladen.
2) HTML wird schrittweise analysiert. Wenn eine Anforderung für ein Asset erreicht ist, versucht der Browser, das Asset herunterzuladen. Eine Standardkonfiguration für die meisten HTTP-Server und die meisten Browser besteht darin, nur zwei Anforderungen parallel zu verarbeiten. IE kann neu konfiguriert werden, um eine unbegrenzte Anzahl von Assets parallel herunterzuladen. Steve Souders konnte über 100 Anfragen parallel im IE herunterladen. Die Ausnahme besteht darin, dass Skriptanforderungen parallele Asset-Anforderungen im IE blockieren. Aus diesem Grund wird dringend empfohlen, das gesamte JavaScript in externe JavaScript-Dateien einzufügen und die Anforderung unmittelbar vor dem schließenden Body-Tag in den HTML-Code einzufügen.
3) Sobald der HTML-Code analysiert ist, wird das DOM gerendert. CSS wird in fast allen Benutzeragenten parallel zum Rendern des DOM gerendert. Aus diesem Grund wird dringend empfohlen, den gesamten CSS-Code in externen CSS-Dateien abzulegen, die im Abschnitt <head> </ head> des Dokuments so hoch wie möglich angefordert werden. Andernfalls wird die Seite bis zum Auftreten der CSS-Anforderungsposition im DOM gerendert, und das Rendern beginnt von oben.
4) Erst nachdem das DOM vollständig gerendert wurde und Anforderungen für alle Assets auf der Seite entweder aufgelöst wurden oder eine Zeitüberschreitung aufgetreten ist, wird JavaScript vom Onload-Ereignis ausgeführt. IE7, und ich bin mir bei IE8 nicht sicher, führt keine schnelle Zeitüberschreitung bei Assets durch, wenn keine HTTP-Antwort von der Asset-Anforderung empfangen wird. Dies bedeutet, dass ein von JavaScript inline auf der Seite angefordertes Asset, dh JavaScript, das in HTML-Tags geschrieben wird, die nicht in einer Funktion enthalten sind, die Ausführung des Onload-Ereignisses für Stunden verhindern kann. Dieses Problem kann ausgelöst werden, wenn ein solcher Inline-Code auf der Seite vorhanden ist und aufgrund einer Namespace-Kollision, die einen Code-Absturz verursacht, nicht ausgeführt werden kann.
Von den oben genannten Schritten ist das Parsen des DOM / CSS der CPU-intensivste. Wenn Sie möchten, dass Ihre Seite schneller verarbeitet wird, schreiben Sie effizientes CSS, indem Sie redundante Anweisungen eliminieren und CSS-Anweisungen in möglichst wenigen Elementreferenzen zusammenfassen. Wenn Sie die Anzahl der Knoten in Ihrem DOM-Baum verringern, wird auch das Rendern beschleunigt.
Beachten Sie, dass jedes Asset, das Sie von Ihrem HTML-Code oder sogar von Ihren CSS / JavaScript-Assets anfordern, mit einem separaten HTTP-Header angefordert wird. Dies verbraucht Bandbreite und erfordert die Verarbeitung pro Anforderung. Wenn Sie möchten, dass Ihre Seite so schnell wie möglich geladen wird, reduzieren Sie die Anzahl der HTTP-Anforderungen und die Größe Ihres HTML-Codes. Sie tun Ihrer Benutzererfahrung keinen Gefallen, indem Sie das Seitengewicht allein aus HTML auf 180 KB berechnen. Viele Entwickler bekennen sich zu einem Irrtum, dass sich ein Benutzer innerhalb von 6 Nanosekunden über die Qualität des Inhalts auf der Seite entscheidet und dann die DNS-Abfrage von seinem Server löscht und seinen Computer brennt, wenn er unzufrieden ist. Stattdessen bieten sie die schönste Seite unter 250k HTML. Halten Sie Ihren HTML-Code kurz und bündig, damit ein Benutzer Ihre Seiten schneller laden kann.
quelle
Öffnen Sie Ihre Seite in Firefox und holen Sie sich das HTTPFox-Addon. Es wird Ihnen alles sagen, was Sie brauchen.
Gefunden auf archivist.incuito:
http://archivist.incutio.com/viewlist/css-discuss/76444
quelle
Wenn Sie dies fragen, weil Sie Ihre Website beschleunigen möchten, lesen Sie die Yahoo-Seite mit Best Practices für die Beschleunigung Ihrer Website . Es enthält viele bewährte Methoden zur Beschleunigung Ihrer Website.
quelle
AFAIK, der Browser (zumindest Firefox) fordert jede Ressource an, sobald sie analysiert wird. Wenn es auf ein img-Tag stößt, fordert es dieses Bild an, sobald das img-Tag analysiert wurde. Und das kann sein, noch bevor es die Gesamtheit des HTML-Dokuments erhalten hat ... das heißt, es könnte immer noch das HTML-Dokument herunterladen, wenn dies passiert.
Für Firefox gelten Browserwarteschlangen, je nachdem, wie sie in about: config festgelegt sind. Beispielsweise wird nicht versucht, mehr als 8 Dateien gleichzeitig vom selben Server herunterzuladen. Die zusätzlichen Anforderungen werden in die Warteschlange gestellt. Ich denke, es gibt Domain-Limits, Proxy-Limits und andere Dinge, die auf der Mozilla-Website dokumentiert sind und in about: config festgelegt werden können. Ich habe irgendwo gelesen, dass der IE keine solchen Grenzen hat.
Das jQuery ready-Ereignis wird ausgelöst, sobald das Haupt-HTML-Dokument vorliegt heruntergeladen und das DOM analysiert wurde. Das Ladeereignis wird dann ausgelöst, sobald alle verknüpften Ressourcen (CSS, Bilder usw.) heruntergeladen und analysiert wurden. Dies wird in der jQuery-Dokumentation deutlich gemacht.
Wenn Sie die Reihenfolge steuern möchten, in der alles geladen wird, ist JavaScript meiner Meinung nach der zuverlässigste Weg, dies zu tun.
quelle
Dynatrace AJAX Edition zeigt Ihnen die genaue Reihenfolge des Ladens, Parsens und Ausführens von Seiten.
quelle
Die gewählte Antwort scheint nicht für moderne Browser zu gelten, zumindest nicht für Firefox 52. Ich habe festgestellt, dass die Anforderungen zum Laden von Ressourcen wie CSS und Javascript ausgegeben werden, bevor der HTML-Parser beispielsweise das Element erreicht
Was ich fand, dass die Startzeit von Anfragen zum Laden von CSS- und Javascript-Ressourcen nicht blockiert wurde. Es sieht so aus, als hätte Firefox einen HTML-Scan und identifiziert wichtige Ressourcen (img-Ressource ist nicht enthalten), bevor mit dem Parsen des HTML begonnen wird.
quelle