Wie wir unsere Core Web Vitals verbessert haben (Fallstudie)

Veröffentlicht: 2022-03-10
Kurze Zusammenfassung ↬ Das „Page Experience Update“ von Google wird im Juni eingeführt. Zunächst haben Websites, die die Core Web Vitals-Schwellenwerte erfüllen, einen geringfügigen Ranking-Vorteil bei der mobilen Suche für alle Browser. Die Suche ist für jedes Unternehmen wichtig, und dies ist die Geschichte, wie Beau Hartshorne und sein Team bei Instant Domain Search ihre Core Web Vitals-Ergebnisse verbesserten. Plus ein Open-Source-Tool, das sie nebenbei entwickelt haben.

Letztes Jahr hat Google damit begonnen, die Bedeutung von Core Web Vitals zu betonen und wie sie die reale Erfahrung einer Person beim Besuch von Websites im Internet widerspiegeln. Leistung ist ein Kernmerkmal unseres Unternehmens, Instant Domain Search – es steckt im Namen. Stellen Sie sich unsere Überraschung vor, als wir feststellten, dass unsere Vitalwerte für viele Menschen nicht gut waren. Unsere schnellen Computer und das Glasfaser-Internet verschleierten die Erfahrung, die echte Menschen auf unserer Seite haben. Es dauerte nicht lange, bis ein Meer aus roten „schlecht“ und gelben „Verbesserungsbedarf“-Meldungen in unserer Google Search Console unsere Aufmerksamkeit erforderte. Die Entropie hatte gewonnen, und wir mussten herausfinden, wie wir den Datenmüll beseitigen und unsere Website schneller machen konnten.

Ein Screenshot aus der Google Search Console, der zeigt, dass wir unsere Core Web Vitals-Metriken verbessern müssen
Dies ist ein Screenshot aus unserem mobilen Core Web Vitals-Bericht in der Google Search Console. Wir haben noch viel zu tun! (Große Vorschau)

Ich gründete Instant Domain Search im Jahr 2005 und behielt es als Nebenbeschäftigung, während ich bei einem Y-Combinator-Unternehmen (Snipshot, W06) arbeitete, bevor ich als Software-Ingenieur bei Facebook arbeitete. Wir sind vor kurzem zu einer kleinen Gruppe angewachsen, die hauptsächlich in Victoria, Kanada, ansässig ist, und wir arbeiten an einem langen Rückstand an neuen Funktionen und Leistungsverbesserungen. Aufgrund unserer schlechten Web-Vitals-Ergebnisse und des bevorstehenden Google-Updates konzentrierten wir uns darauf, diese Probleme zu finden und zu beheben.

Als die erste Version der Site gestartet wurde, hatte ich sie mit PHP, MySQL und XMLHttpRequest erstellt. Internet Explorer 6 wurde vollständig unterstützt, Firefox gewann Marktanteile und Chrome war noch Jahre vom Start entfernt. Im Laufe der Zeit haben wir uns durch eine Vielzahl von Generatoren für statische Websites, JavaScript-Frameworks und Servertechnologien weiterentwickelt. Unser aktueller Frontend-Stack ist React, das mit Next.js und einem in Rust integrierten Backend-Dienst bereitgestellt wird, um unsere Domainnamensuchen zu beantworten. Wir versuchen, Best Practices zu folgen, indem wir so viel wie möglich über ein CDN bereitstellen, so viele Skripte von Drittanbietern wie möglich vermeiden und einfache SVG-Grafiken anstelle von Bitmap-PNGs verwenden. Es war nicht genug.

Mit Next.js können wir unsere Seiten und Komponenten in React und TypeScript erstellen. In Kombination mit VS Code ist die Entwicklungserfahrung erstaunlich. Next.js funktioniert im Allgemeinen, indem es React-Komponenten in statisches HTML und CSS umwandelt. Auf diese Weise kann der anfängliche Inhalt von einem CDN bereitgestellt werden, und Next kann die Seite dann „hydrieren“, um Elemente dynamisch zu machen. Sobald die Seite hydratisiert ist, verwandelt sich unsere Website in eine Single-Page-App, in der Benutzer nach Domainnamen suchen und diese generieren können. Wir verlassen uns nicht auf Next.js, um viel serverseitige Arbeit zu erledigen, der Großteil unserer Inhalte wird statisch als HTML, CSS und JavaScript exportiert, um von einem CDN bereitgestellt zu werden.

Mehr nach dem Sprung! Lesen Sie unten weiter ↓

Wenn jemand mit der Suche nach einem Domainnamen beginnt, ersetzen wir den Seiteninhalt durch Suchergebnisse. Um die Suche so schnell wie möglich zu machen, fragt das Frontend direkt unser Rust-Backend ab, das stark für Domain-Lookups und -Vorschläge optimiert ist. Viele Abfragen können wir sofort beantworten, aber für einige TLDs müssen wir langsamere DNS-Abfragen durchführen, deren Auflösung ein oder zwei Sekunden dauern kann. Wenn einige dieser langsameren Abfragen aufgelöst werden, aktualisieren wir die Benutzeroberfläche mit den neu eingehenden Informationen. Die Ergebnisseiten sind für jeden anders, und es kann für uns schwierig sein, genau vorherzusagen, wie jede Person die Website erlebt.

Die Chrome DevTools sind ausgezeichnet und ein guter Anfang, wenn es um die Suche nach Leistungsproblemen geht. Die Leistungsansicht zeigt genau, wann HTTP-Anfragen ausgehen, wo der Browser Zeit mit der Auswertung von JavaScript verbringt und mehr:

Screenshot des Leistungsbereichs in Chrome DevTools
Screenshot des Leistungsbereichs in Chrome DevTools. Wir haben Web Vitals aktiviert, wodurch wir sehen können, welches Element das LCP verursacht hat. (Große Vorschau)

Es gibt drei Core Web Vitals-Metriken, die Google verwenden wird, um Websites in ihrem bevorstehenden Update des Suchalgorithmus zu bewerten. Google unterteilt Erfahrungen in „Gut“, „Verbesserungsbedarf“ und „Schlecht“, basierend auf den LCP-, FID- und CLS-Bewertungen, die echte Personen auf der Website haben:

  • LCP , oder Largest Contentful Paint, definiert die Zeit, die es dauert, bis das größte Inhaltselement sichtbar wird.
  • FID oder First Input Delay bezieht sich auf die Reaktionsfähigkeit einer Website auf Interaktionen – die Zeit zwischen einem Antippen, Klicken oder Tastendruck auf der Benutzeroberfläche und der Antwort von der Seite.
  • CLS oder Cumulative Layout Shift verfolgt, wie sich Elemente auf der Seite verschieben oder verschieben, ohne dass Aktionen wie ein Tastatur- oder Klickereignis ausgeführt werden.
Grafiken, die die Bereiche akzeptabler LCP-, FID- und CLS-Scores zeigen
Eine Zusammenfassung von LCP, FID und CLS. (Bildnachweis: Web Vitals von Philip Walton) (Große Vorschau)

Chrome ist so eingerichtet, dass diese Messwerte für alle angemeldeten Chrome-Benutzer verfolgt werden, und sendet anonyme Statistiken, die die Erfahrungen eines Kunden auf einer Website zusammenfassen, zur Auswertung an Google zurück. Diese Ergebnisse sind über den Chrome User Experience Report zugänglich und werden angezeigt, wenn Sie eine URL mit dem PageSpeed ​​Insights-Tool untersuchen. Die Werte stellen das 75. Perzentil der Nutzer dar, die diese URL in den letzten 28 Tagen besucht haben. Dies ist die Zahl, die sie verwenden werden, um Websites in der Aktualisierung einzustufen.

Eine Metrik des 75. Perzentils (p75) bietet ein angemessenes Gleichgewicht für Leistungsziele. Einen Durchschnitt zu nehmen würde zum Beispiel viele schlechte Erfahrungen verbergen, die Menschen gemacht haben. Der Median oder das 50. Perzentil (p50) würde bedeuten, dass die Hälfte der Personen, die unser Produkt verwenden, eine schlechtere Erfahrung gemacht haben. Das 95. Perzentil (p95) hingegen ist schwer zu errechnen, da es auf alten Geräten mit fleckigen Verbindungen zu viele extreme Ausreißer erfasst. Wir glauben, dass die Bewertung auf der Grundlage des 75. Perzentils ein fairer Standard ist, den es zu erfüllen gilt.

Diagramm, das eine Verteilung von p50- und p75-Werten darstellt
Der Median, auch bekannt als 50. Perzentil oder p50, ist grün dargestellt. Das 75. Perzentil oder p75 ist hier gelb dargestellt. In dieser Abbildung zeigen wir 20 Sitzungen. Die 15. schlechteste Sitzung ist das 75. Perzentil und was Google verwendet, um die Erfahrung dieser Website zu bewerten. (Große Vorschau)

Um unsere Ergebnisse in den Griff zu bekommen, haben wir uns zunächst an Lighthouse gewandt, um einige hervorragende Tools zu erhalten, die in Chrome integriert sind und unter web.dev/measure/ sowie bei PageSpeed ​​Insights gehostet werden. Diese Tools haben uns geholfen, einige allgemeine technische Probleme mit unserer Website zu finden. Wir haben gesehen, dass die Art und Weise, wie Next.js unser CSS bündelte, unsere anfängliche Renderingzeit verlangsamte, was sich auf unsere FID auswirkte. Der erste leichte Sieg kam von einer experimentellen Next.js-Funktion, optimizeCss, die dazu beitrug, unseren allgemeinen Leistungswert erheblich zu verbessern.

Lighthouse hat auch eine Cache-Fehlkonfiguration entdeckt, die verhinderte, dass einige unserer statischen Assets von unserem CDN bereitgestellt wurden. Wir werden auf der Google Cloud Platform gehostet und das Google Cloud CDN erfordert, dass der Cache-Control-Header „public“ enthält. Next.js erlaubt Ihnen nicht, alle ausgegebenen Header zu konfigurieren, also mussten wir sie überschreiben, indem wir den Next.js-Server hinter Caddy platzierten, einem leichtgewichtigen HTTP-Proxy-Server, der in Go implementiert ist. Wir nutzten auch die Gelegenheit, um sicherzustellen, dass wir mit der relativ neuen Unterstützung für „Stale-while-Revalidate“ in modernen Browsern, die es dem CDN ermöglicht, Inhalte vom Ursprung (unserem Next.js-Server) asynchron im Hintergrund abzurufen, so gut wie möglich dienen.

Es ist einfach – vielleicht zu einfach –, fast alles, was Sie brauchen, von npm zu Ihrem Produkt hinzuzufügen. Es dauert nicht lange, bis die Bündelgrößen wachsen. Das Herunterladen großer Bundles in langsamen Netzwerken dauert länger, und das 75. Perzentil-Mobiltelefon verbringt viel Zeit damit, den Haupt-UI-Thread zu blockieren, während es versucht, den gesamten Code, den es gerade heruntergeladen hat, zu verstehen. Uns gefiel BundlePhobia, ein kostenloses Tool, das anzeigt, wie viele Abhängigkeiten und Bytes ein npm-Paket zu Ihrem Bundle hinzufügt. Dies führte dazu, dass wir eine Reihe von React-Spring-basierten Animationen eliminierten oder durch einfachere CSS-Übergänge ersetzten:

Screenshot des BundlePhobia-Tools, das zeigt, dass React-Spring 162,8 KB JavaScript hinzufügt
Wir haben BundlePhobia verwendet, um große Abhängigkeiten aufzuspüren, auf die wir verzichten könnten. (Große Vorschau)

Durch die Verwendung von BundlePhobia und Lighthouse haben wir festgestellt, dass Fehlerprotokollierungs- und Analysesoftware von Drittanbietern erheblich zu unserer Bundle-Größe und Ladezeit beigetragen hat. Wir haben diese Tools entfernt und durch unsere eigene clientseitige Protokollierung ersetzt, die moderne Browser-APIs wie sendBeacon und ping nutzt. Wir senden Protokolle und Analysen an unsere eigene Google BigQuery-Infrastruktur, wo wir die Fragen, die uns wichtig sind, detaillierter beantworten können, als dies jedes Standard-Tool leisten könnte. Dies eliminiert auch eine Reihe von Cookies von Drittanbietern und gibt uns weitaus mehr Kontrolle darüber, wie und wann wir Protokolldaten von Kunden senden.

Unser CLS-Score hatte noch das größte Verbesserungspotenzial. Die Art und Weise, wie Google CLS berechnet, ist kompliziert – Sie erhalten ein maximales „Sitzungsfenster“ mit einer Lücke von 1 Sekunde, begrenzt auf 5 Sekunden ab dem ersten Laden der Seite oder einer Tastatur- oder Klick-Interaktion, um das Verschieben von Dingen auf der Website abzuschließen . Wenn Sie daran interessiert sind, sich eingehender mit diesem Thema zu befassen, finden Sie hier einen großartigen Leitfaden zu diesem Thema. Dies benachteiligt viele Arten von Overlays und Popups, die erscheinen, direkt nachdem Sie auf einer Website gelandet sind. Zum Beispiel Anzeigen, die Inhalte verschieben, oder Upsells, die erscheinen können, wenn Sie anfangen, an Anzeigen vorbei zu scrollen, um Inhalte zu erreichen. Dieser Artikel bietet eine hervorragende Erklärung, wie der CLS-Score berechnet wird, und die Gründe dafür.

Wir sind grundsätzlich gegen diese Art von digitalem Durcheinander, daher waren wir überrascht zu sehen, wie viel Raum für Verbesserungen Google darauf bestanden hat, dass wir es schaffen. Chrome verfügt über ein integriertes Web Vitals-Overlay, auf das Sie zugreifen können, indem Sie das Befehlsmenü verwenden, um „Core Web Vitals-Overlay anzeigen“. Um genau zu sehen, welche Elemente Chrome bei seiner CLS-Berechnung berücksichtigt, fanden wir die Option „Console Logging“ der Chrome Web Vitals-Erweiterung in den Einstellungen hilfreicher. Nach der Aktivierung zeigt dieses Plugin Ihre LCP-, FID- und CLS-Ergebnisse für die aktuelle Seite an. Von der Konsole aus können Sie genau sehen, welche Elemente auf der Seite mit diesen Partituren verbunden sind. Unsere CLS-Ergebnisse hatten den größten Raum für Verbesserungen.

Screenshot der Heads-up-Display-Ansicht des Chrome Web Vitals-Plug-ins
Die Chrome Web Vitals-Erweiterung zeigt, wie Chrome die aktuelle Seite auf ihren Web Vitals-Metriken bewertet. Einige dieser Funktionen werden in Chrome 90 integriert. (Große Vorschau)

Von den drei Metriken ist CLS die einzige, die sich ansammelt, wenn Sie mit einer Seite interagieren. Die Web Vitals-Erweiterung verfügt über eine Protokollierungsoption, die genau zeigt, welche Elemente CLS verursachen, während Sie mit einem Produkt interagieren. Sehen Sie, wie sich die CLS-Metriken addieren, wenn wir auf der Homepage des Smashing Magazine scrollen:

Wenn die Protokollierung in der Chrome Web Vitals-Erweiterung aktiviert ist, werden Layoutänderungen in der Konsole protokolliert, während Sie mit einer Website interagieren.

Google wird die Berechnung von CLS im Laufe der Zeit weiter anpassen, daher ist es wichtig, auf dem Laufenden zu bleiben, indem Sie dem Webentwicklungs-Blog von Google folgen. Bei der Verwendung von Tools wie der Chrome Web Vitals-Erweiterung ist es wichtig, die CPU- und Netzwerkdrosselung zu aktivieren, um ein realistischeres Erlebnis zu erzielen. Sie können dies mit den Entwicklertools tun, indem Sie eine mobile CPU simulieren.

Ein Screenshot, der zeigt, wie die CPU-Drosselung in Chrome DevTools aktiviert wird
Es ist wichtig, eine langsamere CPU und Netzwerkverbindung zu simulieren, wenn Sie auf Ihrer Website nach Web Vitals-Problemen suchen. (Große Vorschau)

Der beste Weg, den Fortschritt von einer Bereitstellung zur nächsten zu verfolgen, besteht darin, die Seitenerfahrungen auf die gleiche Weise wie Google zu messen. Wenn Sie Google Analytics eingerichtet haben, besteht eine einfache Möglichkeit darin, das Web-Vitals-Modul von Google zu installieren und es mit Google Analytics zu verbinden. Dies bietet eine grobe Messung Ihres Fortschritts und macht ihn in einem Google Analytics-Dashboard sichtbar.

Ein Diagramm, das die Durchschnittswerte für unsere CLS-Werte im Laufe der Zeit zeigt
Google Analytics kann einen Durchschnittswert Ihrer Web Vitals Scores anzeigen. (Große Vorschau)

Hier stoßen wir an eine Wand. Wir konnten unseren CLS-Score sehen, und obwohl wir ihn erheblich verbessert hatten, hatten wir noch Arbeit vor uns. Unser CLS-Score lag bei ungefähr 0,23 und wir mussten ihn unter 0,1 bringen – und am besten auf 0. Zu diesem Zeitpunkt konnten wir jedoch nichts finden, das uns genau sagte, welche Komponenten auf welchen Seiten den Score noch beeinflussten. Wir konnten sehen, dass Chrome in seinen Core Web Vitals-Tools viele Details offengelegt hat, aber dass die Protokollierungsaggregatoren den wichtigsten Teil weggeworfen haben: genau welches Seitenelement das Problem verursacht hat.

Ein Screenshot der Chrome DevTools-Konsole, der zeigt, welche Elemente CLS verursachen.
Dies zeigt genau, welche Elemente zu Ihrem CLS-Score beitragen. (Große Vorschau)

Um alle benötigten Details zu erfassen, haben wir eine serverlose Funktion entwickelt, um Web Vitals-Daten von Browsern zu erfassen. Da wir die Daten nicht in Echtzeit abfragen müssen, streamen wir sie zur Speicherung in die Streaming-API von Google BigQuery. Diese Architektur bedeutet, dass wir kostengünstig so viele Datenpunkte erfassen können, wie wir generieren können.

Nachdem wir bei der Arbeit mit Web Vitals und BigQuery einige Lektionen gelernt hatten, entschieden wir uns, diese Funktionalität zu bündeln und diese Tools als Open Source unter vitals.dev zu veröffentlichen.

Die Verwendung von Instant Vitals ist eine schnelle Möglichkeit, mit der Verfolgung Ihrer Web Vitals-Ergebnisse in BigQuery zu beginnen. Hier ist ein Beispiel für ein BigQuery-Tabellenschema, das wir erstellen:

Ein Screenshot unserer BigQuery-Schemas zum Erfassen von FCP
Eines unserer BigQuery-Schemas. (Große Vorschau)

Die Integration mit Instant Vitals ist einfach. Sie können mit der Integration in die Clientbibliothek beginnen, um Daten an Ihr Backend oder Ihre serverlose Funktion zu senden:

 import { init } from "@instantdomain/vitals-client"; init({ endpoint: "/api/web-vitals" });

Dann können Sie auf Ihrem Server die Serverbibliothek integrieren, um die Schaltung zu vervollständigen:

 import fs from "fs"; import { init, streamVitals } from "@instantdomain/vitals-server"; // Google libraries require service key as path to file const GOOGLE_SERVICE_KEY = process.env.GOOGLE_SERVICE_KEY; process.env.GOOGLE_APPLICATION_CREDENTIALS = "/tmp/goog_creds"; fs.writeFileSync( process.env.GOOGLE_APPLICATION_CREDENTIALS, GOOGLE_SERVICE_KEY ); const DATASET_; init({ datasetId: DATASET_ID }).then().catch(console.error); // Request handler export default async (req, res) => { const body = JSON.parse(req.body); await streamVitals(body, body.name); res.status(200).end(); };

Rufen Sie einfach streamVitals mit dem Text der Anfrage und dem Namen der Metrik auf, um die Metrik an BigQuery zu senden. Die Bibliothek übernimmt die Erstellung des Datensatzes und der Tabellen für Sie.

Nachdem wir die Daten eines Tages gesammelt hatten, führten wir diese Abfrage wie folgt aus:

 SELECT `<project_name>.web_vitals.CLS`.Value, Node FROM `<project_name>.web_vitals.CLS` JOIN UNNEST(Entries) AS Entry JOIN UNNEST(Entry.Sources) WHERE Node != "" ORDER BY value LIMIT 10

Diese Abfrage erzeugt Ergebnisse wie diese:

Wert Knoten
4.6045324800736724E-4 /html/body/div[1]/main/div/div/div[2]/div/div/blockquote
7.183070668914928E-4 /html/body/div[1]/header/div/div/header/div
0.031002668277977697 /html/body/div[1]/footer
0.035830703317463526 /html/body/div[1]/main/div/div/div[2]
0.035830703317463526 /html/body/div[1]/footer
0.035830703317463526 /html/body/div[1]/main/div/div/div[2]
0.035830703317463526 /html/body/div[1]/main/div/div/div[2]
0.035830703317463526 /html/body/div[1]/footer
0.035830703317463526 /html/body/div[1]/footer
0.03988482067913317 /html/body/div[1]/footer

Dies zeigt uns, welche Elemente auf welchen Seiten den größten Einfluss auf CLS haben. Es erstellte eine Mängelliste, die unser Team untersuchen und beheben sollte. Bei der Instant Domain Search stellt sich heraus, dass langsame oder schlechte mobile Verbindungen mehr als 500 ms benötigen, um einige unserer Suchergebnisse zu laden. Einer der schlechtesten Beiträge zu CLS für diese Benutzer war tatsächlich unsere Fußzeile.

Der Layout-Shift-Score wird als Funktion der Größe des sich bewegenden Elements und davon, wie weit es geht, berechnet. Wenn ein Gerät in unserer Suchergebnisansicht mehr als eine bestimmte Zeit benötigt, um Suchergebnisse zu empfangen und darzustellen, wird die Ergebnisansicht auf eine zero-height , wodurch die Fußzeile sichtbar wird. Wenn die Ergebnisse eintreffen, wird die Fußzeile wieder an das Ende der Seite verschoben. Ein großes DOM-Element, das sich so weit bewegte, trug viel zu unserer CLS-Punktzahl bei. Um dies richtig durchzuarbeiten, müssen wir die Art und Weise neu strukturieren, wie die Suchergebnisse gesammelt und gerendert werden. Wir haben uns entschieden, die Fußzeile in der Suchergebnisansicht als schnellen Hack zu entfernen, der verhindert, dass sie bei langsamen Verbindungen herumhüpft.

Wir überprüfen diesen Bericht jetzt regelmäßig, um zu verfolgen, wie wir uns verbessern – und nutzen ihn, um im weiteren Verlauf rückläufige Ergebnisse zu bekämpfen. Wir haben den Wert der zusätzlichen Aufmerksamkeit für neu eingeführte Funktionen und Produkte auf unserer Website erlebt und konsequente Überprüfungen durchgeführt, um sicherzustellen, dass die wichtigsten Vitalwerte zu Gunsten unseres Rankings wirken. Wir hoffen, dass wir durch das Teilen von Instant Vitals anderen Entwicklern helfen können, ihre Core Web Vitals-Ergebnisse ebenfalls zu bewältigen.

Google bietet hervorragende Leistungstools, die in Chrome integriert sind, und wir haben sie verwendet, um eine Reihe von Leistungsproblemen zu finden und zu beheben. Wir erfuhren, dass die von Google bereitgestellten Felddaten eine gute Zusammenfassung unseres p75-Fortschritts boten, aber keine verwertbaren Details enthielten. Wir mussten genau herausfinden, welche DOM-Elemente Layoutverschiebungen und Eingabeverzögerungen verursachten. Als wir begannen, unsere eigenen Felddaten mit XPath-Abfragen zu sammeln, konnten wir spezifische Möglichkeiten identifizieren, um die Erfahrung aller auf unserer Website zu verbessern. Mit einigem Aufwand haben wir unsere realen Core Web Vitals-Feldergebnisse in Vorbereitung auf das Page Experience Update im Juni in einen akzeptablen Bereich gebracht. Wir freuen uns, dass diese Zahlen nach unten und nach rechts gehen!

Ein Screenshot von Google PageSpeed ​​Insights, der zeigt, dass wir die Core Web Vitals-Bewertung bestanden haben
Google PageSpeed ​​Insights zeigt, dass wir jetzt die Core Web Vitals-Bewertung bestehen. (Große Vorschau)