Back/Forward Cache (bfcache) optimieren
AI generated
60fps
ms
Web Performance / Browser APIs
Back/Forward Cache (bfcache) optimieren
Warum Zurück-Navigation manchmal instant ist und manchmal nicht

Der Back/Forward Cache hält komplette Seitenzustände im Speicher, sodass eine Zurück- oder Vorwärts-Navigation ohne erneutes Laden auskommt. Dieser Artikel zeigt, welche häufigen Blocker den bfcache verhindern, wie das Chrome DevTools Test-Tool beim Aufspüren hilft, und wie groß der messbare Performance-Gewinn tatsächlich ausfällt.

14 Min. Lesezeit Back/Forward Cache Navigation Performance

1. Was ist der Back/Forward Cache

Der Back/Forward Cache, kurz bfcache, ist eine Browser-Optimierung, die eine komplette Seite samt JavaScript-Heap, DOM-Baum, Scroll-Position und laufenden Timern im Arbeitsspeicher einfriert, statt sie beim Verlassen vollständig zu zerstören. Navigiert der Nutzer anschliessend per Zurück- oder Vorwärts-Button, wird die eingefrorene Seite einfach wieder aktiviert, ganz ohne erneuten Netzwerk-Request, ohne erneutes Parsen des HTML und ohne erneute Ausführung von Skripten.

Diese Technik unterscheidet sich fundamental vom regulären HTTP-Cache, der lediglich einzelne Ressourcen wie Bilder oder Stylesheets zwischenspeichert, aber keinen laufenden JavaScript-Zustand erhält. Der bfcache hingegen bewahrt den kompletten Ausführungszustand der Seite, weshalb beispielsweise ein halb ausgefülltes Formular oder eine geöffnete Dropdown-Auswahl bei Rückkehr exakt so erscheint, wie sie beim Verlassen zurückgelassen wurde. Für Nutzer, die häufig zwischen einer Produktliste und mehreren Detailseiten hin- und herwechseln, summiert sich dieser Effekt über eine ganze Sitzung hinweg zu einer spürbar flüssigeren Nutzung des gesamten Onlineshops.

2. Funktionsweise: pageshow und pagehide statt unload

Damit eine Seite sauber in den bfcache aufgenommen werden kann, muss sie über die Events pagehide und pageshow mit dem Zustandswechsel umgehen, statt sich auf die älteren Events unload oder beforeunload zu verlassen. Beim Verlassen der Seite feuert pagehide, und das Attribut event.persisted zeigt an, ob die Seite tatsächlich eingefroren statt zerstört wurde.

Kehrt der Nutzer zur Seite zurück, feuert pageshow erneut, und auch hier signalisiert event.persisted === true, dass es sich um eine Wiederherstellung aus dem bfcache handelt und nicht um einen frischen Seitenaufbau. Anwendungen, die auf diesen Zustand reagieren müssen, etwa um Live-Daten wie Lagerbestände zu aktualisieren, sollten genau an dieser Stelle einen gezielten Refresh auslösen.

3. Code-Beispiel: Korrektes Event-Handling für bfcache-Kompatibilität

Der häufigste Fehler, der den bfcache blockiert, ist die Verwendung eines unload-Event-Listeners, selbst wenn dieser inhaltlich leer ist oder nur für veraltete Analytics-Zwecke registriert wurde. Chrome behandelt jeden registrierten unload-Listener als potenziellen Blocker und verweigert dann den bfcache für die betroffene Seite komplett.

Die saubere Alternative ist, jegliche Aufräumlogik an pagehide zu binden und dabei zwischen einer echten Zerstörung und einem Einfrieren für den bfcache zu unterscheiden, wie im folgenden Beispiel gezeigt.


// Falsch: blockiert den bfcache in Chrome zuverlaessig
window.addEventListener('unload', () => {
  navigator.sendBeacon('/analytics/leave', payload);
});

// Richtig: bfcache-kompatibel über pagehide
window.addEventListener('pagehide', (event) => {
  if (!event.persisted) {
    // Seite wird wirklich zerstört, nicht nur eingefroren
    navigator.sendBeacon('/analytics/leave', payload);
  }
});

// Bei Wiederherstellung aus dem bfcache reagieren
window.addEventListener('pageshow', (event) => {
  if (event.persisted) {
    aktualisiereLagerbestand();
  }
});

4. Häufige bfcache-Blocker im Überblick

Neben dem unload-Listener zählen offene WebSocket-, WebRTC- oder EventSource-Verbindungen zu den häufigsten Blockern, da der Browser eine eingefrorene Seite mit aktiver Netzwerkverbindung nicht sicher zwischenspeichern kann. Ebenso verhindert der Response-Header Cache-Control: no-store auf dem Hauptdokument grundsätzlich jede bfcache-Nutzung für diese Seite, unabhängig vom sonstigen JavaScript-Verhalten.

Weitere häufige Ursachen sind offene IndexedDB-Transaktionen zum Zeitpunkt des Verlassens, aktive Anfragen für Benachrichtigungsberechtigungen oder Mikrofon- und Kamerazugriff, sowie bestimmte, vom Browser als nicht sicher freigebbar eingestufte Plugin-Instanzen. Jeder dieser Faktoren kann für sich allein bereits ausreichen, um die gesamte Seite von der bfcache-Nutzung auszuschliessen.

5. Chrome DevTools bfcache-Test-Tool nutzen

Chrome bietet im Reiter Application unter dem Abschnitt Back/forward cache ein dediziertes Testwerkzeug, das per Knopfdruck simuliert, ob die aktuell geöffnete Seite für den bfcache infrage kommt. Nach dem Test listet das Tool alle konkreten Blockierungsgründe einzeln auf, unterteilt in Kategorien wie unterstützt, in der Erprobung befindlich oder derzeit nicht unterstützt.

Dieses Werkzeug ist deutlich zuverlässiger als manuelles Ausprobieren per Zurück-Button, da es auch subtile Blocker wie eine im Hintergrund aktive Push-Verbindung oder eine ausstehende Berechtigungsanfrage aufdeckt, die im normalen Testablauf leicht übersehen werden. Es empfiehlt sich, diesen Test routinemäßig für jeden neuen Seitentyp nach größeren Frontend-Änderungen erneut durchzuführen.

6. Messbarer Performance-Gewinn bei erfolgreicher Nutzung

Wird eine Seite erfolgreich aus dem bfcache wiederhergestellt, liegt die Zeit bis zur Interaktionsfähigkeit typischerweise im niedrigen zweistelligen Millisekundenbereich, während ein vollständiger Neuaufbau derselben Seite je nach Komplexität mehrere hundert Millisekunden bis wenige Sekunden dauern kann. Dieser Unterschied fällt besonders bei mobilen Verbindungen mit hoher Latenz oder eingeschränkter Bandbreite deutlich stärker ins Gewicht als auf dem Desktop mit schneller Standleitung.

Chrome hat in eigenen Untersuchungen über alle Navigationsvorgänge hinweg gezeigt, dass ein erheblicher Anteil aller Zurück- und Vorwärts-Navigationen historisch am bfcache vorbeilief, obwohl genau diese Navigationsmuster besonders häufig vorkommen. Jede zusätzliche Seite, die bfcache-fähig gemacht wird, reduziert somit nicht nur die individuelle Ladezeit, sondern auch die Serverlast, da keine erneute Anfrage an den Server gestellt werden muss.

7. Zusammenspiel mit anderen Browser-APIs

Manche Browser-APIs erfordern besondere Sorgfalt im Zusammenspiel mit dem bfcache: Eine laufende IndexedDB-Transaktion muss vor dem Verlassen der Seite abgeschlossen sein, da offene Transaktionen den bfcache blockieren können, und ausstehende Fetch-Anfragen sollten idealerweise beendet oder zumindest sauber abbrechbar sein. Auch der Media-Session-API-Zustand und aktive WebLocks können je nach Browser-Version Einfluss auf die bfcache-Fähigkeit haben.

Für Formulare mit automatischem Zwischenspeichern empfiehlt es sich, den Speichervorgang an pagehide statt an beforeunload zu binden, da beforeunload-Listener in neueren Chrome-Versionen zwar nicht mehr grundsätzlich blockieren, aber weiterhin als Risikofaktor gelten und die bfcache-Wiederherstellung in manchen Fällen verzögern können. Eine konsequente Umstellung auf die moderneren Lifecycle-Events zahlt sich hier langfristig aus.

8. Best Practices für klassische Multi-Page-Anwendungen

Für klassische, serverseitig gerenderte Mehrseiten-Websites, wie sie im E-Commerce-Umfeld üblich sind, lohnt sich eine systematische Bestandsaufnahme aller eingebundenen Drittanbieter-Skripte, da Tracking- und Chat-Widgets häufig unbemerkt unload-Listener oder dauerhafte WebSocket-Verbindungen registrieren. Eine zentrale Übersicht, welches Skript welchen bfcache-Blocker verursacht, erleichtert die gezielte Behebung erheblich.

Zusätzlich sollte jede Seite, deren Inhalt sich bei Rückkehr verändert haben könnte, etwa ein Warenkorb mit aktuellem Preis oder Lagerbestand, über den pageshow-Handler gezielt die betroffenen Bereiche aktualisieren, statt die gesamte Seite neu zu laden. So bleibt der Geschwindigkeitsvorteil des bfcache erhalten, während die Aktualität der angezeigten Daten trotzdem gewährleistet ist. Ein sinnvoller zusätzlicher Schritt ist, sämtliche eingebundenen Drittanbieter-Skripte regelmäßig neu zu prüfen, da deren Anbieter gelegentlich neue Funktionen wie Push-Benachrichtigungen ergänzen, die unbemerkt neue bfcache-Blocker einführen können.

9. Zusammenfassung

Der Back/Forward Cache gehört zu den wirkungsvollsten, gleichzeitig aber am häufigsten unbeabsichtigt blockierten Performance-Optimierungen moderner Browser, da bereits ein einzelner vergessener unload-Listener oder eine offene WebSocket-Verbindung den gesamten Effekt zunichtemachen kann. Eine regelmäßige Prüfung mit dem Chrome DevTools bfcache-Test-Tool sollte deshalb fester Bestandteil jedes Performance-Reviews sein, insbesondere nach der Einbindung neuer Drittanbieter-Skripte oder größerer Änderungen an der Checkout-Strecke.

Wer die häufigsten Blocker konsequent vermeidet und Lifecycle-Events wie pagehide und pageshow korrekt einsetzt, erhält im Gegenzug eine spürbar schnellere Navigation für alle Nutzer, die im Verlauf ihrer Sitzung zwischen Seiten hin- und herwechseln, was gerade im Bereich Kategorie- und Produktseiten im Onlinehandel ein häufiges Navigationsmuster darstellt.

Blocker Ursache Lösung
unload-Event-Listener Chrome verweigert bfcache bei jedem registrierten Listener Auf pagehide mit event.persisted-Prüfung umstellen
Cache-Control: no-store Header schließt bfcache für die Seite grundsätzlich aus Header entfernen oder auf no-cache/max-age umstellen
Offene WebSocket-Verbindung Aktive Verbindung kann nicht sicher eingefroren werden Verbindung in pagehide sauber schließen
Offene IndexedDB-Transaktion Laufende Transaktion blockiert das Einfrieren der Seite Transaktion vor dem Verlassen abschliessen

Mironsoft

Web Performance, Core Web Vitals und Ladezeit-Optimierung

Ladezeiten, die Nutzer nicht abspringen lassen, bevor die Seite überhaupt sichtbar ist?

Wir prüfen bestehende Webseiten auf langsame Core Web Vitals, aufgeblähte JavaScript-Bundles und ungenutzte Render-Blocker und bauen daraus eine Performance-Grundlage, die messbar bleibt statt nur einmalig gut auszusehen.

Performance-Audit

Core Web Vitals, Ladewasserfall und Render-Blocker systematisch messen und beheben.

Bundle-Optimierung

JavaScript- und CSS-Bundle-Größe sowie Code-Splitting gezielt reduzieren.

Monitoring-Aufbau

Kontinuierliches Performance-Monitoring statt einmaliger Momentaufnahme etablieren.

10. Zusammenfassung

Back/Forward Cache

Technik

Kompletter Seitenzustand im Speicher eingefroren

Häufigster Blocker

unload-Event-Listener und offene WebSockets

Test-Tool

Chrome DevTools Application-Tab, bfcache-Sektion

Gewinn

Wiederherstellung im niedrigen Millisekundenbereich

11. FAQ: Back/Forward Cache

1Was genau speichert der Back/Forward Cache?
Der bfcache friert die komplette Seite im Arbeitsspeicher ein, einschliesslich JavaScript-Heap, DOM-Baum, Scroll-Position und laufender Timer, statt sie beim Verlassen zu zerstören.
2Warum blockiert ein unload-Event-Listener den bfcache?
Chrome behandelt jeden registrierten unload-Listener als potenziellen Blocker, da nicht garantiert werden kann, dass die darin enthaltene Logik bei einer späteren Wiederherstellung korrekt nachgeholt wird.
3Welches Event sollte ich statt unload verwenden?
Das Event pagehide in Kombination mit der Prüfung von event.persisted ist die bfcache-kompatible Alternative, um zwischen echter Zerstörung und Einfrieren der Seite zu unterscheiden.
4Wie teste ich, ob meine Seite bfcache-fähig ist?
In den Chrome DevTools unter dem Reiter Application findet sich die Sektion Back/forward cache mit einem Testknopf, der alle konkreten Blockierungsgründe auflistet.
5Blockiert Cache-Control no-store den bfcache immer?
Ja, dieser Header schließt die bfcache-Nutzung für die betroffene Seite grundsätzlich aus, unabhängig vom sonstigen JavaScript-Verhalten der Seite.
6Wie erkenne ich im Code, ob eine Seite aus dem bfcache wiederhergestellt wurde?
Im pageshow-Event zeigt das Attribut event.persisted mit dem Wert true an, dass es sich um eine Wiederherstellung aus dem bfcache handelt und nicht um einen frischen Seitenaufbau.
7Verhindern offene WebSocket-Verbindungen den bfcache immer?
In den meisten Fällen ja, da eine aktive Netzwerkverbindung während des Einfrierens nicht sicher gehalten werden kann. Die Verbindung sollte vor dem Verlassen der Seite geschlossen werden.
8Wie groß ist der messbare Geschwindigkeitsgewinn durch bfcache?
Eine erfolgreiche Wiederherstellung liegt typischerweise im niedrigen zweistelligen Millisekundenbereich, während ein vollständiger Neuaufbau derselben Seite mehrere hundert Millisekunden bis wenige Sekunden dauern kann.
9Sollte ich beforeunload weiterhin verwenden?
Beforeunload-Listener gelten weiterhin als Risikofaktor für den bfcache und sollten nach Möglichkeit durch pagehide ersetzt werden, auch wenn sie in neueren Chrome-Versionen nicht mehr zwingend blockieren.
10Wie aktualisiere ich veraltete Daten nach einer bfcache-Wiederherstellung?
Im pageshow-Handler kann bei event.persisted gleich true gezielt ein Refresh der betroffenen Datenbereiche, etwa Lagerbestand oder Preise, ausgelöst werden, ohne die gesamte Seite neu zu laden.