Der gesamte Inhalt dieses Blogs ist unter Creative Commons-Lizenzen lizenziert. Wenn Sie diesen Inhalt zitieren, geben Sie bitte Zhu Tao als Quelle an und handeln Sie nicht kommerziell . EinführungIch habe mehrere webbasierte Projekte abgeschlossen und gelernt, wie Front-End-JS, CSS, HTML und Back-End-Python/PHP miteinander interagieren und wie der Browser sie ausführt. Eine Frage blieb mir jedoch immer im Kopf: Ein HTML verfügt über mehrere externe Ressourcen (JS, CSS, Flash, Bild usw.). Wann werden diese Anfragen heruntergeladen und ausgeführt? Ich weiß nicht, wann das von mir geschriebene JS ausgeführt wird, und ich weiß nicht, warum viele Vorschläge zur Verbesserung der Leistung darin bestehen, JS vor das </body> am Ende des HTML zu setzen. Wenn Sie sich nicht sicher sind, kommen Sie bitte und lernen Sie mit mir. Spezifische AnalyseSehen wir uns zunächst eine Beispiel-HTML-Seite an: <html>
<Kopf>
<script src= "/static/jquery.js" Typ= "text/javascript" ></script>
<script src= "/static/abc.js" Typ= "text/javascript" >
</Skript>
<link rel= "Stylesheets" Typ= "Text/css" href= "/static/abc.css" ></link>
<Skript>
$( Dokument ).bereit( Funktion (){
$( "#img" ).attr( "src" , "/static/kkk.png" );
});
</Skript>
</Kopf>
<Text>
<div>
<img id= "img" src= "/static/abc.jpg" style= "Breite: 400px; Höhe: 300px;" />
<script src= "/static/kkk.js" Typ= "text/javascript" ></script>
</body>
</html>
Es verfügt über die folgenden Ressourcen:
Das sind insgesamt 6 HTTP-Anfragen. Schauen wir uns vor der Analyse das Ergebnis der Firefox-Anforderung für dieses HTML an, wie unten dargestellt: ![]() Schauen wir uns das Ergebnis der Anforderung dieses HTML durch Chrome (Linux) an, wie in der folgenden Abbildung dargestellt (die Abbildung ist relativ klein und kann in einem neuen Tab geöffnet werden): ![]() Lassen Sie uns dies zunächst analysieren und dann den Unterschied zwischen den Ergebnissen dieser beiden Anfragen erklären. Analyse anfordernZunächst möchte ich darauf hinweisen, dass die folgenden Beschreibungen hauptsächlich auf meinen eigenen Google-Suchen, der Konsultation von Freunden und dem Abrufen dieser Informationen über SO und IRC basieren. Ich habe die relevanten Spezifikationen nicht gelesen (natürlich würde ich sie gerne lesen, wenn Sie relevante Spezifikationen kennen, hinterlassen Sie bitte eine Nachricht, danke) und kann deren Richtigkeit und Genauigkeit nicht garantieren. Sie sind für Ihre eigenen Risiken verantwortlich :D. Auf Grundlage einschlägiger Untersuchungen gehe ich davon aus, dass der Browser bei einer URI-Anforderung die folgende Anforderungs- und Ausführungsreihenfolge befolgt:
Wie viele Verbindungen (Threads) eine Anfrage gleichzeitig haben kann, hängt vom jeweiligen Browser ab. Der http1.1-Standard legt fest, dass es nicht mehr als 2 Verbindungen zum selben Server/Proxy (also Hostnamen) geben darf, aber in tatsächlichen Browserimplementierungen lauten die Details wie folgt: Feuerfuchs 2: 2 Firefox 3: 6 Oper 9.26: 4 Opera 9.5 Beta: 4 Safari 3.0.4 Mac/Windows: 4 IE 7: 2 IE 8: 6 Überlegen Sie sich daher bitte die obige Download-Reihenfolge entsprechend dieser tatsächlichen Situation. Schauen wir uns dann die Ausführungsreihenfolge an (JS-Ausführung, CSS-Anwendung usw.):
Wenn in tatsächlichen Browsern ein <script>-Tag auftritt, wird automatisch der Download anderer Threads blockiert, z. B. von Firefox. Aus diesem Grund wird in der Webentwicklung häufig empfohlen, das <script>-Tag vor </body> zu setzen. Aber nicht alle Browser blockieren, beispielsweise blockiert Chrome keine anderen Verbindungen. Die spezifische Belastung muss sich also immer noch auf die spezifische Browserimplementierung beziehen. Es wird empfohlen , das Tag <script></script> vor </body> zu setzen, da dies in den meisten Fällen zu einer besseren Leistung führt. Anfrageanalyse für Firefox und ChromeWerfen wir noch einmal einen Blick auf die Anforderungs-Antwort-Diagramme in den beiden obigen Abbildungen. FeuerfuchsEs verfügt über die folgenden Funktionen:
ChromEs verfügt über die folgenden Funktionen:
Sie fragen sich vielleicht, ob js parallel heruntergeladen werden können, dann wird der Code unterhalb des DOM zuerst ausgeführt. Zunächst einmal ist es sicher, dass selbst wenn das folgende js zuerst heruntergeladen wird, dies die allgemeine Ausführungsreihenfolge von oben nach unten nicht beeinflusst. Der Browser wird diese Reihenfolge beibehalten . Diese Methode von Chrome ist auch ein Trend zukünftiger Browser, und dies ist einer der Gründe, warum Chrome schneller sein kann. Eine interessante EpisodeNachdem ich diese Frage gestellt hatte, begann ich, viel zu recherchieren. Ich befragte Freunde, stellte SO-Fragen und fragte sogar im Firefox IRC nach. Die Freunde, die mir antworteten, waren alle sehr geduldig. Die meisten stellten mir jedoch eine Frage : Warum muss man diese Details bei der Webentwicklung kennen ? Solche Fragen verwirren mich noch immer. Ich war schon immer der Meinung, dass ein guter Programmierer nicht nur wissen muss, wie, sondern auch, was und sogar warum . „Wissen wie“ bedeutet lediglich, dass Sie ein qualifizierter Programmierer sind, der für die Entwicklung einfach das verwenden kann, was andere bereitstellen. Wenn Sie wissen, was passiert, beginnen Sie, darauf zu achten, wie die Dinge hinter den Kulissen ablaufen. Mit der Zeit werden Sie nach und nach ein erfahrener Programmierer. Wenn Sie wissen, warum, sind Sie auf dem Weg, ein Hacker zu werden, und bewegen sich allmählich in Richtung eines technischen Experten. Auf lange Sicht werden Sie viel erreichen. Lesen Sie „So werden Sie ein Hacker“. Genießen wir die Einzelheiten und das wesentliche Glück, statt nur auf der oberflächlichen Ebene des Glücks zu bleiben. abschließendAlle großen Hersteller konkurrieren um den Markt der Browser, egal ob sie unabhängig sind (Firefox, Chrome, IE, Opera, Safari) oder auf bestimmten Kerneln basieren (Aoyou, Sogou, TT, 360 usw.). Sicher ist jedoch, dass die Browser leistungsfähiger werden, Standards einhalten, schneller reagieren usw. und dass unser Leben als Webprogrammierer deutlich angenehmer wird. Einige Details in diesem Artikel sind noch vage und ich werde möglicherweise später einen weiteren Artikel schreiben, um eine ausführlichere und klarere Erklärung zu liefern. Willkommen zur Diskussion. NachtragDiesmal habe ich keine Kosten gescheut. Ich hatte zuvor fast 400 SO-Reputationspunkte gesammelt und schickte sofort 150 Leute los, um die zufriedenstellendste Antwort zu finden. Nähere Informationen finden Sie unter: Lade- und Ausführungsreihenfolge einer Webseite? Im Beitrag finden Sie eine ausführlichere Antwort, die Sie als Referenz verwenden können. Verweise
|
<<: Detaillierte Erklärung der JS-Array-Methoden
Inhaltsverzeichnis Überblick 1. Download über URL...
Es gibt einen Tabellenbenutzer und die Felder sin...
Vorwort Zabbix ist eine der gängigsten Open-Sourc...
1. Was ist Docker? (1) Docker ist ein Open-Source...
1. Lösung für das Problem, dass die Seite leer is...
In diesem Artikel finden Sie das Installations- u...
Die Installation von MySQL 5.7 auf Ubuntu 1804 wi...
Ziehen Sie das Bild: [mall@VM_0_7_centos ~]$ sudo...
Es gibt zwei Hauptgründe, warum es schwierig ist,...
Inhaltsverzeichnis $.ajax von jQuery Der Beginn d...
Da ich MySQL schon so lange verwende, glaube ich,...
Inhaltsverzeichnis 1. Docker installieren 2. Erst...
In letzter Zeit stoße ich bei der Verwendung von ...
Vorwort Dieser Artikel stellt hauptsächlich die r...
Inhaltsverzeichnis Überblick Einzelne Dateikompon...