Heim > Artikel > Web-Frontend > So optimieren Sie die Webseitenleistung
Das Frontend ist riesig und umfasst HTML, CSS, Javascript, Bild, Flash und andere verschiedene Ressourcen. Die Frontend-Optimierung ist komplex und es gibt unterschiedliche Methoden für alle Aspekte der Ressourcen. Was ist also der Zweck der Front-End-Optimierung?
1. Aus Benutzersicht kann die Optimierung dazu führen, dass Seiten schneller geladen werden, schneller auf Benutzervorgänge reagiert wird und den Benutzern ein benutzerfreundlicheres Erlebnis geboten wird.
2. Aus Sicht des Dienstanbieters kann die Optimierung die Anzahl der Seitenanfragen reduzieren oder die von Anfragen belegte Bandbreite reduzieren, wodurch erhebliche Ressourcen eingespart werden können.
Kurz gesagt, eine ordnungsgemäße Optimierung kann nicht nur das Benutzererlebnis der Website verbessern, sondern auch eine erhebliche Ressourcenauslastung einsparen.
Es gibt viele Möglichkeiten, das Front-End zu optimieren, die je nach Granularität grob in zwei Kategorien unterteilt werden können. Die erste Kategorie ist die Optimierung auf Seitenebene, z. B. die Anzahl der HTTP-Anfragen und das nicht blockierende Laden von Skripten , Positionsoptimierung von Inline-Skripten usw.; die zweite Kategorie ist die Optimierung auf Codeebene, wie z. B. DOM-Operationsoptimierung in Javascript, CSS-Selektoroptimierung, Bildoptimierung, HTML-Strukturoptimierung usw. Darüber hinaus werden mit dem Ziel, das Input-Output-Verhältnis zu verbessern, die verschiedenen später erwähnten Optimierungsstrategien grob in der Reihenfolge vom großen zum kleinen Input-Output-Verhältnis angeordnet.
1. Optimierung auf Seitenebene
1. Reduzieren Sie die Anzahl der HTTP-Anfragen
Diese Strategie ist grundsätzlich allen Frontend-Leuten bekannt und auch die wichtigste und effektivste. Man sagt, dass HTTP-Anfragen reduziert werden sollten, aber was passiert, wenn es zu viele Anfragen gibt? Erstens verursacht jede Anfrage Kosten, einschließlich Zeit- und Ressourcenkosten. Eine vollständige Anfrage erfordert einen „langen“ und komplizierten Prozess der DNS-Adressierung, des Herstellens einer Verbindung mit dem Server, des Sendens von Daten, des Wartens auf die Antwort des Servers und des Empfangens von Daten. Der Zeitaufwand besteht darin, dass Benutzer warten müssen, bis der Prozess beendet ist, um die Ressource zu sehen oder zu „fühlen“. Da jede Anforderung an die Ressource Daten übertragen muss, ist Bandbreite erforderlich. Da es außerdem eine Obergrenze für die Anzahl gleichzeitiger Anfragen gibt, die der Browser stellen kann (Einzelheiten finden Sie hier), muss der Browser bei steigender Anzahl von Anfragen Anfragen in Stapeln stellen, was die Wartezeit des Benutzers verlängert und den Eindruck einer langsamen Geschwindigkeit erwecken, dass der Fortschrittsbalken des Browsers immer vorhanden ist, selbst wenn alle Ressourcen auf dem ersten Bildschirm, die der Benutzer sehen kann, angefordert wurden.
Zu den wichtigsten Möglichkeiten, die Anzahl der HTTP-Anfragen zu reduzieren, gehören:
(1) Vereinfachen Sie die Seite auf der Design- und Implementierungsebene.
Wenn Ihre Seite so einfach ist wie die Homepage von Baidu, gelten im Wesentlichen die folgenden Regeln unnötig. Am einfachsten ist es, die Seite einfach zu halten und den Ressourcenverbrauch zu reduzieren. Wenn nicht und Ihre Seite einen wunderschönen Skin benötigt, lesen Sie weiter unten.
(2). Richtig eingestellter HTTP-Cache
Die Leistung des Caches ist leistungsstark und die richtigen Cache-Einstellungen können HTTP-Anfragen erheblich reduzieren. Wenn der Browser die Homepage von Youa als Beispiel nicht zwischenspeichert, werden insgesamt 78 Anfragen mit insgesamt mehr als 600.000 Daten ausgegeben (wie in Abbildung 1.1 dargestellt). Hat es zwischengespeichert, gibt es nur 10 Anfragen mit insgesamt mehr als 20.000 Daten (Abbildung 1.2). (Hier ist zu beachten, dass der Effekt anders ausfällt, wenn Sie die Seite direkt mit F5 aktualisieren. In diesem Fall ist die Anzahl der Anfragen immer noch gleich, aber der Anfrageserver für die zwischengespeicherte Ressource ist eine 304-Antwort. Nur die Der Header hat keinen Body, wodurch Bandbreite gespart werden kann.
Was ist eine sinnvolle Einstellung? Das Prinzip ist ganz einfach: Je mehr Sie zwischenspeichern können, desto besser. Beispielsweise können Bildressourcen, die sich selten ändern, direkt über Expires im HTTP-Header einen Header mit langem Ablauf festlegen. Ressourcen, die sich selten ändern, können jedoch „Last-Modifed“ zur Anforderungsüberprüfung verwenden. Behalten Sie Ressourcen so lange wie möglich im Cache. Die spezifischen Einstellungen und Prinzipien des HTTP-Cachings werden hier nicht im Detail beschrieben. Interessierte können sich auf die folgenden Artikel beziehen:
Beschreibung der Caching-Strategien im HTTP1.1-Protokoll
Fiddler HTTP Leistung Einführung in das Caching in
(3). Zusammenführen und Komprimieren von Ressourcen
Wenn möglich, führen Sie externe Skripte und Stile so weit wie möglich zusammen und führen Sie mehrere zu einem zusammen. Darüber hinaus können CSS, Javascript und Bilder mit entsprechenden Tools komprimiert werden. Nach der Komprimierung kann häufig viel Platz gespart werden.
(4). CSS-Sprites
Das Zusammenführen von CSS-Bildern ist eine weitere gute Möglichkeit, die Anzahl der Anfragen zu reduzieren.
(5). Inline-Bilder
Daten verwenden:
Das URL-Schema wird zum Einbetten von Bildern in Seiten oder CSS verwendet. Dies ist eine gute Methode, wenn Ressourcenverwaltungsprobleme nicht berücksichtigt werden. Wenn es in die Seite eingebettet ist, wird die Seite vergrößert und der Browser-Cache kann nicht verwendet werden. In CSS verwendete Bilder sind idealer.
(6). Lazy Load Images (Ich verstehe den Inhalt dieses Abschnitts immer noch nicht)
Diese Strategie reduziert möglicherweise nicht wirklich die Anzahl der HTTP-Anfragen, kann aber unter bestimmten Bedingungen oder wenn die Seite gerade geladen wird, die Anzahl der HTTP-Anfragen reduzieren. Bei Bildern können Sie nur den ersten Bildschirm laden, wenn die Seite gerade geladen wird, und nachfolgende Bilder nur laden, wenn der Benutzer weiter zurückscrollt. Wenn sich der Benutzer auf diese Weise nur für den Inhalt des ersten Bildschirms interessiert, werden die restlichen Bildanfragen gespeichert.
Ja Startseite
Der bisherige Ansatz bestand darin, die Bildadressen nach dem ersten Bildschirm beim Laden im Textarea-Tag zwischenzuspeichern und sie dann „träge“ zu laden, wenn der Benutzer nach unten scrollt.
2. Platzieren Sie das externe Skript unten (laden Sie den Skriptinhalt, nachdem die Seiteninformationen geladen wurden).
Wie bereits erwähnt, kann der Browser gleichzeitig Anfragen stellen, was das Laden externer Ressourcen beschleunigt Link-Skripte blockieren beim Laden andere Ressourcen. Beispielsweise werden die Bilder, Stile und anderen Skripte dahinter blockiert und der Ladevorgang wird erst gestartet, wenn das Skript geladen ist. Wenn das Skript an einer relativ hohen Position platziert wird, wirkt sich dies auf die Ladegeschwindigkeit der gesamten Seite und somit auf das Benutzererlebnis aus. Es gibt viele Möglichkeiten, dieses Problem zu lösen
Hier ist eine detailliertere Einführung
(Hier ist die Übersetzung und
Detailliertere Beispiele
), und die einfachste und zuverlässigste Methode besteht darin, das Skript so weit wie möglich nach hinten zu verschieben, um die Auswirkungen auf gleichzeitige Downloads zu reduzieren.
3. Führen Sie Inline-Skripte asynchron aus (tatsächlich ist das Prinzip dasselbe wie oben, um sicherzustellen, dass das Skript nach dem Seiteninhalt geladen wird.)
Die Auswirkungen von Inline-Skripten auf die Leistung sind noch schlimmer als die von externen Skripte. Wie externe Skripte blockieren Inline-Skripte auch gleichzeitige Anforderungen, wenn sie ausgeführt werden. Da der Browser außerdem Single-Threaded in der Seitenverarbeitung ist, wird die Seitenrendering-Arbeit verschoben, wenn das Inline-Skript ausgeführt wird, bevor die Seite gerendert wird . Kurz gesagt: Wenn das Inline-Skript ausgeführt wird, ist die Seite leer. Aus den beiden oben genannten Gründen wird empfohlen, Inline-Skripte asynchron auszuführen, deren Ausführung lange dauert. Es gibt viele asynchrone Methoden, z. B. die Verwendung des Defer-Attributs des Skriptelements (es gibt Kompatibilitätsprobleme und andere Probleme, z da document.write nicht verwendet werden kann), verwenden Sie setTimeout
, zusätzlich in HTML5 eingeführt
Der Mechanismus der Web Worker kann genau diese Art von Problem lösen.
4. Lazy Load Javascript (Wird nur bei Bedarf geladen, Informationsinhalte werden unter normalen Umständen nicht geladen.)
Mit der Popularität von Javascript-Frameworks verwenden immer mehr Websites diesen Frame. Ein Framework enthält jedoch häufig viele funktionale Implementierungen, die nicht von jeder Seite benötigt werden. Das Herunterladen unnötiger Skripte ist eine Verschwendung von Ressourcen und verschwendet sowohl Bandbreite als auch Ausführungszeit. Derzeit gibt es zwei Ansätze, eine spezielle Mini-Version des Frameworks für Seiten mit besonders hohem Datenverkehr anzupassen, und der andere ist Lazy Load. YUI verwendet die zweite Methode. Bei der Implementierung von YUI wird zunächst nur das Kernmodul geladen, und andere Module können warten, bis sie benötigt werden.
5. Platzieren Sie CSS in HEAD
Wenn Sie CSS an anderen Stellen wie BODY platzieren, beginnt der Browser möglicherweise mit dem Rendern der Seite, bevor er das CSS herunterlädt und analysiert, was dazu führt, dass die Seite vom CSS springt. less-Status auf den CSS-Status um, was zu einer schlechten Benutzererfahrung führt. Darüber hinaus beginnen einige Browser erst mit dem Rendern der Seite, nachdem das CSS heruntergeladen wurde. Wenn das CSS an einer niedrigeren Position platziert wird, verzögert der Browser die Renderzeit.
6. Asynchroner Anforderungsrückruf (dh Extrahieren einiger Verhaltensstile und langsames Laden des Informationsinhalts)
Auf einigen Seiten kann es erforderlich sein, Skript-Tags zu verwenden, um Daten asynchron anzufordern. Ähnlich:
Javascript:
/*Callback-Funktion*/
function myCallback(info){
//hier etwas tun
}
HTML:
Von cb zurückgegebener Inhalt:
myCallback('Hello world!');
Das direkte Schreiben von