Mit Client-Hinweisen an Nutzer anpassen

Websites zu entwickeln, die überall schnell sind, kann eine Herausforderung sein. Die Vielzahl der Gerätefunktionen und die Qualität der Netzwerke, mit denen sie verbunden sind, können die Aufgabe unüberwindbar erscheinen lassen. Wir können zwar Browserfunktionen nutzen, um die Ladeleistung zu verbessern, aber woher wissen wir, welche Möglichkeiten das Gerät des Nutzers bietet oder wie gut seine Netzwerkverbindung ist? Die Lösung sind Hinweise für den Kunden.

Clienthinweise sind eine Reihe von HTTP-Anfrageheadern, die wir aktivieren können, um Informationen zu diesen Aspekten des Geräts des Nutzers und des Netzwerks zu erhalten, mit dem er verbunden ist. Wenn wir diese Informationen serverseitig nutzen, können wir die Art und Weise ändern, wie wir Inhalte basierend auf den Geräte- und/oder Netzwerkbedingungen bereitstellen. Dies kann uns helfen, inklusivere User Experiences zu schaffen.

Es geht um die Verhandlung von Inhalten

Clienthinweise sind eine weitere Methode der Inhaltsverhandlung, d. h. die Änderung von Inhaltsantworten basierend auf Browseranfrage-Headern.

Ein Beispiel für die Inhaltsverhandlung ist der Accept-Anfrageheader. Sie beschreibt, welche Inhaltstypen der Browser versteht, die der Server zur Verhandlung der Antwort verwenden kann. Bei Bildanfragen enthält der Accept-Header von Chrome den folgenden Inhalt:

Accept: image/webp,image/apng,image/*,*/*;q=0.8

Alle Browser unterstützen Bildformate wie JPEG, PNG und GIF. „Accept“ gibt in diesem Fall an, dass der Browser auch WebP und APNG unterstützt. Anhand dieser Informationen können wir die besten Bildtypen für jeden Browser aushandeln:

<?php
// Check Accept for an "image/webp" substring.
$webp = stristr($_SERVER["HTTP_ACCEPT"], "image/webp") !== false ? true : false;

// Set the image URL based on the browser's WebP support status.
$imageFile = $webp ? "whats-up.webp" : "whats-up.jpg";
?>
<img src="<?php echo($imageFile); ?>" alt="I'm an image!">

Ähnlich wie Accept sind Clienthinweise eine weitere Möglichkeit, Inhalte auszuhandeln, aber im Kontext der Gerätefunktionen und Netzwerkbedingungen. Mithilfe von Clienthinweisen können wir serverseitige Leistungsentscheidungen basierend auf der individuellen Nutzung eines Nutzers treffen, z. B. ob nicht kritische Ressourcen für Nutzer mit schlechten Netzwerkbedingungen bereitgestellt werden sollen. In diesem Leitfaden werden alle verfügbaren Hinweise beschrieben und einige Möglichkeiten aufgezeigt, wie du die Bereitstellung von Inhalten für Nutzer optimieren kannst.

Aktivieren

Im Gegensatz zum Accept-Header erscheinen Clienthinweise nicht einfach so (mit Ausnahme von Save-Data, auf das wir später noch eingehen). Um die Anzahl der Anfrageheader möglichst gering zu halten, müssen Sie festlegen, welche Clienthinweise Sie erhalten möchten. Dazu senden Sie einen Accept-CH-Header, wenn ein Nutzer eine Ressource anfordert:

Accept-CH: Viewport-Width, Downlink

Der Wert für Accept-CH ist eine durch Kommas getrennte Liste von angeforderten Hinweisen, die die Website bei der Bestimmung der Ergebnisse für die nachfolgende Ressourcenanfrage verwendet. Wenn der Client diese Kopfzeile liest, wird ihm mitgeteilt, dass für diese Website die Clienthinweise Viewport-Width und Downlink erforderlich sind. Machen Sie sich keine Gedanken über die spezifischen Hinweise. Dazu kommen wir gleich.

Sie können diese Einwilligungs-Header in jeder Back-End-Sprache festlegen. Beispielsweise könnte die header-Funktion von PHP verwendet werden. Sie können diese Einwilligungs-Header sogar mit dem Attribut http-equiv in einem <meta>-Tag festlegen:

<meta http-equiv="Accept-CH" content="Viewport-Width, Downlink" />

Alle Client-Hinweise!

Clienthinweise beschreiben eines von zwei Dingen: das Gerät, das Ihre Nutzer verwenden, und das Netzwerk, über das sie auf Ihre Website zugreifen. Sehen wir uns kurz alle verfügbaren Hinweise an.

Gerätehinweise

Einige Clienthinweise beschreiben Merkmale des Geräts des Nutzers, in der Regel Bildschirmmerkmale. Einige davon können Ihnen helfen, die optimale Medienressource für das Display eines bestimmten Nutzers auszuwählen. Sie sind jedoch nicht unbedingt medienorientiert.

Bevor wir uns diese Liste ansehen, sollten Sie sich mit einigen wichtigen Begriffen vertraut machen, die zur Beschreibung von Bildschirmen und Medienauflösungen verwendet werden:

Eigentliche Größe:Die tatsächlichen Abmessungen einer Medienressource. Wenn Sie beispielsweise ein Bild in Photoshop öffnen, geben die Abmessungen im Dialogfeld „Bildgröße“ die ursprüngliche Größe an.

Dichtekorrigierte intrinsische Größe:Die Abmessungen einer Medienressource, nachdem sie für die Pixeldichte korrigiert wurde. Sie entspricht der ursprünglichen Größe des Bildes geteilt durch ein Pixelverhältnis des Geräts. Sehen wir uns zum Beispiel dieses Markup an:

<img
  src="whats-up-1x.png"
  srcset="whats-up-2x.png 2x, whats-up-1x.png 1x"
  alt="I'm that image you wanted."
/>

Angenommen, die ursprüngliche Größe des 1x-Bildes beträgt in diesem Fall 320 × 240 und die ursprüngliche Größe des 2x-Bildes 640 × 480. Wenn dieses Markup von einem Client geparst wird, der auf einem Gerät mit einem Pixelverhältnis von 2 installiert ist (z.B. ein Retina-Display), wird das 2x-Bild angefordert. Die dichtekorrigierte intrinsische Größe des 2x-Bilds beträgt 320 × 240, da 640 × 480 geteilt durch 2 = 320 × 240 ergibt.

Extrinsische Größe:Die Größe einer Medienressource, nachdem CSS und andere Layoutfaktoren (z. B. width- und height-Attribute) angewendet wurden. Angenommen, Sie haben ein <img>-Element, das ein Bild mit einer dichtekorrigierten Eigenschaftsgröße von 320 × 240 lädt. Es hat aber auch die CSS-Eigenschaften width und height mit den Werten 256px und 192px. In diesem Beispiel beträgt die externe Größe dieses <img>-Elements 256 × 192.

Eine Abbildung der intrinsischen Größe im Vergleich zur extrinsischen Größe. Ein Feld mit der Größe 320 × 240 Pixel ist mit dem Label „INTRINSIC FONT SIZE“ (EIGENTLICHE FONTGRÖSSE) zu sehen. Darin befindet sich ein kleineres Feld mit einer Größe von 256 × 192 Pixeln, das ein HTML-img-Element mit angewendetem CSS darstellt. Dieses Feld ist mit „EXTRINSIC SIZE“ (EXTRINSICHE GRÖSSE) gekennzeichnet. Rechts sehen Sie ein Feld mit CSS-Code, der auf das Element angewendet wird. Dadurch wird das Layout des img-Elements so geändert, dass sich seine externe Größe von seiner intrinsischen Größe unterscheidet.
Abbildung 1. Eine Abbildung der intrinsischen und der extrinsischen Größe. Die externe Größe eines Bildes wird festgelegt, nachdem Layoutfaktoren darauf angewendet wurden. In diesem Fall wird durch Anwenden der CSS-Regeln width: 256px; und height: 192px; ein Bild mit einer intrinsischen Größe von 320 × 240 in ein Bild mit einer extrinsischen Größe von 256 × 192 umgewandelt.

Nachdem wir uns mit der Terminologie vertraut gemacht haben, sehen wir uns die Liste der gerätespezifischen Kundenhinweise an.

Viewport-Breite

Viewport-Width ist die Breite des Darstellungsbereichs des Nutzers in CSS-Pixeln:

Viewport-Width: 320

Dieser Hinweis kann mit anderen bildschirmspezifischen Hinweisen verwendet werden, um verschiedene Versionen (d.h. Zuschnitte) eines Bildes bereitzustellen, die für bestimmte Bildschirmgrößen optimal sind (d.h. art direction), oder um Ressourcen auszuschließen, die für die aktuelle Bildschirmbreite nicht erforderlich sind.

DPR

DPR, kurz für Device Pixel Ratio, gibt das Verhältnis der physischen Pixel zu den CSS-Pixeln des Displays des Nutzers an:

DPR: 2

Dieser Hinweis ist nützlich, wenn Sie Bildquellen auswählen, die der Pixeldichte eines Bildschirms entsprechen (wie x-Beschreibungen im srcset-Attribut).

Breite

Der Hinweis Width wird bei Anfragen für Bildressourcen angezeigt, die von <img>- oder <source>-Tags mit dem sizes-Attribut ausgelöst werden. sizes teilt dem Browser mit, wie groß die externe Größe der Ressource sein wird. Width verwendet diese externe Größe, um ein Bild mit einer inhärenten Größe anzufordern, die für das aktuelle Layout optimal ist.

Angenommen, ein Nutzer ruft eine Seite mit einem 320 CSS-Pixel breiten Bildschirm mit einem DPR von 2 auf. Das Gerät lädt ein Dokument mit einem <img>-Element mit dem sizes-Attributwert 85vw (d.h. 85% der Darstellungsbereichsbreite für alle Bildschirmgrößen). Wenn die Width-Hinweisfunktion aktiviert ist, sendet der Client diesen Width-Hinweis an den Server mit der Anfrage für die src der <img>:

Width: 544

In diesem Fall gibt der Client dem Server an, dass eine optimale intrinsische Breite für das angeforderte Bild 85% der Viewport-Breite (272 Pixel) multipliziert mit dem DPR des Bildschirms (2) entspricht, was 544 Pixeln entspricht.

Dieser Hinweis ist besonders hilfreich, da er nicht nur die dichtekorrigierte Breite des Bildschirms berücksichtigt, sondern auch diese wichtige Information mit der externen Größe des Bildes im Layout abgleicht. So haben Server die Möglichkeit, Bildantworten auszuhandeln, die sowohl für das Display als auch für das Layout optimal sind.

Content-DPR

Sie wissen bereits, dass Bildschirme ein Pixelverhältnis haben. Auch Ressourcen haben ein eigenes Pixelverhältnis. Bei den einfachsten Anwendungsfällen für die Ressourcenauswahl können die Pixelverhältnisse zwischen Geräten und Ressourcen gleich sein. Wenn sowohl die DPR- als auch die Width-Header verwendet werden, kann es aufgrund der externen Größe einer Ressource zu Szenarien kommen, in denen sich die beiden unterscheiden. Hier kommt der Hinweis Content-DPR ins Spiel.

Im Gegensatz zu anderen Clienthinweisen ist Content-DPR kein Anfrage-Header, der von Servern verwendet werden kann, sondern ein Antwort-Header, den Server senden müssen, wenn DPR- und Width-Hinweise zur Auswahl einer Ressource verwendet werden. Der Wert von Content-DPR sollte das Ergebnis dieser Gleichung sein:

Content-DPR = [Größe der ausgewählten Bildressource] ÷ ([Width] ÷ [DPR])

Wenn ein Content-DPR-Anfrageheader gesendet wird, weiß der Browser, wie das angegebene Bild für das Pixelverhältnis des Bildschirms und das Layout skaliert werden muss. Andernfalls werden Bilder möglicherweise nicht richtig skaliert.

Gerätespeicher

Device-Memory ist technisch gesehen Teil der Device Memory API und gibt den ungefähren Arbeitsspeicherplatz in GiB an:

Device-Memory: 2

Ein möglicher Anwendungsfall für diesen Hinweis wäre die Reduzierung der Menge an JavaScript, die an Browser auf Geräten mit begrenztem Arbeitsspeicher gesendet wird, da JavaScript der ressourcenintensivste Inhaltstyp ist, den Browser normalerweise laden. Sie können auch Bilder mit niedrigerer DPR senden, da für die Dekodierung weniger Arbeitsspeicher benötigt wird.

Netzwerkhinweise

Die Network Information API bietet eine weitere Kategorie von Clienthinweisen, die die Leistung der Netzwerkverbindung des Nutzers beschreiben. Das sind meiner Meinung nach die nützlichsten Hinweise. So können wir die Nutzererfahrung anpassen, indem wir die Bereitstellung von Ressourcen für Clients mit langsamen Verbindungen ändern.

RTT

Der RTT-Hinweis gibt die ungefähre Umlaufzeit in Millisekunden auf Anwendungsebene an. Der RTT-Hinweis enthält im Gegensatz zum RTT der Transportschicht die Verarbeitungszeit des Servers.

RTT: 125

Dieser Hinweis ist nützlich, da die Latenz eine wichtige Rolle bei der Ladeleistung spielt. Anhand des RTT-Hinweises können wir Entscheidungen basierend auf der Netzwerkreaktionsfähigkeit treffen, was die Bereitstellung einer gesamten Website beschleunigen kann (z.B. durch Auslassen einiger Anfragen).

Die Latenz ist zwar wichtig für die Ladeleistung, aber auch die Bandbreite spielt eine Rolle. Der Hinweis Downlink, ausgedrückt in Megabit pro Sekunde (Mbit/s), gibt die ungefähre Downstreamgeschwindigkeit der Verbindung des Nutzers an:

Downlink: 2.5

In Verbindung mit RTT kann Downlink verwendet werden, um die Auslieferung von Inhalten an Nutzer basierend auf der Qualität einer Netzwerkverbindung zu ändern.

ECT

Der Hinweis ECT steht für Effektiver Verbindungstyp. Der Wert ist einer aus einer aufgezählten Liste von Verbindungstypen, die jeweils eine Verbindung innerhalb bestimmter Bereiche von RTT- und Downlink-Werten beschreiben.

Diese Überschrift gibt nicht an, um welchen tatsächlichen Verbindungstyp es sich handelt. Sie gibt beispielsweise nicht an, ob es sich bei Ihrem Gateway um einen Mobilfunkmast oder einen WLAN-Zugangspunkt handelt. Stattdessen werden die Latenz und die Bandbreite der aktuellen Verbindung analysiert und das Netzwerkprofil ermittelt, dem sie am ehesten entspricht. Wenn Sie beispielsweise über WLAN eine Verbindung zu einem langsamen Netzwerk herstellen, wird für ECT möglicherweise der Wert 2g verwendet, der der effektiven Verbindung am nächsten kommt:

ECT: 2g

Gültige Werte für ECT sind 4g, 3g, 2g und slow-2g. Dieser Hinweis kann als Ausgangspunkt für die Beurteilung der Verbindungsqualität verwendet und anschließend mit den Hinweisen RTT und Downlink verfeinert werden.

Daten-speichern

Save-Data ist weniger ein Hinweis auf die Netzwerkbedingungen als eine Nutzereinstellung, die angibt, dass Seiten weniger Daten senden sollen.

Ich würde Save-Data als Netzwerkhinweis klassifizieren, da viele der damit möglichen Aktionen denen anderer Netzwerkhinweise ähneln. Nutzer werden es wahrscheinlich auch in Umgebungen mit hoher Latenz und niedriger Bandbreite aktivieren. Wenn dieser Hinweis vorhanden ist, sieht er immer so aus:

Save-Data: on

Wir haben bereits darüber gesprochen, was Sie mit Save-Data tun können. Die Auswirkungen auf die Leistung können erheblich sein. Es ist ein Signal, bei dem Nutzer Sie buchstäblich bitten, ihnen weniger E-Mails zu senden. Wenn Sie darauf hören und entsprechend handeln, werden es die Nutzer zu schätzen wissen.

Konzepte verbinden

Was Sie mit Clienthinweisen tun, liegt ganz bei Ihnen. Da sie so viele Informationen bieten, haben Sie viele Möglichkeiten. Um Ideen zu sammeln, sehen wir uns an, was Kundenhinweise für Sconnie Timber, ein fiktives Holzunternehmen im ländlichen Mittleren Westen, tun können. Wie oft in abgelegenen Gebieten, können Netzwerkverbindungen empfindlich sein. Hier kann eine Technologie wie Client-Hinweise einen echten Unterschied für Nutzer machen.

Responsive Bilder

Alle Anwendungsfälle für responsive Bilder, die nicht ganz einfach sind, können kompliziert werden. Was ist, wenn Sie mehrere Versionen und Varianten derselben Bilder für verschiedene Bildschirmgrößen und Formate haben? Dieses Markup wird sehr sehr schnell kompliziert. Es ist leicht, Fehler zu machen und wichtige Konzepte (z. B. sizes) zu vergessen oder falsch zu verstehen.

<picture> und srcset sind zweifellos tolle Tools, aber die Entwicklung und Pflege für komplexe Anwendungsfälle kann zeitaufwendig sein. Wir können die Markup-Generierung automatisieren, aber das ist auch schwierig, da die Funktionen von <picture> und srcset so komplex sind, dass ihre Automatisierung so erfolgen muss, dass die Flexibilität erhalten bleibt.

Clienthinweise können dies vereinfachen. Die Verhandlung von Bildantworten mit Clienthinweisen könnte so aussehen:

  1. Wählen Sie bei Bedarf zuerst eine Bildbehandlung aus (d.h. art-directed-Bilder), indem Sie das Kästchen Viewport-Width anklicken.
  2. Wählen Sie eine Bildauflösung aus, indem Sie den Hinweis Width und den Hinweis DPR aktivieren und eine Quelle auswählen, die zur Layoutgröße und Bildschirmdichte des Bildes passt. Das funktioniert ähnlich wie die x- und w-Beschreibungen in srcset.
  3. Wähle das optimale Dateiformat aus, das vom Browser unterstützt wird. Accept hilft uns dabei, das in den meisten Browsern zu tun.

Für meinen fiktiven Holzhändler habe ich in PHP einen naiven Responsive-Image-Auswahlmechanismus entwickelt, der Clienthinweise verwendet. Das bedeutete, dass dieses Markup nicht mehr an alle Nutzer gesendet wurde:

<picture>
  <source
    srcset="
      company-photo-256w.webp   256w,
      company-photo-512w.webp   512w,
      company-photo-768w.webp   768w,
      company-photo-1024w.webp 1024w,
      company-photo-1280w.webp 1280w
    "
    type="image/webp"
  />
  <img
    srcset="
      company-photo-256w.jpg   256w,
      company-photo-512w.jpg   512w,
      company-photo-768w.jpg   768w,
      company-photo-1024w.jpg 1024w,
      company-photo-1280w.jpg 1280w
    "
    src="company-photo-256w.jpg"
    sizes="(min-width: 560px) 251px, 88.43vw"
    alt="The Sconnie Timber Staff!"
  />
</picture>

Basierend auf der Unterstützung einzelner Browser konnte ich die Liste auf die folgenden Browser eingrenzen:

<img
  src="/image/sizes:true/company-photo.jpg"
  sizes="(min-width: 560px) 251px, 88.43vw"
  alt="SAY CHEESY PICKLES."
/>

In diesem Beispiel ist die /image-URL ein PHP-Script, gefolgt von Parametern, die von mod_rewrite umgeschrieben werden. Es nimmt einen Bilddateinamen und zusätzliche Parameter an, um einem Back-End-Script zu helfen, das beste Bild unter den gegebenen Bedingungen auszuwählen.

Ich vermute, dass Ihre erste Frage „Aber ist das nicht einfach nur eine Neuimplementierung von <picture> und srcset im Backend?“ lautet.

In gewisser Weise ja, aber mit einem wichtigen Unterschied: Wenn eine Anwendung Clienthinweise zum Erstellen von Medienantworten verwendet, lässt sich der Großteil (wenn nicht die gesamte Arbeit) viel einfacher automatisieren. Dazu kann auch ein Dienst (z. B. ein CDN) verwendet werden, der dies in Ihrem Namen erledigt. Bei HTML-Lösungen muss dagegen für jeden Anwendungsfall neues Markup geschrieben werden. Natürlich können Sie die Markup-Generierung automatisieren. Wenn sich Ihr Design oder Ihre Anforderungen jedoch ändern, müssen Sie Ihre Automatisierungsstrategie in Zukunft wahrscheinlich noch einmal überarbeiten.

Mit Clienthinweisen können Sie mit einem verlustfreien, hochauflösenden Bild beginnen, das dann dynamisch so skaliert werden kann, dass es für jede Kombination aus Bildschirm und Layout optimal ist. Im Gegensatz zu srcset, bei dem Sie eine feste Liste möglicher Bildkandidaten auflisten müssen, aus denen der Browser auswählen kann, kann dieser Ansatz flexibler sein. Bei srcset müssen Sie Browsern eine grobe Auswahl an Varianten anbieten, z. B. 256w, 512w, 768w und 1024w. Mit einer Lösung, die auf Clienthinweisen basiert, können alle Breiten ohne großen Markup-Code ausgeliefert werden.

Natürlich müssen Sie die Logik für die Bildauswahl nicht selbst schreiben. Cloudinary verwendet Client-Hinweise, um Bildantworten zu erstellen, wenn Sie den Parameter w_auto verwenden. Dabei wurde festgestellt, dass Nutzer im Median 42% weniger Byte heruntergeladen haben, wenn sie Browser mit Client-Hinweisen verwendet haben.

Aber Vorsicht: Durch Änderungen an der Desktopversion von Chrome 67 wurde die Unterstützung für clientseitige Hinweise zwischen verschiedenen Ursprüngen entfernt. Glücklicherweise wirken sich diese Einschränkungen nicht auf die mobilen Versionen von Chrome aus. Sie werden für alle Plattformen aufgehoben, sobald die Richtlinie zu Funktionen fertig ist.

Hilfe für Nutzer mit langsamen Netzwerken

Bei der adaptiven Leistung können wir die Bereitstellung von Ressourcen anhand der Informationen anpassen, die uns über Client-Hinweise zur Verfügung gestellt werden, insbesondere Informationen zum aktuellen Status der Netzwerkverbindung des Nutzers.

Bei der Website von Sconnie Timber ergreifen wir Maßnahmen, um die Auslastung zu verringern, wenn die Netzwerke langsam sind. Dazu werden die Save-Data-, ECT-, RTT- und Downlink-Header in unserem Back-End-Code geprüft. Anschließend generieren wir einen Netzwerkqualitäts-Wert, anhand dessen wir entscheiden können, ob wir eingreifen sollten, um die Nutzerfreundlichkeit zu verbessern. Dieser Netzwerkwert liegt zwischen 0 und 1. Dabei steht 0 für die schlechteste und 1 für die beste Netzwerkqualität.

Zuerst prüfen wir, ob Save-Data vorhanden ist. Ist das der Fall, wird die Bewertung auf 0 gesetzt, da wir davon ausgehen, dass der Nutzer möchte, dass wir alles tun, um die Nutzung zu vereinfachen und zu beschleunigen.

Wenn Save-Data jedoch nicht vorhanden ist, fahren wir fort und gewichten die Werte der Hinweise ECT, RTT und Downlink, um einen Wert zu berechnen, der die Qualität der Netzwerkverbindung beschreibt. Der Quellcode zur Generierung von Netzwerkbewertungen ist auf GitHub verfügbar. Wenn wir die netzwerkbezogenen Hinweise auf irgendeine Weise nutzen, können wir die Nutzererfahrung für Nutzer mit langsamen Netzwerken verbessern.

Vergleich einer Website, die keine Clienthinweise verwendet, um sich an eine langsame Netzwerkverbindung anzupassen (links), mit derselben Website, die dies tut (rechts).
Abbildung 2: Eine „Über uns“-Seite für die Website eines lokalen Unternehmens. Die Standardversion umfasst Webschriften, JavaScript für ein Karussell- und Akkordeon-Verhalten sowie Inhaltsbilder. All das können wir weglassen, wenn die Netzwerkbedingungen zu langsam sind, um sie schnell zu laden.

Wenn Websites an die Informationen in den Clienthinweisen angepasst werden, müssen wir nicht den Ansatz „Alles oder nichts“ verfolgen. Wir können intelligent entscheiden, welche Ressourcen gesendet werden. Wir können unsere Logik zur Auswahl responsiver Bilder so ändern, dass für ein bestimmtes Display Bilder mit niedrigerer Qualität gesendet werden, um die Ladeleistung zu beschleunigen, wenn die Netzwerkqualität schlecht ist.

In diesem Beispiel sehen wir, wie sich Clienthinweise auf die Leistung von Websites in langsameren Netzwerken auswirken. Unten sehen Sie einen WebPagetest-Wasserfall einer Website in einem langsamen Netzwerk, der sich nicht an Clienthinweise anpasst:

Eine WebPagetest-Abfolge der Website von Sconnie Timber, bei der alle Ressourcen über eine langsame Netzwerkverbindung geladen werden.
Abbildung 3. Eine ressourcenintensive Website, auf der Bilder, Scripts und Schriftarten über eine langsame Verbindung geladen werden.

Und hier eine Abfolge für dieselbe Website mit derselben langsamen Verbindung. Dieses Mal werden jedoch nicht kritische Seitenressourcen mithilfe von Clienthinweisen entfernt:

Eine WebPagetest-Abfolge für die Website von Sconnie Timber, bei der anhand von Clienthinweisen entschieden wird, nicht kritische Ressourcen bei einer langsamen Netzwerkverbindung nicht zu laden.
Abbildung 4. Dieselbe Website über dieselbe Verbindung, wobei nur die Ressourcen ausgeschlossen werden, die nicht unbedingt erforderlich sind, um das Laden zu beschleunigen.

Mithilfe von Clienthinweisen konnte die Seitenladezeit von über 45 Sekunden auf weniger als ein Zehntel dieser Zeit reduziert werden. Die Vorteile von Clienthinweisen in diesem Szenario können nicht genug betont werden und können für Nutzer, die über langsame Netzwerke nach wichtigen Informationen suchen, ein echter Segen sein.

Außerdem ist es möglich, Clienthinweise zu verwenden, ohne die Nutzung für Browser zu beeinträchtigen, die sie nicht unterstützen. Wenn wir beispielsweise die Ressourcenbereitstellung anhand des Werts des ECT-Hinweises anpassen und gleichzeitig die vollständige Funktion für nicht unterstützte Browser bereitstellen möchten, können wir den Rückfall auf einen Standardwert so festlegen:

// Set the ECT value to "4g" by default.
$ect = isset($_SERVER["HTTP_ECT"]) ? $_SERVER["HTTP_ECT"] : "4g";

Hier steht "4g" für die Netzwerkverbindung mit der höchsten Qualität, die in der ECT-Überschrift beschrieben wird. Wenn wir $ect auf "4g" initialisieren, sind Browser, die keine Clienthinweise unterstützen, nicht betroffen. Aktivieren ist der Hit!

Achten Sie auf die Caches!

Wenn Sie eine Antwort basierend auf einem HTTP-Header ändern, müssen Sie wissen, wie Caches zukünftige Abrufe für diese Ressource verarbeiten. Der Vary-Header ist hier unverzichtbar, da er Cache-Einträge auf den Wert der angegebenen Anfrageheader verweist. Wenn Sie eine Antwort basierend auf einem bestimmten HTTP-Anfrageheader ändern, sollten Sie diesen Header fast immer in Vary einschließen, z. B. so:

Vary: DPR, Width

Es gibt jedoch einen großen Vorbehalt: Sie sollten niemals cachefähige Antworten auf einen häufig wechselnden Header (z. B. Cookie) Vary, da diese Ressourcen dann nicht mehr im Cache gespeichert werden können. Aus diesem Grund solltest du Vary-Header für Clienthinweise wie RTT oder Downlink vermeiden, da sich diese Verbindungsfaktoren häufig ändern können. Wenn Sie Antworten auf diese Header ändern möchten, sollten Sie nur den ECT-Header eingeben. Dadurch werden Cache-Ausfälle minimiert.

Dies gilt natürlich nur, wenn Sie eine Antwort überhaupt im Cache speichern. HTML-Assets werden beispielsweise nicht im Cache gespeichert, wenn ihre Inhalte dynamisch sind, da dies die Nutzerfreundlichkeit bei wiederholten Besuchen beeinträchtigen kann. In solchen Fällen können Sie diese Antworten nach eigenem Ermessen ändern und sich nicht um Vary kümmern.

Client-Hinweise in Service Workern

Die Inhaltsverhandlung ist nicht mehr nur für Server gedacht. Da Service Worker als Proxys zwischen Clients und Servern fungieren, können Sie steuern, wie Ressourcen über JavaScript bereitgestellt werden. Dazu gehören auch Hinweise für Kunden. Im Service Worker-Ereignis fetch können Sie die Methode request.headers.get des event-Objekts verwenden, um die Anfrageheader einer Ressource so zu lesen:

self.addEventListener('fetch', (event) => {
  let dpr = event.request.headers.get('DPR');
  let viewportWidth = event.request.headers.get('Viewport-Width');
  let width = event.request.headers.get('Width');

  event.respondWith(
    (async function () {
      // Do what you will with these hints!
    })(),
  );
});

Alle Client-Hinweis-Header, die Sie aktivieren, können auf diese Weise gelesen werden. Das ist aber nicht die einzige Möglichkeit, an einige dieser Informationen zu gelangen. Netzwerkspezifische Hinweise können in diesen entsprechenden JavaScript-Eigenschaften im navigator-Objekt gelesen werden:

Clienthinweis JS-Äquivalent
`ECT` `navigator.connection.effectiveType`
„RTT“ `navigator.connection.rtt`
`Save-Data` `navigator.connection.saveData`
„Downlink“ `navigator.connection.downlink`
„Device-Memory“ `navigator.deviceMemory`
Imagemin-Plug-ins für Dateitypen.

Da diese APIs nicht überall verfügbar sind, musst du die Funktion beim in-Anbieter prüfen:

if ('connection' in navigator) {
  // Work with netinfo API properties in JavaScript!
}

Hier kannst du eine ähnliche Logik wie auf dem Server verwenden, mit dem Unterschied, dass du keinen Server benötigst, um Inhalte mit Clienthinweisen auszuhandeln. Nur Servicemitarbeiter haben die Möglichkeit, die Nutzung zu beschleunigen und leistungsfähiger zu machen, da sie Inhalte auch dann bereitstellen können, wenn der Nutzer offline ist.

Zusammenfassung

Mit Clienthinweisen können wir die Nutzung für Nutzer auf völlig progressive Weise beschleunigen. Wir können Medien basierend auf den Gerätefunktionen des Nutzers bereitstellen, sodass das Bereitstellen responsiver Bilder einfacher ist als die Verwendung von <picture> und srcset, insbesondere bei komplexen Anwendungsfällen. So können wir nicht nur Zeit und Aufwand auf der Entwicklungsseite reduzieren, sondern auch Ressourcen – insbesondere Bilder – so optimieren, dass sie die Bildschirme der Nutzer genauer ansprechen als und srcset.

Noch wichtiger ist, dass wir schlechte Netzwerkverbindungen erkennen und die Lücke für Nutzer schließen können, indem wir ändern, was und wie wir senden. Dies kann einen großen Beitrag dazu leisten, den Zugriff auf Websites für Nutzer in empfindlichen Netzwerken zu erleichtern. In Kombination mit Service Workers können wir unglaublich schnelle Websites erstellen, die auch offline verfügbar sind.

Clienthinweise sind zwar nur in Chrome und in Chromium-basierten Browsern verfügbar, können aber so verwendet werden, dass sie Browsern, die sie nicht unterstützen, nicht zur Last fallen. Mithilfe von Clienthinweisen können Sie eine wirklich inklusive und anpassbare Umgebung schaffen, die die Gerätefunktionen aller Nutzer und die Netzwerke berücksichtigt, mit denen sie verbunden sind. Wir hoffen, dass andere Browseranbieter den Wert dieser Funktionen erkennen und sie implementieren werden.

Ressourcen

Vielen Dank an Ilya Grigorik, Eric Portis, Jeff Posnick, Yoav Weiss und Estelle Weyl für ihr wertvolles Feedback und ihre Änderungen an diesem Artikel.