Heim > Web-Frontend > js-Tutorial > Hauptteil

Probleme im Zusammenhang mit der Optimierung des Dateiladens in js

亚连
Freigeben: 2018-06-13 18:16:06
Original
1193 Leute haben es durchsucht

Im Folgenden werde ich einen Artikel zur Optimierung des Ladens von JS-Dateien (ausführliche Erklärung) mit Ihnen teilen, der einen guten Referenzwert hat und ich hoffe, dass er für alle hilfreich sein wird.

Im JS-Engine-Teil können wir lernen, dass die Rendering-Engine beim Parsen des Skript-Tags die Kontrolle an die JS-Engine übergibt. Wenn das Skript eine externe Ressource lädt, muss es warten, bis es heruntergeladen wird bevor es ausgeführt werden kann. Hier können wir also viel Optimierungsarbeit leisten.

Platzieren Sie es unten im BODY

Damit die Rendering-Engine den DOM-Baum so früh wie möglich rendern kann, müssen wir das Skript dort platzieren Das Phänomen des weißen Bildschirms bedeutet, dass das DOMContentLoaded-Ereignis frühzeitig ausgelöst wird, selbst wenn Sie das js-Skript am Ende des Körpers in iOS Safari und Android platzieren Browser und IOS-Webansicht, das Ergebnis wird immer noch das gleiche sein. Daher sind hier zusätzliche Vorgänge erforderlich, um das Laden von js-Dateien zu optimieren.

LADEN VERSCHIEBEN

Dies ist ein in HTML4 definiertes Skriptattribut, das zur Darstellung beim Rendern verwendet wird Wenn die Engine auf ein Skript stößt, wird das Skript vorübergehend angehalten und geladen, wenn es auf eine externe Ressource verweist. Die Rendering-Engine analysiert weiterhin das folgende HTML-Dokument. Wenn die Analyse abgeschlossen ist, wird das Skript im Skript ausgeführt.

<script src="outside.js" defer></script>
Nach dem Login kopieren

Sein Support ist <=IE9.

Und seine Ausführungsreihenfolge ist streng abhängig, das heißt:

<script src="outside1.js" defer></script>
<script src="outside2.js" defer></script>
Nach dem Login kopieren

Nachdem die Seite analysiert wurde, beginnt er mit der Ausführung Outside1- und Outside2-Dateien nacheinander.

Wenn Sie defer unter IE9 verwenden, werden die beiden möglicherweise nicht nacheinander ausgeführt. Um dies zu handhaben, ist ein Hack erforderlich, der darin besteht, ein leeres Skript-Tag zwischen den beiden

<script src="outside1.js" defer></script>
<script></script> //hack
<script src="outside2.js" defer></script>
Nach dem Login kopieren
< einzufügen 🎜>

ASYNC-Laden

async ist ein neu definiertes Skriptattribut in H5. Es ist ein weiterer js-Lademodus.

Die Rendering-Engine analysiert die Datei (mit Asynchronität)

parst weiterhin die verbleibenden Dateien und lädt parallel die externen Ressourcen des Skripts.

Wenn das Skript geladen wird, stoppt der Browser die Analyse des Dokuments, erteilt der JS-Engine die Berechtigung und gibt das zu ladende Skript an.

Nach der Ausführung das Browser-Analyseskript fortsetzen

Es ist ersichtlich, dass Async auch das Problem des Blockierens des Ladens lösen kann. Allerdings wird async asynchron ausgeführt, was dazu führt, dass die Reihenfolge der Dateiausführung inkonsistent ist. Das heißt:

<script src="outside1.js" async></script>
<script src="outside2.js" async></script>
Nach dem Login kopieren

Zu diesem Zeitpunkt wird derjenige zuerst ausgeführt, der zuerst mit dem Laden fertig ist. Daher sollten Sie für allgemein abhängige Dateien nicht asynchron verwenden, sondern aufschieben.

defer hat eine schlechte Kompatibilität, was IE9+ entspricht, wird aber im Allgemeinen auf mobilen Endgeräten verwendet, sodass dieses Problem nicht besteht.

Skript asynchron

Skript asynchron ist das grundlegende Ladeprinzip, das von einigen asynchronen Ladebibliotheken verwendet wird (z. B. require) Gehen Sie direkt zum Code:

function asyncAdd(src){
  var script = document.createElement(&#39;script&#39;);
  script.src = src;
  document.head.appendChild(script);
}
//加载js文件
asyncAdd("test.js");
Nach dem Login kopieren

Zu diesem Zeitpunkt können Dateien ohne Blockierungseffekte asynchron geladen werden

Allerdings sind die auf diese Weise geladenen js-Dateien nicht in der richtigen Reihenfolge und abhängige Dateien können nicht normal geladen werden.

Zu diesem Zeitpunkt müssen wir die obige Funktion optimieren.

var asyncAdd = (function(){
  var head = document.head,
    script;
  return function(src){
    script = document.createElement(&#39;script&#39;);
    script.src= src;
    script.async=false;
    document.head.appendChild(script);
  }
})();
//加载文件
asyncAdd("first.js");
asyncAdd("second.js");
//或者简便一点
["first.js","second.js"].forEach((src)=>{async(src);});
Nach dem Login kopieren

Wenn Sie jedoch ein Skript zum Laden in einem Schritt verwenden, müssen Sie warten, bis die CSS-Datei geladen ist Der Ladevorgang beginnt, wodurch der Browser nicht vollständig genutzt werden kann. Vorteile des gleichzeitigen Ladens. Dieses Problem tritt nicht auf, wenn statischer Text zum asynchronen Laden oder Zurückstellen verwendet wird.

Wenn Sie Skripte zum asynchronen Laden verwenden, können Sie vor dem Laden nur warten, bis das CSS geladen ist.

Bei Verwendung des statischen asynchronen Ladens werden CSS und JS gleichzeitig geladen

Wie man zwischen den dreien wählt, hängt hauptsächlich davon ab, welches Ziel uns der Anführer gibt, ob es mit IE8, 9, Mobiltelefon, Desktop-Browser oder einer Kombination aus beiden kompatibel ist.

Aber in Szenarien, in denen eine bestimmte Fähigkeit allein verwendet wird, müssen Sie bei der Verwendung einige Tipps beachten.

Die js-Datei sollte am Ende des Körpers platziert werden

Wenn asynchron verwendet wird, fügen Sie aus Gründen der Abwärtskompatibilität „defer“ am Ende hinzu

<script src="test.js" async defer></script> //如果两者都支持,async会默认覆盖掉defer
//如果只支持一个,则执行对应的即可
Nach dem Login kopieren
Normalerweise handelt es sich bei den von uns verwendeten Lasten um verzögerte Lasten (aufgrund der starken Abhängigkeiten). Das oben Gesagte habe ich für alle zusammengestellt. Ich hoffe, dass es in Zukunft für alle hilfreich sein wird.

Verwandte Artikel:

Verwendung von Async- und Await-Funktionen in Node.js

Lösung des Problems, dass Webpack nicht auf 127.0.0.1 zugreifen kann

Remotezugriffskonfigurationsmethode im Webpack-Dev-Server implementieren

Das obige ist der detaillierte Inhalt vonProbleme im Zusammenhang mit der Optimierung des Dateiladens in js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!