Vielleicht weiß jeder, dass die JS-Ausführung die Analyse und Darstellung des DOM-Baums blockiert. Blockiert also das Laden von CSS die Analyse und Darstellung des DOM-Baums? Als Nächstes werde ich die Auswirkungen des CSS-Ladens auf die Analyse und Darstellung des DOM-Baums testen. Um diesen Test abzuschließen, lernen wir zunächst, wie man Chrome verwendet, um die Download-Geschwindigkeit einzustellen \1. Öffnen Sie die Chrome-Konsole (drücken Sie F12). Sie können das folgende Bild sehen. Der Fokus liegt dort, wo ich den roten Kreis zeichne. Klicken Sie auf den roten Kreis (Keine Drosselung) und Sie sehen das folgende Bild. Wir wählen die Option GPRS aus. \2. Klicken Sie auf den roten Kreis (Keine Drosselung), und Sie sehen das folgende Bild. Wir wählen die GPRS-Option Auf diese Weise wird unsere Download-Geschwindigkeitsbegrenzung für Ressourcen auf 20 kb/s begrenzt. OK, kommen wir zur Sache. 3. Auf diese Weise wird die Obergrenze der Downloadgeschwindigkeit unserer Ressource auf 20 kb/s begrenzt. OK, kommen wir zur Sache. Blockiert das Laden von CSS das Parsen und Rendern des DOM-Baums? Reden wir über Code: <!DOCTYPE html> <html lang="de"> <Kopf> <title>CSS-Blockierung</title> <meta charset="UTF-8"> <meta name="viewport" content="width=Gerätebreite, Anfangsmaßstab=1"> <Stil> h1 { Farbe: rot !wichtig } </Stil> <Skript> Funktion h () { Konsole.log(Dokument.QuerySelectorAll('h1')) } setTimeout(h, 0) </Skript> <link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css" rel="stylesheet"> </Kopf> <Text> <h1>Das ist rot</h1> </body> </html> Annahme: Das Laden von CSS blockiert die Analyse und Darstellung des DOM-Baums Annahme: Bevor bootstrap.css geladen wird, wird der folgende Inhalt nicht analysiert und gerendert. Daher sollte das, was wir zuerst sehen, ein weißer Bildschirm sein und h1 wird nicht angezeigt. Und das Ergebnis von console.log sollte zu diesem Zeitpunkt ein leeres Array sein. Tatsächliches Ergebnis: wie unten gezeigt Blockiert CSS die DOM-Baumanalyse? Aus der obigen Abbildung können wir ersehen, dass h1 nicht angezeigt wird, wenn CSS nicht geladen wurde. Die Konsolenausgabe lautet jedoch wie folgt Es ist ersichtlich, dass zu diesem Zeitpunkt der DOM-Baum zumindest bis h1 analysiert wurde, das CSS jedoch noch nicht geladen wurde, was bedeutet, dass das CSS die Analyse des DOM-Baums nicht blockiert. Blockiert das Laden von CSS die Darstellung des DOM-Baums? Aus dem obigen Bild können wir auch erkennen, dass die Seite einen weißen Bildschirm anzeigt, wenn das CSS nicht geladen wurde. Die rote Schrift wird erst angezeigt, wenn das CSS geladen ist. Mit anderen Worten, obwohl der folgende Inhalt analysiert wird, wird er nicht gerendert. Daher blockiert das Laden von CSS die Darstellung des DOM-Baums. Meine persönliche Einschätzung dieses Mechanismus Tatsächlich glaube ich, dass es sich hierbei auch um einen Optimierungsmechanismus des Browsers handeln könnte. Denn wenn Sie CSS laden, können Sie den Stil der folgenden DOM-Knoten ändern. Wenn das Laden von CSS das Rendern des DOM-Baums nicht blockiert, muss der DOM-Baum nach dem Laden von CSS möglicherweise neu gezeichnet oder neu umbrochen werden, was zu unnötigen Verlusten führt. Ich analysiere also zunächst einfach die Struktur des DOM-Baums, erledige die Arbeit, die erledigt werden kann, und rendere dann, nachdem Ihr CSS geladen ist, den DOM-Baum entsprechend dem endgültigen Stil. Dieser Ansatz ist in Bezug auf die Leistung tatsächlich besser. Blockiert das Laden von CSS die Ausführung von JS? Aus der obigen Schlussfolgerung können wir schließen, dass das Laden von CSS die DOM-Baumanalyse nicht blockiert, die DOM-Baumdarstellung jedoch blockiert. Blockiert also das Laden von CSS die JS-Ausführung? Überprüfen Sie dies erneut über den Code. <!DOCTYPE html> <html lang="de"> <Kopf> <title>CSS-Blockierung</title> <meta charset="UTF-8"> <meta name="viewport" content="width=Gerätebreite, Anfangsmaßstab=1"> <Skript> console.log('vor CSS') var startDate = neues Datum() </Skript> <link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css" rel="stylesheet"> </Kopf> <Text> <h1>Das ist rot</h1> <Skript> var endDate = neues Datum() console.log('nach CSS') console.log('verstrichene Zeit' + (Enddatum - Startdatum) + 'ms') </Skript> </body> </html> Annahme: Das Laden von CSS blockiert die nachfolgende Ausführung von JS Erwartetes Ergebnis: Der JS-Code nach dem Link sollte ausgeführt werden, nachdem das CSS geladen wurde. Tatsächliches Ergebnis: Aus der obigen Abbildung können wir ersehen, dass der JS-Code vor der CSS-Ladeanweisung zuerst ausgeführt wird, der Code nach der CSS-Ladeanweisung jedoch erst ausgeführt wird, wenn das CSS geladen ist. Dies zeigt auch, dass das Laden von CSS die Ausführung nachfolgender JS-Anweisungen blockiert. Detaillierte Ergebnisse finden Sie in der folgenden Abbildung (das Laden des CSS dauerte über 5600 ms): abschließend Aus dem oben Gesagten können wir folgende Schlussfolgerungen ziehen:
Um zu vermeiden, dass Benutzer lange Zeit einen weißen Bildschirm sehen, sollten wir die CSS-Ladegeschwindigkeit so weit wie möglich erhöhen, beispielsweise mithilfe der folgenden Methoden:
Prinzipanalyse Warum also tritt das oben beschriebene Phänomen auf? Lassen Sie uns es anhand des Rendering-Prozesses des Browsers analysieren. Verschiedene Browser verwenden unterschiedliche Kernel, daher sind auch ihre Rendering-Prozesse unterschiedlich. Derzeit gibt es zwei Haupttypen: WebKit-Rendering-Prozess Gecko-Rendering-Prozess Aus den beiden Flussdiagrammen oben können wir ersehen, dass der Browser-Rendering-Prozess wie folgt abläuft: Analysieren Sie HTML-Dateien, um einen DOM-Baum zu generieren, und analysieren Sie CSS-Dateien, um einen CSSOM-Baum zu generieren. Kombinieren Sie Dom-Baum und CSSOM-Baum, um einen Render-Baum zu generieren. Rendern und zeichnen Sie entsprechend dem Render-Baum und rendern Sie Pixel auf dem Bildschirm. Aus dem Prozess können wir sehen
DOMContentLoaded Für Browser gibt es zwei Hauptereignisse zum Laden von Seiten: eines ist DOMContentLoaded und das andere ist onLoad. Zu onLoad gibt es nicht viel zu sagen. Es wird erst ausgelöst, nachdem alle Ressourcen der Seite geladen sind. Zu diesen Ressourcen gehören CSS, JS, Bilder, Videos usw. DOMContentLoaded wird, wie der Name schon sagt, ausgelöst, wenn der Inhalt der Seite analysiert wird. Wie wir oben besprochen haben, blockiert CSS die Dom-Darstellung und die JS-Ausführung, und JS blockiert die Dom-Analyse. Dann können wir davon ausgehen, dass
Testen wir zunächst den ersten Fall: <!DOCTYPE html> <html lang="de"> <Kopf> <title>CSS-Blockierung</title> <meta charset="UTF-8"> <meta name="viewport" content="width=Gerätebreite, Anfangsmaßstab=1"> <Skript> document.addEventListener('DOMContentLoaded', Funktion() { console.log('DOMContentLoaded'); }) </Skript> <link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css" rel="stylesheet"> </Kopf> <Text> </body> </html> Die experimentellen Ergebnisse sind in der folgenden Abbildung dargestellt: Aus dem animierten Bild können wir erkennen, dass das Ereignis DOMContentLoaded ausgelöst wurde, bevor das CSS geladen wurde. Weil hinter dem CSS kein JS-Code steckt. Als nächstes testen wir den zweiten Fall. Er ist ganz einfach. Fügen Sie einfach eine Codezeile nach dem CSS hinzu. <!DOCTYPE html> <html lang="de"> <Kopf> <title>CSS-Blockierung</title> <meta charset="UTF-8"> <meta name="viewport" content="width=Gerätebreite, Anfangsmaßstab=1"> <Skript> document.addEventListener('DOMContentLoaded', Funktion() { console.log('DOMContentLoaded'); }) </Skript> <link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css" rel="stylesheet"> <Skript> console.log('Bin ich schon dran?'); </Skript> </Kopf> <Text> </body> </html> Wir können sehen, dass das Ereignis DOMContentLoaded erst ausgelöst wird, nachdem das Laden des CSS abgeschlossen ist. Daher können wir Folgendes schlussfolgern: Wenn die Seite sowohl CSS als auch JS enthält und JS hinter CSS liegt, wird das Ereignis DOMContentLoaded ausgeführt, nachdem CSS geladen wurde. In anderen Fällen wartet DOMContentLoaded nicht auf das Laden von CSS und das Ereignis DOMContentLoaded wartet nicht auf das Laden anderer Ressourcen wie Bilder und Videos. Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. |
<<: So verwenden Sie den EXPLAIN-Befehl in SQL
1. Das in diesem Artikel implementierte Effektdia...
Bei der tatsächlichen Arbeit oder bei Interviews ...
Tag-Typ (Anzeigemodus) HTML-Tags werden im Allgem...
Sublimieren Sublime Text ist ein Code-Editor (Sub...
1. Mehrere Grenzen[1] Hintergrund: Box-Shadow, Um...
Inhaltsverzeichnis Vorwort 1. Daten extrahieren 2...
Inhaltsverzeichnis Anwendungsszenario Einfach aus...
Nginx-Server nginx ist ein ausgezeichneter Webser...
Inhaltsverzeichnis 1. DOM-Diff 2. Fügen Sie Eleme...
Inhaltsverzeichnis Was ist nodejs Installieren Si...
Manche Leute sagen, dass Werbung machen wie ein Me...
Inhaltsverzeichnis 1. Einleitung 2. Installation ...
Zusammenfassung: Dieser Artikel zeigt, wie Avro-D...
Inhaltsverzeichnis Was ist die Listener-Eigenscha...
Vorwort Wie wir alle wissen, legt die Nginx-Konfi...