DOMContentLoaded und ladenLassen Sie uns zunächst zwei Ereignisse verstehen, die bei der nachfolgenden Analyse hilfreich sein werden. Ladeereignis: „Load“ sollte nur verwendet werden, um eine vollständig geladene Seite zu erkennen. Das Ladeereignis wird ausgelöst, wenn eine Ressource und ihre abhängigen Ressourcen vollständig geladen sind. Mit anderen Worten, das Ladeereignis wird erst ausgelöst, nachdem das HTML, CSS, JS, die Bilder und andere Ressourcen der Seite geladen wurden. DOMContentLoaded-Ereignis: Das DOMContentLoaded-Ereignis wird ausgelöst, wenn das ursprüngliche HTML-Dokument vollständig geladen und analysiert wurde, ohne auf das vollständige Laden von Stylesheets, Bildern und Unterframes zu warten. Mit anderen Worten, das Ereignis „DOMContentLoaded“ wird ausgelöst, wenn der DOM-Baum erstellt wurde. Was ist eine JS-Blockierung?Da JS während der Ausführung das DOM bedienen, neu strukturieren und neu zeichnen kann, schließen sich der GUI-Rendering-Thread und der JS-Engine-Thread gegenseitig aus. Wenn beim Parsen von HTML ein Skript-Tag gefunden wird, unterbricht der Rendering-Thread den Rendering-Prozess und übergibt die Kontrolle an die JS-Engine. Inline-JS-Code wird direkt ausgeführt. Wenn es sich um eine externe JS-Datei handelt, müssen Sie die JS-Datei herunterladen und nach Abschluss des Downloads ausführen. Nachdem die JS-Engine fertig ist, gibt der Browser die Kontrolle an den Rendering-Thread zurück und fährt mit der DOM-Analyse fort. Daher blockiert js den Aufbau des DOM-Baums. Wird dadurch die Anzeige der Seite blockiert? Testen wir es mit dem folgenden Code. <!DOCTYPE html> <html lang="de"> <Kopf> <meta charset="UTF-8"> <meta http-equiv="X-UA-kompatibel" content="IE=edge"> <meta name="viewport" content="width=Gerätebreite, Anfangsmaßstab=1.0"> <title>Dokument</title> </Kopf> <Text> <div>Hallo Welt</div> <Skript> Debugger </Skript> <div>hallo welt2</div> </body> </html> Es ist ersichtlich, dass das Laden des DOMContents dieser Seite 2,23 s dauert, was zeigt, dass js den Aufbau des DOM-Baums blockiert. Allerdings wird „Hallo Welt“ fast augenblicklich auf der Seite angezeigt, was darauf hinweist, dass js die Darstellung der davor liegenden DOM-Elemente nicht blockiert. Für ein besseres Benutzererlebnis versuchen moderne Browser-Rendering-Engines, Inhalte so schnell wie möglich auf dem Bildschirm anzuzeigen. Es wartet nicht, bis die gesamte DOM-Analyse abgeschlossen ist, bevor der Renderbaum angelegt wird. Stattdessen werden bei einer JS-Blockierung die bereits erstellten DOM-Elemente auf dem Bildschirm gerendert, um die Zeit des weißen Bildschirms zu verkürzen. Aus diesem Grund platzieren wir das Skript-Tag am Ende des Body-Tags, damit es die Darstellung der vorherigen Seite nicht beeinträchtigt. Was ist CSS-Blockierung?Wenn wir beim Parsen von HTML auf ein Link-Tag oder ein Style-Tag stoßen, berechnen wir den Stil und erstellen das CSSOM. CSS blockiert nicht den Aufbau des DOM-Baums, aber die Anzeige der Seite. Probieren wir es doch noch mal anhand eines Beispiels: <!DOCTYPE html> <html lang="de"> <Kopf> <meta charset="UTF-8"> <meta http-equiv="X-UA-kompatibel" content="IE=edge"> <meta name="viewport" content="width=Gerätebreite, Anfangsmaßstab=1.0"> <title>Dokument</title> <link rel="stylesheet" type="text/css" href="https://h5.sinaimg.cn/m/weibo-pro/css/chunk-vendors.d6cac585.css"> </Kopf> <Text> <div class="woo-spinner-filled">hallo Welt</div> <div>hallo welt2</div> </body> </html> Verwenden Sie eine externe CSS-Datei und öffnen Sie Slow 3G, um eine langsamere Netzwerkgeschwindigkeit zu simulieren. Sie können sehen, dass es nur 30 ms dauert, bis das Ereignis DOMContentLoaded ausgelöst wird. Die Seite ist zu diesem Zeitpunkt noch leer und der Inhalt erscheint erst fast 2,92 Sekunden nach dem Auftreten des geladenen Ereignisses auf der Seite. Der Grund dafür ist, dass der Browser während der Erstellung des CSSOM keine der verarbeiteten Inhalte rendert. Auch wenn das DOM analysiert wurde, zeigt die Seite keinen Inhalt an, solange das CSSOM nicht erstellt ist. CSSOM wird nur erstellt, wenn wir auf ein Link-Tag oder ein Style-Tag stoßen. Wenn sich also vor dem Link-Tag ein DOM-Element befindet, kommt es beim Laden von CSS zu einer Blockierung. <Text> <div class="woo-spinner-filled">hallo Welt</div> <link rel="stylesheet" type="text/css" href="https://h5.sinaimg.cn/m/weibo-pro/css/chunk-vendors.d6cac585.css"> <div>hallo welt2</div> </body> Dies führt zu einem Problem, nämlich Seitenflackern. Bevor das CSS geladen wird, rendert der Browser <div class="woo-spinner-filled">hallo welt</div> gemäß dem Standardstil. Wenn das CSS geladen wird, wird ein neuer Stil für das Div berechnet und es wird erneut gerendert, was zu einem Flackereffekt führt. Um Seitenflimmern zu vermeiden, werden Link-Tags üblicherweise im Kopf platziert. Blockiert CSS die nachfolgende JS-Ausführung? Die Antwort ist ja! Bei JS geht es um Modifikation. Es hilft uns, jeden Aspekt einer Webseite zu ändern: Inhalt, Stil und wie sie auf Benutzerinteraktion reagiert. Diese „alle Aspekte“ der Änderung sind im Wesentlichen Änderungen am DOM und CSSDOM. Wenn auf den Stil eines Elements in CSSDOM in JS zugegriffen wird, müssen Sie warten, bis der Stil heruntergeladen wurde, bevor Sie mit der Ausführung des JS-Skripts fortfahren können. Führen Sie das folgende Beispiel aus und Sie werden feststellen, dass „Dies ist ein Test“ erst in der Konsole ausgegeben wird, nachdem das CSS geladen wurde. <!DOCTYPE html> <html lang="de"> <Kopf> <meta charset="UTF-8"> <meta http-equiv="X-UA-kompatibel" content="IE=edge"> <meta name="viewport" content="width=Gerätebreite, Anfangsmaßstab=1.0"> <title>Dokument</title> <link rel="stylesheet" type="text/css" href="https://h5.sinaimg.cn/m/weibo-pro/css/chunk-vendors.d6cac585.css"> </Kopf> <Text> <div class="woo-spinner-filled">hallo Welt</div> <div>hallo welt2</div> <Skript> console.log('Dies ist ein Test') </Skript> </body> </html> OptimierungVerwenden Sie Inline-JavaScript und CSS, damit der Rendering-Prozess direkt nach dem Abrufen der HTML-Datei starten kann. Nicht alle Situationen sind für Inlining geeignet. Sie können daher auch versuchen, die Dateigröße zu reduzieren, indem Sie beispielsweise nutzlosen Code löschen und die Größe von CSS- und JavaScript-Dateien mithilfe von Konstruktionstools wie webpack komprimieren oder CDN aktivieren, um das Herunterladen von Dateien zu beschleunigen. Bei großen CSS-Dateien können Sie Media-Query-Attribute verwenden, um sie in mehrere CSS-Dateien für unterschiedliche Zwecke aufzuteilen, sodass bestimmte CSS-Dateien nur in bestimmten Szenarien geladen werden. Wenn die JavaScript-Datei keinen DOM-bezogenen Code enthält, können Sie das JavaScript-Skript so einstellen, dass es asynchron geladen wird, indem Sie den Code mit „async“ oder „defer“ markieren. <script src="index.js"></script> //Der Browser muss warten, bis index.js geladen und ausgeführt ist, bevor er etwas anderes tun kann. <script async src="index.js"></script> //Das Laden von index.js erfolgt asynchron und hindert den Browser während des Ladens nicht daran, andere Dinge zu tun. //Wenn der Ladevorgang abgeschlossen ist, wird das JS-Skript sofort ausgeführt. <script defer src="index.js"></script> //Das Laden von JS erfolgt asynchron und die Ausführung wird verzögert. //Mit „defer“ markierte Skriptdateien warten, bis das gesamte Dokument analysiert und ausgeführt wurde, bevor das Ereignis DOMContentLoaded ausgelöst wird. ZusammenfassenDies ist das Ende dieses Artikels über das Blockierungsproblem von JS und CSS. Weitere relevante Inhalte zum Blockieren von JS und CSS finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
>>: So erstellen Sie ein Docker-Repository mit Nexus
Vorwort Das MySQL Slow Query Log ist eine Funktio...
Auf einer Seite gibt es viele Steuerelemente (Elem...
Schauen wir uns zunächst meine grundlegende Entwi...
Inhaltsverzeichnis Vorwort Welche Situationen kön...
Inhaltsverzeichnis 1. Lassen Sie uns zunächst erk...
Inhaltsverzeichnis 1. Array-Induktion 1. Teilen S...
In diesem Artikel werden die spezifischen Schritt...
Inhaltsverzeichnis Vorwort Text Parameter Beispie...
Trotz Props und Events müssen Sie manchmal immer ...
Eine interessante Entdeckung: Es gibt eine Tabell...
Hintergrund Die Menge neuer Daten in der Geschäft...
Farbkontrast und Harmonie Unter kontrastierenden ...
Ich habe gerade angefangen, React für Projekte zu...
Upgrade der Linux-Version: 1. Stellen Sie zunächs...
Apache Arrow ist ein beliebtes Format, das von ve...