Die Verbesserung der Core Web Vitals auf der Mail.ru-Startseite führte zu einem durchschnittlichen Anstieg der Conversion-Raten um 10 %.

Nach mehreren Monaten Arbeit zur Verbesserung der Core Web Vitals auf der Startseite von Mail.ru stieg der 75. Perzentilwert für den kumulativen Layout-Verschiebeeffekt (Cumulative Layout Shift, CLS) um 60 %. Die durchschnittliche Sitzungsdauer wurde um 2,7% und die Conversion-Raten der Hauptabschnitte um mehr als 10 % gesteigert.

Denis Stasyev
Denis Stasyev
Sven May
Sven May

Der Anfang

Mail.ru ist einer der führenden E-Mail-Dienste im russischsprachigen Internet und gehört zu den fünf meistbesuchten Websites in Russland. Mail.ru ist eine wichtige Ressource für viele Menschen. Es verzeichnet mehrere hundert Millionen Zugriffe pro Monat und ist ein Portal, über das Nutzer unter anderem auf E-Mails, Nachrichten, soziale Medien und leistungsstarke Internetsuchen zugreifen können.

Mail.ru wollte seinen Besuchern eine hohe Nutzerfreundlichkeit bieten. Daher begannen die Arbeiten zur Verbesserung der Core Web Vitals. Bevor wir unsere Optimierungsstrategie besprechen, sollten wir uns einige technische Details zur Startseite von Mail.ru ansehen.

Das Projekt wurde zwar schon lange mit unserer internen Fest-Template-Engine entwickelt, aber 2019 begannen wir mit der Migration zu Svelte 3.

Bei Svelte wird die Reaktivität so implementiert, dass kein virtuelles DOM verwendet wird. Das macht es weniger ressourcenintensiv. Beim Ansatz von Svelte werden nicht verwendete Funktionen aus Produktions-Bundles entfernt, da der Code, der sie implementiert, vom Compiler nicht generiert wird, wenn die Funktionen nicht verwendet werden. Nicht verwendeter Code wird während der Kompilierung entfernt, was zu kleineren Bundles führt. Dies kann dazu beitragen, die Gesamtblockierungszeit (Total Blocking Time, TBT) beim Seitenstart zu reduzieren.

Leistungsmesswerte erfassen

Bevor Sie Core Web Vitals optimieren, ist es hilfreich, die Leistung vor Ort zu bewerten. Vor Core Web Vitals haben wir in unserem internen Leistungsdashboard andere Messwerte wie First Contentful Paint (FCP) erfasst.

Unser Script zur Erfassung von Messwerten wurde so geändert, dass die Core Web Vitals erfasst und zur Visualisierung an unser Leistungsdashboard gesendet werden. Gemäß den Empfehlungen von Google verwendet unser Script die PerformanceObserver API, um Messwerte zu erhalten. Diese API ist Teil der universellen Frontend-Plattform von Mail.ru.

Im Dashboard wurden die folgenden Messwerte für Nutzer angezeigt (Mittelwerte für die Woche vom 15. bis 21. März 2021):

Name der Messwertgruppe Core Web Vitals Weitere Web Vitals
Messwertname LCP FID CLS FCP TBT TTI
Anteil der Nutzer gemäß den Core Web Vitals-Grenzwerten good 52 % 92 % 33 % 35 % 42 % 43 %
needs-improvement 19 % 5 % 23 % 38 % 16 % 25 %
Schwach 29 % 3 % 44 % 27 % 42 % 32 %
Messwerte für die Woche vom 15. bis 21. März 2021
Vor der Optimierung wurden bei den Core Web Vitals etwa ein Drittel der Nutzer in die Kategorie „Schlecht“ eingestuft.
Web Vitals-Werte vor den Verbesserungen

Core Web Vitals verbessern

Es gibt zwar viele Anleitungen zur Verbesserung der Core Web Vitals, aber jedes Projekt stellt seine eigenen Herausforderungen. Für die Startseite von Mail.ru wurden die folgenden Verbesserungsmöglichkeiten identifiziert:

Skelette zur Verbesserung der CLS

Der CLS war einer der Feldmesswerte mit der schlechtesten Leistung für die Startseite von Mail.ru. Bei der anschließenden Profilierung dieser Seite im Bereich Leistung der Chrome-Entwicklertools wurde festgestellt, dass das Problem auf Anzeigen zurückzuführen war. Um die Layoutstabilität zu verbessern, hat unser Team beschlossen, Platzhalter zu verwenden, um Platz für Anzeigen zu reservieren, bevor sie geladen werden.

Wenn Sie Platzhalter implementieren, müssen Sie zuerst die Abmessungen der Inhalte ermitteln, die sie ersetzen sollen. Glücklicherweise sind die Anzeigengrößen auf der Desktopversion der Startseite von Mail.ru genau dokumentiert. Nach einem Gespräch mit dem Designteam wurden SVG-animierte UI-Skelette als Platzhalter verwendet, da sie die wahrgenommene Ladezeit der Inhalte reduzieren.

Die Rückkehr von SSR

Um die Umstellung von Fest auf Svelte zu erleichtern, haben wir das vorhandene Projekt schrittweise neu geschrieben, anstatt von vorn anzufangen. Bis März 2021 hatten wir den Großteil des Frontends zu Svelte migriert und schließlich SSR in unsere Produktionsanwendung eingeführt, nachdem wir Backend-Leistungsprobleme behoben hatten.

Nach der Implementierung von SSR fand das Team die Ursache für die CLS-Rückschritte, die anfangs unbemerkt geblieben waren: Der Nachrichtenbereich wurde nicht zum Zeitpunkt des Renderns der ersten Inhalte auf der Seite eingefügt. Zwischen dem ersten Zeichnen des vom Server bereitgestellten Seiten-Markups und dem Einfügen des Nachrichtenbereichs auf dem Client gab es eine Verzögerung. Dieses Verhalten führte zu einer Verschiebung des Anzeigen-Skeletts, was den CLS verschlechterte.

In den DevTools von Chrome wurden zwar Layout-Shift-Ereignisse angezeigt, wir konnten den Grund dafür aber zunächst nicht finden. Obwohl SSR nicht das Problem war, half es später, die Lösung zu finden. Durch die Behebung des Codes, der für die Verzögerung beim Zeichnen verantwortlich war, wurde die Layoutstabilität der Nachrichtenkomponente verbessert.

Bei aktivem JavaScript wird im Nachrichtenbereich nur eine leere Seite angezeigt, sodass die Layoutsprünge ausgeblendet werden.
Problem beim Zeichnen von Nachrichten bei deaktiviertem JavaScript finden
Durch das Deaktivieren von JavaScript wurden Layoutverschiebungen sichtbar, die für das menschliche Auge zuvor nicht sichtbar waren.
Problem beim Zeichnen von Nachrichten bei deaktiviertem JavaScript behoben.

Ein weiterer Effekt, den SSR auf den CLS haben kann, ist die Bewegung von Komponenten vor und nach der Hydratation, was zu weiteren Layoutverschiebungen führen kann. Dieses Problem trat vor allem in der mobilen Version auf und erforderte besondere Aufmerksamkeit beim Markup der gepufferten Komponenten. Eine gute Lösung für dieses Problem bestand darin, nach Möglichkeit so viel Darstellungslogik wie möglich von JavaScript in CSS zu übertragen.

Codesplitting und nicht verwendete Polyfills

Um die wahrgenommene Ladegeschwindigkeit der Seite zu verbessern, mussten die LCP- und FID-Werte gesenkt werden. Eine Möglichkeit dazu ist das Code-Splitting. Neben der Mail.ru-Startseite entwickelt unser Team ein Widget für die Portalnavigation. Sie ist derzeit in vielen Projekten unseres Unternehmens eingebettet.

Aus historischen Gründen wird das Widget als synchrones Lades-Script ganz am Anfang der Seite eingefügt. Der Anteil der Polyfills in diesem Script stieg im Laufe der Zeit an. Um die negativen Leistungsauswirkungen des Ladens dieser Polyfills zu begrenzen, haben wir Code Splitting sowohl für moderne als auch für ältere Browser implementiert.

Wir haben uns gegen das module/nomodule-Muster zum Laden von JavaScript-Bundles für moderne oder ältere Browser entschieden, da das type="module"-Attribut des <script>-Elements nicht auf Browser ausgerichtet war, die für unsere Anforderungen modern genug waren. Um dies zu beheben, verwendet Mail.ru ein internes Tool, um moderne Browserversionen im Backend zu identifizieren und sich entsprechend an diese Browser anzupassen.

Sobald Browser im Backend erkannt werden konnten, haben wir Code Splitting für moderne und ältere Browser implementiert. Das Ergebnis war eine Reduzierung der Größe des synchron geladenen JavaScript-Widgets für moderne Browser um 43,3 %. Diese Vorgehensweise wurde auch auf einige andere Portalscripts angewendet.

Neben der Verringerung der Bundle-Größe und positiven Auswirkungen auf die Core Web Vitals verbessert das Code-Splitting auch die Entwicklerfreundlichkeit. Nur 3,5% unserer Nutzer verwenden alte Browser und dieser Anteil ist rückläufig.Durch die Implementierung von Code Splitting konnten unsere Entwickler die neuesten Browser-APIs verwenden, ohne dass für alle Nutzer die für alte Browser erforderlichen Polyfills erforderlich waren.

Ergebnisse

Nach der Optimierung haben wir in unseren Felddaten die Mittelwerte für die Woche vom 24. bis 30. Mai 2021 beobachtet:

Name der Messwertgruppe Core Web Vitals Weitere Web Vitals
Messwertname LCP FID CLS FCP TBT TTI
Anteil der Nutzer gemäß den Core Web Vitals-Grenzwerten good 58% (+6%) 93% (+1%) 93% (+60%) 43% (+8%) 49% (+7%) 51% (+8%)
needs-improvement 18 % 4 % 3 % 34 % 17 % 24 %
Schwach 24 % 3 % 4 % 23 % 34 % 25 %
Messwerte für die Woche vom 24. bis 30. März 2021
Alle Messwerte im Bucket „Gut“ haben sich um mindestens 1 % verbessert. CLS sogar um 60%.
Vergleich der Web Vitals vor und nach der Optimierung (Änderung in der Gruppe „Gut“ in Klammern).

In den folgenden Grafiken sind die Änderungen der Werte der Leistungsmesswerte für Webseiten nach „Plattform“ dargestellt. Beachten Sie die beiden wichtigen Daten in den Diagrammen:

  • 23. März 2021: Veröffentlichung der Iteration, bei der die Abschnitte der letzten Seite zu Svelte migriert wurden;
  • 19. April 2021: Iteration mit zurückgegebenem SSR und geändertem Layout zur Korrektur von CLS-Rückgängen veröffentlicht.

Der Rückgang der Werte vom 1. bis zum 10. Mai ist auf die Maifeiertage in Russland zurückzuführen.

LCP von März bis 1. Juni 2021 mit kleinen Verbesserungen im Zeitverlauf
LCP-Diagramm unter „Plattform“: 16. März bis 1. Juni 2021
FID vom 16. März bis 1. Juni 2021 mit kleinen Verbesserungen auf hohem Niveau.
FID-Diagramm unter „Plattform“: 16. März bis 1. Juni 2021
CLS vom 16. März bis zum 1. Juni 2021 mit deutlichen Verbesserungen ab dem 23. April.
CLS-Diagramm unter „Plattform“: 16. März bis 1. Juni 2021

Die Ergebnisse, die mit „Plattform“ erzielt wurden, stimmen mit dem Anstieg der Messwerte im Chrome UX-Bericht (CrUX) überein.

LCP-Messwert aus CrUX mit einem Anstieg von 51% auf 58% im Bereich „Gut“.
Änderung des LCP-Messwerts in CrUX im Jahr 2021
Der FID-Messwert aus CrUX zeigt eine leichte Verbesserung des FID von 91% auf 93% im Bereich „Gut“.
Änderung des FID-Messwerts in CrUX im Jahr 2021
Der CLS-Messwert in CrUX zeigt große Verbesserungen von 46% auf 98% im Bereich „Gut“.
Änderung des CLS-Messwerts in CrUX im Jahr 2021

Ein Vergleich der Werte für die durchschnittliche Sitzungsdauer von Nutzern eine Woche vor der Einführung der ersten Verbesserungen und eine Woche nach der Einführung zeigt ein Wachstum von 2,7 %. Außerdem ist in den meisten Bereichen der Seite eine deutliche Steigerung der Conversions zu verzeichnen. Insbesondere stieg die Anzahl der Conversions für die Mail.ru-E-Mail-App um 11, 6 % und die Anzahl der Conversions für den Nachrichtenbereich um 13,5%.

181 %

Anteil der Seiten mit guter CLS erhöht

2,7 %

Höhere durchschnittliche Sitzungsdauer

13,5 %

Steigerung der Conversion-Rate im Bereich „Nachrichten“

Das unerwartetste Ergebnis war eine Steigerung der Klickrate (Click-through-Rate, CTR) des Marketing-Banners um 17,4 %. Die Renderzeit wurde durch die Einführung von SSR- und Preloader-Tags deutlich reduziert.

Bei der Analyse der restlichen Abschnitte der Seite haben wir bei den meisten von ihnen eine deutliche Leistungssteigerung festgestellt. Sogar bei Abschnitten wie „Wetter“ und „Coronavirus“, die auf unserer Seite nicht im Mittelpunkt stehen, konnten wir eine Steigerung der Conversions um 9,6% bzw. 9,5 % verzeichnen.

Fazit

Die Leistungssteigerung ist eine Herausforderung, da die erforderlichen Arbeiten möglicherweise in die Länge gezogen werden. Sie sollten die Änderungen der Messwerte im Zeitverlauf regelmäßig beobachten und dafür sorgen, dass alle neuen Produktfunktionen keine Rückschritte bei den Core Web Vitals verursachen. Dazu überwachen wir Änderungen bei den Core Web Vitals in unserem Leistungsbudget.

Vor allem haben wir allen Mitgliedern unseres Produktteams die Bedeutung von Core Web Vitals vermittelt, von Managern und Designern bis hin zu Testern und QA-Experten. Jedes Teammitglied sollte mit den Leistungsmesswerten vertraut sein und die Möglichkeit haben, diese zu verbessern. Außerdem integrieren wir regelmäßig Ziele zur Leistungsoptimierung in unsere Geschäftsprozesse. Eine hochwertige Nutzererfahrung ist nur durch die gemeinsame Anstrengung aller Teammitglieder möglich.