Werfen Sie zunächst einen Blick auf den durch den Standard definierten Browser-Rendering-Prozess (online zu finden):
Der erste Wenn ein Benutzer eine Website besucht, sendet der Browser eine Anfrage an den Server und der Server gibt eine HTML-Datei zurück.
Der Browser beginnt mit dem Laden des HTML-Codes und stellt fest, dass ein Link vorhanden ist Tag im Head-Tag, das auf eine externe CSS- oder JS-Datei verweist; 🎜>
Der Browser hat im Code ein IMG-Tag gefunden, das auf ein Bild verweist, und hat eine Anfrage an den Server gestellt.
Zu diesem Zeitpunkt wartet der Browser nicht, bis das Bild heruntergeladen wurde, sondern rendert weiterhin den folgenden CodeDer Browser findet ein Skript-Tag enthält eine Zeile Javascript-Code und führt diese schnell aus.
und analysieren Sie es nach dem Herunterladen Stoppen Sie während des Analysevorgangs das Herunterladen aller nach unten gerichteten Elemente der Seite und blockieren Sie das Laden
.Bei einer Neudefinition in JS oder CSS überschreibt die später definierte Funktion die zuvor definierte Funktion.
Es gibt einige Punkte, die erklärt werden müssen: 1. Wir wissen, dass der Verarbeitungsprozess des Browsers das Parsen von HTML ist um einen DOM-Baum zu generieren->Render-Baum basierend auf DOM-Baum und Stylesheet generieren->Render-Render-Baum-Anzeige. Damit Benutzer die Seite schneller sehen können, generiert der Browser beim Parsen des HTML einen partiellen DOM-Baum, und der Browser generiert einen partiellen Render-Baum und zeigt ihn an.
2. In diesem Prozess gibt es zwei externe Ressourcen, die die Skriptausführung und damit das Rendern blockieren, nämlich externes JS und externes CSS. Externes js blockiert die Generierung des DOM-Baums, da der Browser einen stabilen DOM-Baum benötigt und js diese Struktur möglicherweise zerstören kann (natürlich kann es auch den Stil ändern [beachten Sie, dass es sich um einen Stil handelt, nicht um einen Stil). sheet], aber dies blockiert nicht und hat keine Auswirkungen); externe CSS-Stylesheets blockieren auch die Ausführung des Skripts Theoretisch, da das Stylesheet den Dom-Baum nicht ändert Es besteht keine Notwendigkeit, das Dokument zu stoppen. Es liegt jedoch ein Problem vor. Das Skript fordert möglicherweise die Stilinformationen während des Analysevorgangs an wird den falschen Wert erhalten. Dies scheint ein Edge-Fall zu sein, ist aber wirklich üblich. Firefox blockiert alle Skripte, während ein Stylesheet geladen und analysiert wird, während Chrome Skripte nur blockiert, wenn sie versuchen, auf bestimmte Stileigenschaften zuzugreifen, die möglicherweise von einem entladenen Stylesheet betroffen sind.
3. Andere andere externe Ressourcen blockieren das Rendern nicht, wie zum Beispiel Bilder. Wir können sehen, dass oft der allgemeine Rahmen der Seite angezeigt wird . Das heißt, die Position des Bildes wird nicht angezeigt und nach dem Herunterladen des Bildes neu gerendert.
Optimierung für moderne Browser:
Gemäß Standards Browser-Rendering- und Download-Prozess. Der folgende Code lädt externe Ressourcen in derselben Reihenfolge wie die Ressourcen in HTML. Eine externe Ressourcenanforderung http://hm.baidu.com/hm.js?a041a0f4ff93aef6aa83f34134331a1d sollte vor allen Stilen geladen werden
<html> <head>...百度统计代码--> <script>var _hmt = _hmt || []; (function() {var host=document.location.hostname;if(/lcfarm.com$/ig.test(host)){ var hm = document.createElement("script"); hm.src = "//hm.baidu.com/hm.js?a041a0f4ff93aef6aa83f34134331a1d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); } })();script> <link rel="stylesheet" type="text/css" href="//static.lcfarm.com/pc-dist/pkg/index.html_aio_f9db6a6.css?1.1.2"> <link rel="stylesheet" type="text/css" href="//static.lcfarm.com/pc-dist/common/css/common_530eedd.css?1.1.2"> <link rel="stylesheet" type="text/css" href="//static.lcfarm.com/pc-dist/css/index_8b620da.css?1.1.2"> <link rel="stylesheet" type="text/css" href="//static.lcfarm.com/pc-dist/pkg/index.html_aio_2_2379650.css?1.1.2">head> <body>... <script type="text/javascript" data-loader="" src="//static.lcfarm.com/pc-dist/common/dep/mod_36ad799.js?1.1.2">script> <script type="text/javascript" data-loader="" src="//static.lcfarm.com/pc-dist/common/dep/jquery_c07f226.js?1.1.2">script> <script type="text/javascript" src="//static.lcfarm.com/pc-dist/common/js/jquery/jquery.cookie_546183c.js?1.1.2">script> <script type="text/javascript" src="//static.lcfarm.com/pc-dist/pkg/common_85ea494.js?1.1.2">script> <script type="text/javascript" src="//static.lcfarm.com/pc-dist/pkg/index.html_aio_350303c.js?1.1.2">script>body>html>
Aber eigentlich in Chrom. Der folgende Effekt wurde in Firefox, ie8 und anderen Browsern gefunden (getestet mit https://www.webpagetest.org/)
Warum? Dies ist Spekulatives Parsen
Sowohl Webkit als auch Firefox haben diese Optimierung durchgeführt. Wenn das Skript ausgeführt wird, analysiert ein anderer Thread das verbleibende Dokument und lädt Ressourcen die später über das Netzwerk geladen werden müssen. Dieser Ansatz ermöglicht das parallele Laden von Ressourcen, wodurch die Gesamtgeschwindigkeit erhöht wird. Es ist zu beachten, dass das Pre-Parsing den Dom-Baum nicht verändert. Diese Arbeit wird dem Haupt-Parsing-Prozess überlassen, der nur Verweise auf externe Ressourcen wie externe Skripte, Stylesheets und Bilder analysiert.
Wie im Bild oben zu sehen ist, werden beim Ausführen des Skripts viele externe Ressourcenreferenzen analysiert und der Thread gestartet, um sie herunterzuladen. Der Hauptthread wartet immer noch auf die Rückkehr hm.js.
Das Obige ist der Inhalt des Prozesses des Ladens und Renderns von HTML durch den Browser (der Standarddefinitionsprozess und die Optimierung moderner Browser). Weitere verwandte Inhalte finden Sie hier Achten Sie auf die chinesische PHP-Website (www.php.cn)!