Schnelleres Laden von Seiten dank „Early Hints“ durch die Reaktionszeit des Servers

Finden Sie heraus, wie Ihr Server Hinweise zu wichtigen Unterressourcen an den Browser senden kann.

Kenji Baheux
Kenji Baheux

Was sind „Early Hints“?

Websites sind im Laufe der Zeit ausgefeilter geworden. Daher ist es nicht ungewöhnlich, dass ein Server nicht einfache Aufgaben (z. B. Zugriff auf Datenbanken oder CDNs, die auf den Ursprungsserver zugreifen) ausführen muss, um den HTML-Code für die angeforderte Seite zu generieren. Diese „Denkzeit des Servers“ führt leider zu einer zusätzlichen Latenz, bevor der Browser mit dem Rendern der Seite beginnen kann. Die Verbindung bleibt so lange inaktiv, wie der Server zur Vorbereitung der Antwort benötigt.

Abbildung des Servers, der eine Zeitlücke von 200 ms zwischen dem Laden der Seite und dem Laden anderer Ressourcen zeigt.
Ohne Early Hints: Alles wird auf dem Server blockiert und bestimmt, wie für die Hauptressource geantwortet wird.

„Early Hints“ ist ein HTTP-Statuscode (103 Early Hints), mit dem vor einer endgültigen Antwort eine vorläufige HTTP-Antwort gesendet wird. Dadurch kann ein Server Hinweise auf kritische Unterressourcen (z. B. Stylesheets für die Seite, kritisches JavaScript) oder Ursprünge an den Browser senden, die wahrscheinlich von der Seite verwendet werden, während der Server mit der Generierung der Hauptressource beschäftigt ist. Der Browser kann diese Hinweise verwenden, um Verbindungen aufzuwärmen und Unterressourcen anzufordern, während er auf die Hauptressource wartet. Mit anderen Worten: Early Hints hilft dem Browser, diese „Denkzeit des Servers“ zu nutzen, indem er einige Vorarbeiten erledigt und so das Laden von Seiten beschleunigt.

Bild, das zeigt, wie die Seite mithilfe von Early Hints eine Teilantwort senden kann.
Mit Early Hints: Der Server kann eine Teilantwort mit Ressourcenhinweisen ausliefern, während er die endgültige Antwort bestimmt

In einigen Fällen kann die Leistungsverbesserung beim Largest Contentful Paint von Shopify und Cloudflare von mehreren hundert Millisekunden und bis zu einer Sekunde schneller erfolgen, wie in diesem Vorher-Nachher-Vergleich gezeigt:

Vergleich zweier Websites.
Vorher/Nachher-Vergleich der ersten Hinweise auf einer Testwebsite mit WebPageTest (Moto G4 – DSL)

So verwendest du Early Hints

Der erste Schritt zur Nutzung von Early Hints besteht darin, die besten Landingpages zu identifizieren, also die Seiten, auf denen die Nutzer normalerweise starten, wenn sie Ihre Website besuchen. Das kann die Startseite oder beliebte Seiten mit Produkteinträgen sein, wenn viele Nutzer von anderen Websites weitergeleitet werden. Diese Einstiegspunkte sind wichtiger als andere Seiten, da der Nutzen von „Early Hints“ mit zunehmender Navigation Ihrer Website abnimmt. Das heißt, der Browser verfügt mit größerer Wahrscheinlichkeit über alle erforderlichen Unterressourcen in der zweiten oder dritten Navigation. Es ist auch immer eine gute Idee, einen guten ersten Eindruck zu vermitteln!

Nachdem Sie diese priorisierte Liste mit Landingpages erstellt haben, müssen Sie im nächsten Schritt ermitteln, welche Ursprünge oder Unterressourcen sich gut für preconnect- oder preload-Hinweise eignen. In der Regel sind das Ursprünge und Unterressourcen, die am meisten zu wichtigen Nutzermesswerten wie Largest Contentful Paint oder First Contentful Paint beitragen. Genauer gesagt, suchen Sie nach Unterressourcen, die das Rendering blockieren, wie synchrones JavaScript, Stylesheets oder sogar Webschriftarten. Suchen Sie ebenso nach Ursprüngen, die Unterressourcen hosten, die einen großen Beitrag zu wichtigen Nutzermesswerten leisten.

Wenn Ihre Hauptressourcen bereits preconnect oder preload verwenden, können Sie diese Ursprünge oder Ressourcen als Kandidaten für „Early Hints“ in Betracht ziehen. Weitere Informationen zum Optimieren des LCP Allerdings ist es nicht optimal, die Anweisungen preconnect und preload von HTML in „Early Hints“ zu kopieren.

Wenn Sie diese in HTML verwenden, sollten Sie Ressourcen preconnect oder preload, die der Preload Scanner nicht im HTML-Code erkennt, z. B. Schriftarten oder Hintergrundbilder, die sonst erst später erkannt würden. Für Early Hints fehlt der HTML-Code, daher können Sie kritische Domains oder preload kritische Ressourcen, die sonst vielleicht zu Beginn des HTML-Codes gefunden werden, vielleicht ganz früh im HTML-Code finden, z. B. durch Vorabladen von main.css oder app.js. Außerdem unterstützen nicht alle Browser preload für Early Hints. Weitere Informationen finden Sie unter Browserunterstützung.preconnect

Der zweite Schritt besteht darin, das Risiko der Verwendung von Early Hints für Ressourcen oder Ursprünge zu minimieren, die möglicherweise veraltet oder von der Hauptressource nicht mehr verwendet werden. Beispielsweise sind Ressourcen, die häufig aktualisiert und versioniert werden (z. B. example.com/css/main.fa231e9c.css), nicht die beste Wahl. Beachten Sie, dass dieses Problem nicht nur für Early Hints gilt, sondern für alle preload oder preconnect, wo immer sie vorhanden sind. Diese Details sollten am besten mit Automatisierung oder Vorlagen umgehen. So ist es z. B. wahrscheinlicher, dass ein manueller Prozess zu nicht übereinstimmenden Hash- oder Versions-URLs zwischen „preload“ und dem HTML-Tag führt, das die Ressource nutzt.

Betrachten Sie als Beispiel den folgenden Ablauf:

GET /main.html
Host: example.com
User-Agent: [....] Chrome/103.0.0.0 [...]

Der Server prognostiziert, dass main.abcd100.css benötigt wird, und schlägt vor, die Anwendung mithilfe von Early Hints vorab zu laden:

103 Early Hints
Link: </main.abcd100.css>; rel=preload; as=style
[...]

Kurz darauf wird die Webseite, einschließlich des verknüpften Preisvergleichsportals, ausgeliefert. Leider wird diese CSS-Ressource häufig aktualisiert und die Hauptressource liegt bereits fünf Versionen vor der vorhergesagten CSS-Ressource (abcd100) (abcd105).

200 OK
[...]
<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.abcd105.css">

Versuche im Allgemeinen, Ressourcen und Ursprünge anzustreben, die ziemlich stabil und weitgehend unabhängig vom Ergebnis für die Hauptressource sind. Bei Bedarf können Sie Ihre Schlüsselressourcen in zwei Teile aufteilen: einen stabilen Teil, der für die Verwendung mit Early Hints vorgesehen ist, und einen dynamischeren Teil, der abgerufen werden muss, nachdem die Hauptressource vom Browser empfangen wurde:

<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.css">
   <link rel="stylesheet" href="/experimental.3eab3290.css">

Suchen Sie schließlich serverseitig nach Hauptressourcen-Anfragen von Browsern, die Early Hints unterstützen, und antworten Sie sofort mit 103 Early Hints. Geben Sie in der 103-Antwort die relevanten Hinweise zum Vorverbinden und Vorabladen an. Sobald die Hauptressource bereit ist, antworten Sie mit der üblichen Antwort (z. B. „200 OK“, wenn der Vorgang erfolgreich war). Aus Gründen der Abwärtskompatibilität empfiehlt es sich, auch Link-HTTP-Header in die endgültige Antwort aufzunehmen, vielleicht sogar mit kritischen Ressourcen, die im Rahmen der Generierung der Hauptressource deutlich wurden (z. B. der dynamische Teil einer Schlüsselressource, wenn Sie dem Vorschlag „In zwei aufteilen“ gefolgt sind). So würde das aussehen:

GET /main.html
Host: example.com
User-Agent: [....] Chrome/103.0.0.0 [...]
103 Early Hints
Link: <https://fonts.google.com>; rel=preconnect
Link: </main.css>; rel=preload; as=style
Link: </common.js>; rel=preload; as=script

Ein paar Minuten später:

200 OK
Content-Length: 7531
Content-Type: text/html; charset=UTF-8
Content-encoding: br
Link: <https://fonts.google.com>; rel=preconnect
Link: </main.css>; rel=preload; as=style
Link: </common.js>; rel=preload; as=script
Link: </experimental.3eab3290.css>; rel=preload; as=style
<HTML>
<head>
   <title>Example</title>
   <link rel="stylesheet" href="/main.css">
   <link rel="stylesheet" href="/experimental.3eab3290.css">
   <script src="/common.js"></script>
   <link rel="preconnect" href="https://fonts.googleapis.com">

Unterstützte Browser

Obwohl 103 Early Hints in allen gängigen Browsern unterstützt wird, unterscheiden sich die Anweisungen, die bei einem Early Hint gesendet werden können, je nach Browser:

Pre-Connect-Unterstützung:

Unterstützte Browser

  • 103
  • 103
  • 120
  • 17

Unterstützung vorab:

Unterstützte Browser

  • 103
  • 103
  • 123
  • x

Für die Chrome-Entwicklertools werden 103 Early Hints unterstützt.

Serversupport

Hier ist eine kurze Zusammenfassung des Supportniveaus für „Early Hints“ bei gängigen HTTP-Serversoftware von Open-Source-Software:

„Frühe Hinweise“ jetzt noch einfacher aktivieren

Wenn Sie eines der folgenden CDNs oder Plattformen verwenden, müssen Sie Early Hints möglicherweise nicht manuell implementieren. Lesen Sie in der Onlinedokumentation Ihres Lösungsanbieters nach, ob er Early Hints unterstützt, oder ziehen Sie die folgende nicht vollständige Liste zurate:

Probleme bei Clients vermeiden, die Early Hints nicht unterstützen

HTTP-Antworten im Bereich von 100 mit Informationen sind Teil des HTTP-Standards, aber einige ältere Clients oder Bots können damit Probleme haben, da sie vor der Einführung von 103 Early Hints selten zum allgemeinen Surfen im Web verwendet wurden.

Wenn Sie nur 103 Early Hints als Antwort an Clients ausgeben, die einen sec-fetch-mode: navigate-HTTP-Anfrageheader senden, sollten solche Hinweise nur für neuere Clients gesendet werden, die auf die nächste Antwort warten möchten. Da „Early Hints“ nur für Navigationsanfragen unterstützt wird (siehe aktuelle Einschränkungen), verhindert dies außerdem, dass sie unnötigerweise bei anderen Anfragen gesendet werden.

Außerdem empfehlen wir, frühzeitige Hinweise nur über HTTP/2- oder HTTP/3-Verbindungen zu senden.

Erweitertes Muster

Wenn Sie die Funktion „Early Hints“ vollständig auf Ihre wichtigsten Landingpages angewendet haben und nach weiteren Werbechancen suchen, könnte das folgende erweiterte Muster für Sie von Interesse sein.

Für Besucher, die im Rahmen einer typischen User Journey die nth Seitenanfrage stellen, empfiehlt es sich, die Antwort der Funktion „Early Hints“ für Inhalte weiter unten auf der Seite anzupassen, also die Funktion „Early Hints“ für Ressourcen mit niedrigerer Priorität zu verwenden. Dies mag unlogisch klingen, da wir empfehlen, sich auf Unterressourcen oder Ursprünge mit hoher Priorität zu konzentrieren, die das Rendering blockieren. Wenn ein Besucher jedoch schon länger mit dem Internet unterwegs ist, ist es sehr wahrscheinlich, dass sein Browser bereits über alle kritischen Ressourcen verfügt. Danach kann es sinnvoll sein, Ihre Aufmerksamkeit auf Ressourcen mit niedrigerer Priorität zu richten. So könnten Sie beispielsweise „Early Hints“ zum Laden von Produktbildern verwenden oder zusätzliches JS/CSS, das nur für weniger häufige Nutzerinteraktionen benötigt wird.

Aktuelle Beschränkungen

Im Folgenden finden Sie die Einschränkungen der ersten Hinweise, die in Chrome implementiert sind:

  • Nur für Navigationsanfragen verfügbar (Hauptressource für das Dokument der obersten Ebene).
  • Unterstützt nur preconnect und preload, d. h. prefetch wird nicht unterstützt.
  • „Early Hint“ gefolgt von einer ursprungsübergreifenden Weiterleitung bei der endgültigen Antwort führt dazu, dass Chrome die über „Early Hints“ abgerufenen Ressourcen und Verbindungen löscht.

Andere Browser haben ähnliche Einschränkungen, bei einigen gelten 103 frühe Hinweise weiter auf preconnect.

Nächste Schritte

Je nach Interesse der Community können wir unsere Implementierung von Early Hints um folgende Funktionen ergänzen:

  • Frühe Hinweise zu Anfragen von Unterressourcen.
  • Frühe Hinweise zu Anfragen an iFrame-Hauptressourcen.
  • Unterstützung für Prefetch in Early Hints

Wir freuen uns über Ihr Feedback dazu, welche Aspekte priorisiert werden sollten und wie Sie „Early Hints“ weiter verbessern können.

Beziehung zu H2/Push

Wenn Sie mit der eingestellten HTTP2/Push-Funktion vertraut sind, fragen Sie sich vielleicht, worin sich die Funktion „Early Hints“ unterscheidet. Während Early Hints einen Umlauf erfordert, damit der Browser kritische Unterressourcen abrufen kann, könnte der Server mit HTTP2/Push damit beginnen, mit der Antwort Unterressourcen zu übertragen. Das klingt zwar erstaunlich, aber dies führte zu einem wesentlichen strukturellen Nachteil: Mit HTTP2/Push war es extrem schwierig, das Übertragen von Unterressourcen zu vermeiden, die bereits im Browser vorhanden waren. Dieser „Überschub“-Effekt führte zu einer weniger effizienten Nutzung der Netzwerkbandbreite, was die Leistungsvorteile erheblich beeinträchtigt. Insgesamt zeigten Chrome-Daten, dass HTTP2/Push tatsächlich ein negatives Ergebnis für die Leistung im Web war.

Im Gegensatz dazu funktioniert Early Hints in der Praxis besser, da es die Möglichkeit, eine vorläufige Antwort zu senden, mit Hinweisen kombiniert, die den Browser für das Abrufen oder Herstellen einer Verbindung zum eigentlichen Bedarf verantwortlich machen. „Early Hints“ deckt zwar nicht alle Anwendungsfälle ab, die HTTP2/Push theoretisch angehen könnte, wir sind jedoch der Meinung, dass Early Hints eine praktischere Lösung zur Beschleunigung der Navigation bietet.

Miniaturansicht von Pierre Bamin.