Finde deinen Cache ❤️

Wenn Nutzer Ihre Website ein zweites Mal laden, wird ihr HTTP-Cache verwendet. Achten Sie also darauf, dass er ordnungsgemäß funktioniert.

Dieser Beitrag ist eine Ergänzung zum Video Love your cache (Lieben Sie Ihren Cache), das Teil der erweiterten Inhalte des Chrome Dev Summit 2020 ist. Sehen Sie sich das Video an:

Wenn Nutzer Ihre Website ein zweites Mal laden, verwendet ihr Browser Ressourcen aus seinem HTTP-Cache, um das Laden zu beschleunigen. Die Standards für das Caching im Web reichen jedoch bis ins Jahr 1999 zurück und sind ziemlich weit gefasst. Es ist nicht ganz einfach, zu bestimmen, ob eine Datei wie CSS oder ein Bild aus dem Netzwerk oder aus dem Cache noch einmal abgerufen wird.

In diesem Beitrag erkläre ich eine sinnvolle, moderne Standardeinstellung für das Caching, bei der überhaupt kein Caching erfolgt. Das ist aber nur die Standardeinstellung. Natürlich ist es etwas komplizierter, als die Funktion einfach nur zu deaktivieren. Am besten gleich weiterlesen!

Ziele

Wenn eine Website zum zweiten Mal geladen wird, haben Sie zwei Ziele:

  1. Sorgen Sie dafür, dass Ihre Nutzer die aktuellste Version erhalten. Wenn Sie etwas geändert haben, sollte dies schnell übernommen werden.
  2. Erster Schritt und so wenig wie möglich aus dem Netzwerk abrufen

Im Prinzip sollten Sie nur die kleinste Änderung an Ihre Clients senden, wenn diese Ihre Website noch einmal laden. Und die Website so zu strukturieren, dass Änderungen möglichst effizient verteilt werden, ist eine Herausforderung. Weitere Informationen dazu finden Sie unten und im Video.

Beim Caching gibt es aber noch weitere Optionen. Vielleicht möchten Sie, dass der HTTP-Cache des Browsers eines Nutzers Ihre Website lange speichert, damit für die Bereitstellung keine Netzwerkanfragen erforderlich sind. Oder Sie haben einen Service Worker erstellt, der eine Website vollständig offline bereitstellt, bevor er prüft, ob sie auf dem neuesten Stand ist. Das ist eine extreme Option, die gültig ist und für viele Offline-first-Webanwendungen verwendet wird. Das Web muss jedoch nicht nur aus dem Cache oder nur aus dem Netzwerk bestehen.

Hintergrund

Als Webentwickler sind wir alle mit dem Begriff „veralteter Cache“ vertraut. Wir kennen jedoch fast instinktiv die verfügbaren Tools, um dieses Problem zu lösen: Führen Sie eine "vollständige Aktualisierung" oder das Öffnen eines Inkognito-Fensters durch oder verwenden Sie eine Kombination der Entwicklertools Ihres Browsers, um die Daten einer Website zu löschen.

Normale Nutzer im Internet haben diesen Luxus nicht. Wir möchten, dass unsere Nutzer die zweite Ladezeit möglichst angenehm empfinden. Es ist aber auch wichtig, dass sie nicht frustriert sind oder nicht weiterkommen. (Im Video erzähle ich, wie wir die Website web.dev/live fast zum Absturz gebracht haben.)

Ein häufiger Grund für einen „veralteten Cache“ ist die Standardeinstellung für das Caching aus dem Jahr 1999. Sie basiert auf dem Last-Modified-Header:

Diagramm, das zeigt, wie lange der Browser eines Nutzers verschiedene Assets im Cache speichert
Zu unterschiedlichen Zeiten generierte Assets (grau) werden unterschiedlich lange im Cache gespeichert. Bei einer zweiten Auslieferung können also gecachte und neue Assets kombiniert werden.

Jede von Ihnen geladene Datei wird für weitere 10 % ihrer aktuellen Lebensdauer aufbewahrt, wie sie von Ihrem Browser gesehen wird. Wenn index.html beispielsweise vor einem Monat erstellt wurde, wird es noch etwa drei Tage lang von Ihrem Browser im Cache gespeichert.

Das war damals eine gute Idee, doch angesichts der eng integrierten Funktionsweise der heutigen Websites ist es möglich, dass ein Nutzer Dateien hat, die für verschiedene Releases Ihrer Website entwickelt wurden (z.B. das JS vom Dienstag-Release und das CSS vom Release am Freitag), da diese Dateien nicht genau zur gleichen Zeit aktualisiert wurden.

Gut beleuchtete Wege

Eine moderne Standardeinstellung für das Caching besteht darin, überhaupt kein Caching durchzuführen und CDNs zu verwenden, um Ihre Inhalte in der Nähe Ihrer Nutzer zu platzieren. Jedes Mal, wenn ein Nutzer Ihre Website lädt, wird geprüft, ob sie auf dem neuesten Stand ist. Diese Anfrage hat eine geringe Latenz, da sie von einem CDN bereitgestellt wird, das sich geografisch in der Nähe des jeweiligen Endnutzers befindet.

Sie können Ihren Webhost so konfigurieren, dass er auf Webanfragen mit diesem Header antwortet:

Cache-Control: max-age=0,must-revalidate,public

Das bedeutet, dass die Datei nur sehr kurz gültig ist und Sie sie im Netzwerk validieren müssen, bevor Sie sie wieder verwenden können. Andernfalls wird sie nur „vorgeschlagen“.

Dieser Validierungsprozess ist in Bezug auf die übertragenen Bytes relativ kostengünstig. Wenn sich eine große Bilddatei nicht geändert hat, erhält der Browser eine kleine 304-Antwort. Es entstehen jedoch Latenzanforderungen, da der Nutzer das Netzwerk noch aufrufen muss, um dies herauszufinden. Und das ist der Hauptnachteil dieses Ansatzes. Das kann für Nutzer mit schnellen Verbindungen in der westlichen Welt und dort, wo Ihr bevorzugtes CDN eine gute Abdeckung hat, sehr gut funktionieren, aber nicht für Nutzer mit langsameren mobilen Verbindungen oder einer schlechten Infrastruktur.

Unabhängig davon ist dies ein moderner Ansatz, der bei einem beliebten CDN, Netlify, standardmäßig verwendet wird, aber bei fast jedem CDN konfiguriert werden kann. Für Firebase Hosting können Sie diese Überschrift in den Hostingbereich Ihrer firebase.json-Datei einfügen:

"headers": [
  // Be sure to put this last, to not override other headers
  {
    "source": "**",
    "headers": [ {
      "key": "Cache-Control",
      "value": "max-age=0,must-revalidate,public"
    }
  }
]

Ich schlage dies zwar immer noch als vernünftigen Standard vor, aber es ist nur das – die Standardeinstellung! Im Folgenden erfahren Sie, wie Sie die Standardeinstellungen ändern können.

URLs mit Fingerabdruck

Wenn Sie einen Hashwert des Dateiinhalts in den Namen von Assets, Bildern usw. aufnehmen, die auf Ihrer Website bereitgestellt werden, können Sie dafür sorgen, dass diese Dateien immer einen eindeutigen Inhalt haben. Dies führt beispielsweise zu Dateien mit dem Namen sitecode.af12de.js. Wenn Ihr Server auf Anfragen für diese Dateien antwortet, können Sie die Browser der Endnutzer sicher anweisen, sie für einen langen Zeitraum im Cache zu speichern, indem Sie sie mit diesem Header konfigurieren:

Cache-Control: max-age=31536000,immutable

Dieser Wert entspricht einem Jahr in Sekunden. Gemäß der Spezifikation entspricht dies praktisch „für immer“.

Wichtig: Generieren Sie diese Hash-Werte nicht manuell. Das ist zu viel manuelle Arbeit. Sie können Tools wie Webpack oder Rollup verwenden, um Ihnen dabei zu helfen. Weitere Informationen finden Sie im Tooling Report.

Denken Sie daran, dass nicht nur JavaScript von Fingerabdruck-URLs profitieren kann. Auch Assets wie Symbole, CSS und andere unveränderliche Datendateien können so benannt werden. (Sehen Sie sich auch das Video oben an, um mehr über die Codeaufteilung zu erfahren, mit der Sie bei jeder Änderung Ihrer Website weniger Code senden können.)

Unabhängig davon, wie Sie das Caching auf Ihrer Website handhaben, sind diese Dateien mit Fingerabdrücken für jede Website, die Sie erstellen, äußerst wertvoll. Die meisten Websites ändern sich einfach nicht bei jeder Version.

Natürlich können wir unsere „nutzerfreundlichen“ Seiten nicht auf diese Weise umbenennen: Die Datei index.html in index.abcd12.html umbenennen – das ist nicht möglich. Sie können Nutzern nicht sagen, dass sie jedes Mal, wenn sie Ihre Website laden, eine neue URL aufrufen sollen. Diese „nutzerfreundlichen“ URLs können auf diese Weise nicht umbenannt und im Cache gespeichert werden. Das bringt mich zu einer möglichen Kompromisslösung.

Der Mittelweg

Beim Caching gibt es natürlich einen Mittelweg. Ich habe zwei extreme Optionen vorgestellt: Nie oder für immer im Cache speichern. Außerdem gibt es eine Reihe von Dateien, die Sie vielleicht für einen bestimmten Zeitraum im Cache speichern möchten, z. B. die oben erwähnten "nutzerfreundlichen" URLs.

Wenn Sie diese „nutzerfreundlichen“ URLs und deren HTML-Code im Cache speichern möchten, sollten Sie berücksichtigen, welche Abhängigkeiten sie enthalten, wie sie im Cache gespeichert werden können und welche Auswirkungen das vorübergehende Caching ihrer URLs auf Sie haben könnte. Sehen wir uns eine HTML-Seite mit einem solchen Bild an:

<img src="/images/foo.jpeg" loading="lazy" />

Wenn Sie Ihre Website aktualisieren oder ändern, indem Sie dieses Lazy-Load-Bild löschen oder ändern, sehen Nutzer, die eine im Cache gespeicherte Version Ihrer HTML-Seite aufrufen, möglicherweise ein falsches oder fehlendes Bild, da sie beim erneuten Aufrufen Ihrer Website immer noch die ursprüngliche /images/foo.jpeg im Cache haben.

Wenn Sie vorsichtig sind, wirkt sich das möglicherweise nicht auf Sie aus. Generell ist es jedoch wichtig zu wissen, dass Ihre Website, wenn sie von Endnutzern im Cache gespeichert wird, nicht mehr nur auf Ihren Servern vorhanden ist. Vielmehr kann sie in Teilstücken in den Caches der Browser Ihrer Endnutzer vorhanden sein.

In den meisten Anleitungen zum Caching wird diese Art der Einstellung erwähnt: Soll der Cache für eine Stunde, mehrere Stunden usw. verwendet werden? Verwenden Sie zum Einrichten dieser Art von Cache einen Header wie diesen, der die Daten für 3.600 Sekunden (eine Stunde) im Cache speichert:

Cache-Control: max-age=3600,immutable,public

Noch ein letzter Punkt. Wenn Sie aktuelle Inhalte erstellen, auf die Nutzer in der Regel nur einmal zugreifen, z. B. Nachrichtenartikel, sollten diese meiner Meinung nach niemals im Cache gespeichert werden. Verwenden Sie stattdessen die oben genannte sinnvolle Standardeinstellung. Ich denke, wir überschätzen oft den Wert des Cachings im Vergleich zum Wunsch der Nutzer, immer die neuesten und besten Inhalte zu sehen, z. B. eine wichtige Aktualisierung zu einer Nachrichtenmeldung oder einem aktuellen Ereignis.

Nicht-HTML-Optionen

Neben HTML gibt es noch weitere Optionen für Dateien, die sich in der Mitte befinden:

  • Suchen Sie generell nach Assets, die sich nicht auf andere auswirken.

    • Beispiel: Vermeiden Sie CSS, da es Änderungen an der Darstellung Ihrer HTML-Datei bewirkt.
  • Große Bilder, die in aktuellen Artikeln verwendet werden

    • Ihre Nutzer werden einen einzelnen Artikel wahrscheinlich nicht mehr als ein paar Mal aufrufen. Speichern Sie also keine Fotos oder Hero-Bilder für immer im Cache und verschwenden Sie keinen Speicherplatz.
  • Ein Asset, das etwas darstellt, das selbst eine Lebensdauer hat

    • JSON-Daten zum Wetter werden möglicherweise nur stündlich veröffentlicht. Sie können das vorherige Ergebnis also eine Stunde lang im Cache speichern, da es sich in diesem Zeitraum nicht ändern wird.
    • Builds eines Open-Source-Projekts sind möglicherweise ratenbegrenzt. Daher sollten Sie ein Bild mit dem Build-Status im Cache speichern, bis sich der Status möglicherweise ändert.

Zusammenfassung

Wenn Nutzer Ihre Website ein zweites Mal laden, haben Sie bereits ein gewisses Maß an Vertrauen gewonnen: Sie möchten wiederkommen und mehr von Ihrem Angebot sehen. An dieser Stelle geht es nicht immer nur darum, die Ladezeit zu verkürzen. Außerdem stehen Ihnen eine Reihe von Optionen zur Verfügung, mit denen Sie dafür sorgen können, dass Ihr Browser nur die Arbeit erledigt, die er für eine schnelle und aktuelle Leistung benötigt.

Caching ist kein neues Konzept im Web, aber vielleicht braucht es eine sinnvolle Standardeinstellung. Sie sollten sie verwenden und bei Bedarf unbedingt bessere Caching-Strategien aktivieren. Vielen Dank, dass Sie sich die Zeit zum Lesen dieser E-Mail genommen haben.

Weitere Informationen

Einen allgemeinen Leitfaden zum HTTP-Cache finden Sie unter Unnötige Netzwerkanfragen mit dem HTTP-Cache verhindern.