Sprechen Sie über Front-End-Leistungsindikatoren

Autor: Jingdong Technology Hao Liang

Vorwort: Als C-End-Front-End-Forschung und -Entwicklung muss es neben der Überwindung geschäftlicher Schwierigkeiten auch ein tieferes Selbstziel geben, nämlich die Leistungsoptimierung. Diese Angelegenheit ist weder groß noch klein, aber die Schwierigkeit ist definitiv nicht alltäglich, und der damit verbundene Umfang der Optimierung ist ein tiefgreifendes Engineering jeder Zelle. Bei der Frontend-Performance-Optimierung gute Arbeit zu leisten, ist keineswegs eine leichte Aufgabe! Der Hauptinhalt des Artikels stellt die Front-End-Leistungsbewertungsindikatoren und Optimierungsschemata vor.

 

1. Was sind die Front-End-Leistungsindikatoren?

Nach den neuesten Regeln von Chrome Lighthouse umfassen die Frontend-Leistungsindikatoren hauptsächlich FCP (First Contenful Paint), SI (Speed ​​Index), LCP (Largest Contentful Paint), TBT (Total Blocking Time), CLS (Cumulative Layout Shift), sind die Proportionen wie folgt .



 

2. Was ist FCP?

FCP: First Contentful Paint Die erste Inhaltszeichnung bezieht sich auf die Messung der Zeit vom Beginn des Ladens der Seite bis zum Abschluss der Wiedergabe auf dem Bildschirm eines beliebigen Teils des Seiteninhalts (Text, Bild, Hintergrundbild, SVG-Element bzw nicht weißes Leinwandelement), das ein Maß für die Wahrnehmung der Ladegeschwindigkeit ist, einer der wichtigen Indikatoren.

Beispiel:



Aus der obigen Abbildung ist ersichtlich, dass in der Zeitleiste vom Beginn des Ladens der Seite bis zum Abschluss des Seitenrenderings FCP im zweiten Frame auftritt und der erste Stapel von Text und Bildern auf dem Bildschirm gerendert wurde.

Obwohl ein Teil des Inhalts der Seite gerendert wurde, wurde nicht der gesamte Inhalt der Seite gerendert; dies ist der wichtigste Unterschied zwischen First Content Paint (FCP) und Largest Content Paint (LCP).

FCP-Leistungswert: Die Renderzeit der ersten Inhaltszeichnung sollte innerhalb von 1,8 Sekunden gesteuert werden.

Wir können FCP aus den folgenden Richtungen optimieren:

Eliminieren Sie Render-Blocking-Ressourcen:
<script>-Tag: innerhalb des <head>-Tags und hat kein defer/async-Attribut
<link rel="stylesheet">-Tag: kein deaktiviertes Attribut, media="all"-Attribut wird als Rendering-Blockierung betrachtet
CSS-Größe reduzieren: Schreibmethode, CSS komprimieren
Entfernen Sie unbenutztes CSS
Mit gewünschter Quelle vorverbinden: <link rel="preconnect">
Reduzieren Sie die Antwortzeit des Servers (TTFB)
Vermeiden Sie Umleitungen mehrerer Seiten: Wenn ein Browser eine Ressource anfordert, die bereits weitergeleitet wurde, gibt der Server eine HTTP-Antwort zurück, und der Browser muss dann eine weitere HTTP-Anforderung an der neuen Position ausgeben, um die Ressource abzurufen. Diese zusätzliche Netzwerkübertragung kann das Laden von Ressourcen um Hunderte von Millisekunden verzögern.
Schlüsselanforderungen vorab laden: <link rel="preload" href="styles,css" as="style" />
Vermeiden Sie große Netzwerklasten: Die mittlere Netzwerklast liegt zwischen 1700 und 1900 KiB. Lighthouse kennzeichnet Seiten mit Gesamtnetzwerkanfragen von mehr als 5000 KiB. Halten Sie die Gesamtbytegröße unter 1600 KiB.
Minifizierung und Komprimierung von Netzwerknutzlasten: Minifizierung (Code), Datenkomprimierung (Gzip, Brotli)
◦Bilder verwenden Webp
JPEG-Bildkomprimierungsstufe auf 85 eingestellt
Verwenden Sie effiziente Caching-Strategien für statische Ressourcen: zwischenspeicherbare Ressourcen
Schriftarten, Bilder, Mediendateien, Skripte oder Stylesheets
◦ Ressourcen haben 200, 203, 206 HTTP-Statuscodes
◦ Die Ressource hat keine explizite No-Cache-Richtlinie
Vermeiden Sie große DOM-Größen:
◦ Kann eine schlechte Netzwerkeffizienz und Lastleistung verursachen
◦ Wenn die Seite interaktiv ist, werden Position und Stil des Knotens neu berechnet, wodurch die Rendergeschwindigkeit verringert wird
◦ Verweise auf eine große Anzahl von Knoten können unwissentlich gespeichert werden, was zu übermäßigem Arbeitsspeicher führt
Minimieren Sie die kritische Anforderungstiefe: Je länger die Kettenlänge, desto größer der Download und desto größer die Auswirkung auf die Seitenladeleistung
Reduzieren Sie die Anzahl kritischer Ressourcen (löschen, Download zurückstellen, asynchron markieren usw.)
Schlüsselbytes optimieren, um die Downloadzeit zu verkürzen
◦ Optimieren Sie die Ladereihenfolge der verbleibenden Schlüsselressourcen, laden Sie alle Schlüsselressourcen so schnell wie möglich herunter und verkürzen Sie die Länge des Schlüsselpfads
Stellen Sie sicher, dass der Text während des Ladens von Webfonts sichtbar bleibt: Laden Sie Webfonts vorab
Halten Sie die Anzahl der Anfragen niedrig und die Übertragungsgrößen klein: CSS und JavaScript, Bilder, Schriftarten, Dateien, Medien



3. Was ist der Geschwindigkeitsindex?

SI: Speed ​​Index misst, wie schnell Inhalte beim Seitenladen visuell dargestellt werden. Lighthouse erfasst zuerst das Video des Seitenladens im Browser und berechnet die visuelle Geschwindigkeit zwischen den Frames. Laienhaft ausgedrückt ist es die sichtbare Füllgeschwindigkeit der Webseite vom Haben von etwas bis zum vollständigen Anzeigen des Inhalts.

Wert der Geschwindigkeitsindexanzeige:



Wir können die Speed-Index-Methode aus folgenden Richtungen optimieren:

Reduzierte Hauptfadenarbeit
Reduzieren Sie die JavaScript-Ausführungszeit
Stellen Sie sicher, dass der Text während des Ladens von Webfonts sichtbar bleibt



4. Was ist LCP? (Schwerpunkt)

LCP: Largest Contentful Paint Das größte (aussagekräftigste) Content-Painting bezieht sich auf den relativen Zeitpunkt, zu dem das größte im sichtbaren Bereich sichtbare Bild oder Textblock gemeldet wird, bezogen auf den Zeitpunkt, an dem die Seite zum ersten Mal geladen wird.





 

Wert des LCP-Indikators:

LCP <= 2,5 s bestanden
2,5 s < LCP <= 4 s muss optimiert werden
LCP > 4s Schlechte Qualität



1. Welche Elemente berücksichtigt das LCP?

Die folgenden relevanten Elemente werden hauptsächlich berücksichtigt:

<img>-Element
<image>-Elemente, die in <svg>-Elemente verschachtelt sind
Videoelement (Titelbild verwenden)
Elemente mit Hintergrundbildern, die über die Funktion url() geladen werden
Elemente auf Blockebene mit Text oder anderem Inline-Elementtext

2. Wie ist die LCP-Elementgröße definiert?

Die Elementgröße der größten Inhaltszeichnung (LCP) bezieht sich auf die für den Benutzer sichtbare Größe im sichtbaren Bereich, daher basiert die Betrachtung auf dem sichtbaren Bereich, wenn das Element über den sichtbaren Bereich hinausragt oder das Element beschnitten oder enthalten ist unsichtbarer Überlauf, diese Teile werden bei der Elementgröße nicht mitgezählt;

Für die Größe eines Bildelements vergleicht der Indikator die sichtbare Größe mit der Originalgröße und nimmt die kleinere Größe; zum Beispiel wird die sichtbare Größe für ein Doppelbild verwendet und die Originalgröße wird für ein gestrecktes und vergrößertes Bild verwendet Bild;

Bei Textelementen ist die Größe des Elements die Größe des Textknotens (das kleinste Rechteck, das alle Textknoten enthält);

WARNUNG: Über CSS festgelegte Ränder, Auffüllungen oder Rahmen für alle Elemente werden nicht berücksichtigt. Wenn außerdem ein bildschirmfüllendes Hintergrundbild eingestellt ist, aber Elemente mit relativ großem Anteil (auf dem Hintergrundbild schwebende Elemente) im sichtbaren Bereich des Bildschirms vorhanden sind, ergibt sich ein kleiner sichtbarer Bereich des Hintergrunds Bildbelichtung, dann wählt der größte Inhalt das größte Element des sichtbaren Bereichs in .

Außerdem gilt ein Element nur dann als das größte Inhaltselement, wenn es nach dem Rendern für den Benutzer sichtbar gemacht wird.

3. LCP Ziehzeitbericht

Aus Netzwerk- oder technischen Gründen werden Webseiten normalerweise in Segmenten geladen, sodass sich auch das größte Element ändert.

Als Reaktion auf diese Änderung verteilt der Browser unmittelbar nach dem Zeichnen des ersten Frames zur Identifizierung des maximalen Inhalts einen PerformanceEntry vom Typ „Large-Contentful-Paint“ (der einzelne Metrikdaten in der Leistungszeitliste darstellt; performance.getEntries() erhält die Zeitlistendaten). Element. Nach dem Rendern nachfolgender Frames sendet der Browser einen weiteren PerformanceEntry, wenn sich das größte Inhaltselement ändert.

Ein Element der Seite (ein Element) gilt nur dann als das größte Inhaltselement, wenn es gerendert und für den Benutzer sichtbar ist. Nicht geladene Bilder gelten nicht als gerendert und daher nicht als größtes Inhaltselement. Dasselbe gilt für Text, der Schriftarten während der Schriftartblockierung verwendet. In diesen Fällen wird das kleinere Element als größtes Element gemeldet, aber ein anderes PerformanceEntry-Objekt wird gemeldet, sobald das größere Element gerendert wurde.

Zusätzlich zu verzögert geladenen Bildern und Schriftarten können Seiten dem DOM neue Elementinhalte hinzufügen, wenn neue Inhalte (Schnittstellenanforderungen usw.) verfügbar werden. Der Browser meldet auch ein neues PerformanceEntry-Objekt, wenn ein neues Element größer als das zuvor größte Inhaltselement ist.

Wenn das derzeit größte Inhaltselement aus dem sichtbaren Bereich (oder sogar aus dem DOM) entfernt wird, bleibt dieses Element das größte Inhaltselement, bis ein größeres Element das Rendern beendet, und das performanceEntry-Objekt wird nicht geändert.

Wenn der Benutzer mit der Seite interagiert (durch Antippen, Scrollen oder Drücken von Tasten), beendet der Browser sofort die Meldung des PerformanceEntry-Objekts, da die Benutzerinteraktion normalerweise den ursprünglichen Inhalt der Seite ändert.

Aus Sicherheitsgründen können Browser keine Bildrendering-Zeitstempel für ursprungsübergreifende Objekte erhalten, denen Timing-Allow-Origin-Header fehlen, sondern nur Zeitstempel für das Laden von Bildern. Durch die korrekte Einstellung des Timing-Allow-Origin-Headers können genauere Indikatorwerte erzielt werden.

4. Wenn sich das Elementlayout und die Elementgröße ändern, was wirkt sich auf das LCP aus?

Fall 1: Das Ändern der Größe oder Position eines Elements erzeugt keinen neuen LCP-Kandidaten, es werden nur die anfängliche Größe und Position des Elements innerhalb des sichtbaren Bereichs berücksichtigt;

Fall 2: Ein Element, das ursprünglich innerhalb des sichtbaren Bereichs gerendert und dann außerhalb des sichtbaren Bereichs entfernt wurde, meldet immer noch seine ursprüngliche Größe innerhalb des sichtbaren Bereichs;

Fall 3: Während das Rendering außerhalb des sichtbaren Bereichs des Bildschirms abgeschlossen ist, werden die Elemente, die auf den Bildschirm übergehen, nicht gemeldet.

Beispiel: Maximales Element ändert sich, wenn Inhalt geladen wird





Im ersten Beispiel wird der neue Inhalt gerendert, wodurch sich das größte Element ändert.

Im zweiten Beispiel wurde der zuvor größte Inhalt aufgrund einer Layoutänderung aus dem sichtbaren Bereich entfernt.

Wenn der verzögerte Inhalt nicht so groß ist wie das anfängliche maximale Element, nimmt das LCP den anfänglichen Wert an.

5. Das größte Element ist nicht wichtig

Das wichtigste Element auf der Seite ist nicht das größte Element. Derzeit ist der Entwicklerbewertungsindex das wichtigste Element.

6. Schnelleres Rendern des Hauptinhalts, niedrigerer LCP-Wert

Die Hauptgründe für die Beeinträchtigung der Seitendarstellungsleistung sind wie folgt: Durch deren Optimierung kann der Wert des LCP-Indikators verringert werden

(1) Reaktionsgeschwindigkeit des Servers:

Das bedeutet, je länger es dauert, bis der Browser Inhalte vom Server empfängt, desto länger dauert es, bis der Benutzer die Inhalte auf dem Bildschirm darstellt. Schnellere Server wirken sich direkt auf den Lastwert verschiedener Indikatoren aus, einschließlich LCP.

Optimierbare Richtungen:

Optimieren Sie die Serverleistung
Leiten Sie Benutzer zu einem nahe gelegenen CDN weiter
Cache-Ressourcen
Priorisieren Sie die Cache-Nutzung zum Bereitstellen von HTML-Seiten
Bauen Sie frühzeitig Links zu Drittanbietern auf
Signierten Austausch verwenden

(2) JS und CSS, die das Rendern blockieren:

Der Browser muss den DOM-Baum vor dem Rendern des Inhalts parsen, wenn während des Parsing-Prozesses ein externes Stylesheet (<link rel="stylesheet">) oder ein synchrones JavaScript-Tag (<script src="main.js">) vorhanden ist gefunden, dann wird das Parsen angehalten.

Skripte und Stile sind also Rendering-blockierende Ressourcen, die FCP-Verzögerungen verursachen, die wiederum LCP-Verzögerungen verursachen. Verzögern Sie also das Laden von nicht unbedingt erforderlichem JS und CSS und verbessern Sie so die Ladegeschwindigkeit des Hauptinhalts der Webseite.

Möglichkeiten zur Reduzierung der CSS-Blockierungszeit:

CSS reduzieren: Entfernen Sie Leerzeichen, Zeilenumbrüche, Einzüge, Kommentare und andere Zeichen in CSS
Lazy Loading von unkritischem CSS: Extrahieren Sie CSS, das nicht für das anfängliche Rendern benötigt wird, in eine Datei und laden Sie es asynchron
Inline-Schlüssel-CSS: Wickeln Sie das Schlüssel-CSS des ersten Bildschirminhalts direkt in <head> ein und integrieren Sie das CSS; Critters ist ein Webpack-Plug-in, das Schlüssel-CSS einbetten und den Rest faul laden kann

Das Reduzieren der Menge an Rendering-blockierendem JavaScript kann zu einem schnelleren Rendering und niedrigeren LCP-Werten führen

Möglichkeiten zur Reduzierung der JS-Blockierungszeit:

Minimierte JavaScript-Dateien minimieren
Verzögertes Laden ungenutzter JavaScript-Dateien
Minimieren Sie ungenutzte Polyfills

(3) Langsame Ressourcenladegeschwindigkeit:

Während eine Verlängerung der CSS- oder JavaScript-Blockierungszeit direkt zu Leistungseinbußen beiträgt, kann sich die Zeit, die zum Laden vieler anderer Ressourcentypen benötigt wird, auch auf die Zeichenzeiten auswirken.

Die Elemente, die das LCP beeinflussen, sind die folgenden:

<img>-Tag
<image>-Tag mit eingebettetem <svg>
Titelbild für <video>-Element
Elemente mit Hintergrundbildern, die über die Funktion url() geladen werden
Elemente auf Blockebene, die Textknoten oder andere Textelemente auf Inline-Ebene enthalten

Optimierung:

Optimieren Sie Bilder: komprimieren Sie Bilder, verwenden Sie das Webp-Format und laden Sie Bildressourcen in CDN hoch; natürlich können Sie Code verwenden, um zu versuchen, keine Bilder zu verwenden;,
Wichtige Ressourcen vorab laden: Verwenden Sie <link rel="preload">, um die Priorität für das Herunterladen und Caching zu erhöhen;
Komprimierte Textdateien: Gzip, Brotli (veröffentlicht von Google)
Bereitstellung verschiedener Assets basierend auf der Netzwerkverbindung (adaptiver Dienst): navigator.connection. EffectiveType (effektiver Verbindungstyp 4G), navigator.connection.saveData (Datensparmodus aktivieren/deaktivieren), navigator.hardwareConcurrency (Anzahl der CPU-Kerne), Navigator .deviceMemory (Gerätespeicher)
Cache-Ressourcen: Service-Woker läuft im Worker-Kontext: Er hat also keinen DOM-Zugriff und läuft auf einem anderen Thread, also ist er nicht blockierend.

(4) Client-Rendering:

Single-Page-Anwendungen, die von Frameworks wie React, Vue und Angular erstellt wurden, verarbeiten die Logik vollständig im Client.

Optimierung:

Kritisches JavaScript minimieren: JavaScript minimieren, nicht verwendetes JavaScript laden, nicht verwendete Polyfills minimieren
Verwenden Sie serverseitiges Rendern: Der Server rendert den Hauptinhalt zuerst als HTML auf dem Server, und der Client „hydriert“ alle JavaScript- und erforderlichen Daten in denselben DOM-Inhalt
Verwenden Sie Pre-Rendering: Erstellen Sie mit einem Headless-Browser im Voraus ein Gerüst für die statischen HTML-Dateien jeder Route und versenden Sie diese Dateien dann zusammen mit dem JavaScript-Bundle, das Ihre Anwendung benötigt



5. Was ist TBT?

TBT: Gesamtblockierzeit Die Gesamtblockierzeit ist die Gesamtzeit, in der die Seite als Reaktion auf eine Benutzerinteraktion blockiert ist. TBT = Summe der blockierenden Teile aller lang andauernden Aufgaben zwischen LCP (erstes Maximum-Content-Paint) und interaktionsfähiger Zeit. ist eine wichtige Metrik zur Messung der Reaktionsfähigkeit beim Laden von Seiten.

Aufgaben, die 50 Millisekunden überschreiten, sind lange Aufgaben. Die Zeitspanne über 50 Millisekunden hinaus ist der Blockierungsabschnitt.

Beispiel: eine 90-ms-Aufgabe wird erkannt, der blockierende Teil beträgt 40 ms (90 - 50 = 40)

TBT-Indikatoren:



Optimierung:

Reduzieren Sie unnötiges Laden, Analysieren oder Ausführen von JavaScript. Das Reduzieren der JavaScript-Last, das Entfernen von nicht verwendetem Code oder das effiziente Laden von JavaScript von Drittanbietern kann die TBT-Werte verbessern.
Reduzieren Sie ineffiziente JavaScript-Anweisungen. Beispiel: document.querySelectorAll('a') gibt alle übereinstimmenden Knoten zurück



6. Was ist CLS?

CLS: Cumulative Layout Shift (CLS) ist ein wichtiges Maß für die visuelle Stabilität. ist die größte Folge von Layoutverschiebungsbruchteilen unter allen unerwarteten Layoutverschiebungen, die während der Lebensdauer der Seite auftreten.

Unerwartete Offsets von Seiteninhalten werden meistens durch asynchrones Laden von Ressourcen oder durch dynamisches Hinzufügen von DOM-Elementen über vorhandenen Inhalten auf der Seite verursacht. Der Schuldige könnte ein Bild oder Video unbekannter Größe sein, eine Schriftart, die tatsächlich größer oder kleiner als die Fallback-Schriftart gerendert wird usw.

CLS-Indikatoren:



Hinweis: Layout-Offsets werden nur gezählt, wenn die Startposition eines vorhandenen Elements geändert wird. Wenn dem DOM ein neues Element hinzugefügt wird oder wenn ein vorhandenes Element die Größe ändert, zählt dies nicht als Layoutverschiebung. Nur wenn die Änderung des Elements dazu führt, dass sich die Startposition anderer sichtbarer Elemente ändert, spricht man von Offset.

Berechnungsformel: Layout Offset Score = Impact Score x Distance Score

Einflusswert: Der Courseware-Flächensatz aller instabilen Elemente im vorherigen Rahmen und im aktuellen Rahmen (der den Teil des gesamten sichtbaren Bereichs ausmacht) ist der Einflusswert des aktuellen Rahmens.

Entfernungswert: Bezieht sich auf die maximale Entfernung (horizontal oder vertikal), um die ein instabiles Element in einem Frame verschoben wird, dividiert durch die maximale Größe des sichtbaren Bereichs (Breite oder Höhe, je nachdem, welcher Wert größer ist).

Häufige Ursachen von CLS:

Bilder ohne Größe
Größenlose Anzeigen, Einbettungen und Iframes
Dynamisch injizierter Inhalt
Webfonts, die das Blinken von unsichtbarem Text (FOIT), das Blinken von nicht formatiertem Text (FOUT) verursachen
Operationen, die auf eine Antwort vom Netzwerk warten, bevor sie das DOM aktualisieren

Optimierung:

Fügen Sie Größenattribute zu Bild- und Videoelementen hinzu
Fügen Sie keine zusätzlichen Inhalte über bestehenden Inhalten ein, ohne auf Benutzerinteraktionen zu reagieren
Bevorzugen Sie Übergangsanimationen gegenüber Eigenschaftsanimationen, die Layout-Offsets auslösen



Die oben genannten fünf Indikatoren sind die Betrachtungspunkte der aktuellen Frontend-Leistungsindikatoren sowie die Ursachen von Problemen und Optimierungsmethoden. Jeder Optimierungspunkt kann viele Wissens- und Lernpunkte erweitern, daher ist die Frontend-Optimierungsarbeitsverbindung noch sehr lang; der Optimierungseffekt eines einzelnen Punkts mag nicht offensichtlich sein, aber wenn alle fünf Punkte optimiert sind, wird er definitiv vorhanden sein ein qualitativer Sprung.

Beginnen Sie in tatsächlichen Projekten zuerst mit dem Front-End selbst und optimieren Sie dann die kollaborativen Elemente, nachdem Sie sich selbst optimiert haben.

Darüber hinaus ist die Front-End-Optimierung eine nachhaltige und langfristige Sache. Die Iteration von Werkzeugtechnologie-Upgrades wird auch die Projektleistung verbessern. Die Arbeit an der Optimierung muss fortgesetzt werden, anstatt es nur einmal zu tun.

Der Weg der Frontend-Performance-Optimierung ist lang und schwierig, aber er nähert sich, und es wird Fortschritte in der Spezialforschung geben, und das Ziel wird am Ende definitiv erfolgreich erreicht.

Artikelreferenz: https://web.dev/ https://developer.chrome.com/

 

{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/u/4090830/blog/8591368
Empfohlen
Rangfolge