Hier sehen Sie, welche Navigationen die Verwendung des bfcaches blockiert haben und warum.
Die Property notRestoredReasons
, die der Klasse PerformanceNavigationTiming
hinzugefügt wurde, enthält Informationen dazu, ob Frames im Dokument bei der Navigation die Verwendung des bfcache blockiert wurden und warum. Anhand dieser Informationen können Entwickler Seiten identifizieren, die aktualisiert werden müssen, damit sie bfcache-kompatibel sind. So lässt sich die Websiteleistung verbessern.
Aktueller Status
Die notRestoredReasons
API ist seit Chrome 123 verfügbar und wird schrittweise eingeführt.
Konzepte und Verwendung
Moderne Browser bieten eine Optimierungsfunktion für die Navigation im Browserverlauf, den Back-Forward-Cache (bfcache). So wird ein sofortiges Laden ermöglicht, wenn Nutzer zu einer Seite zurückkehren, die sie bereits besucht haben. Seiten können aus verschiedenen Gründen daran gehindert werden, in den bfcache aufgenommen zu werden, oder sie werden aus dem bfcache entfernt. Einige dieser Gründe sind durch eine Spezifikation vorgeschrieben, andere sind spezifisch für Browserimplementierungen.
Bisher gab es keine Möglichkeit für Entwickler, herauszufinden, warum die Verwendung des bfcache auf ihren Seiten blockiert wurde. Es gab jedoch einen Test in den Chrome-Entwicklertools. Um das Monitoring vor Ort zu ermöglichen, wurde die Klasse PerformanceNavigationTiming
um eine notRestoredReasons
-Property erweitert. Dies gibt ein Objekt mit zugehörigen Informationen zum oberen Frame und allen Iframes im Dokument zurück:
- Gründe, warum die Nutzung des bfcache für den Nutzer blockiert wurde.
Details wie Frame
id
undname
, die helfen, Iframes in der HTML-Datei zu identifizieren.So können Entwickler Maßnahmen ergreifen, um diese Seiten bfcache-kompatibel zu machen und so die Websiteleistung zu verbessern.
Beispiele
Eine PerformanceNavigationTiming
-Instanz kann über Features wie Performance.getEntriesByType()
und PerformanceObserver
abgerufen werden.
Sie können beispielsweise die folgende Funktion aufrufen, um alle PerformanceNavigationTiming
-Objekte im Leistungszeitplan zurückzugeben und ihre notRestoredReasons
zu protokollieren:
function returnNRR() {
const navEntries = performance.getEntriesByType("navigation");
for (let i = 0; i < navEntries.length; i++) {
console.log(`Navigation entry ${i}`);
let navEntry = navEntries[i];
console.log(navEntry.notRestoredReasons);
}
}
Bei Navigationen im Browserverlauf gibt die PerformanceNavigationTiming.notRestoredReasons
-Eigenschaft ein Objekt mit der folgenden Struktur zurück, das den blockierten Status des Top-Level-Frames darstellt:
{
children: [],
id: null,
name: null,
reasons: [
{"reason", "unload-listener"}
],
src: null,
url: "https://www.example.com/page/"
}
Die Properties sind:
children
- Ein Array von Objekten, das den blockierten Status aller Frames desselben Ursprungs darstellt, die im Frame der obersten Ebene eingebettet sind. Jedes Objekt hat dieselbe Struktur wie das übergeordnete Objekt. So kann innerhalb des Objekts rekursiv eine beliebige Anzahl von Ebenen eingebetteter Frames dargestellt werden. Wenn der Frame keine untergeordneten Elemente hat, ist das Array leer.
id
- Ein String, der den
id
-Attributwert des Frames darstellt (z. B.<iframe id="foo" src="...">
). Wenn der Frame keinid
hat, ist der Wertnull
. Für die Seite der obersten Ebene ist dasnull
. name
- Ein String, der den
name
-Attributwert des Frames darstellt (z. B.<iframe name="bar" src="...">
). Wenn der Frame keinname
hat, ist der Wert ein leerer String. Für die Seite der obersten Ebene ist dasnull
. reasons
- Ein Array von Strings, die jeweils einen Grund darstellen, warum die Seite, auf die Sie geleitet wurden, von der Verwendung des bfcache ausgeschlossen wurde. Es gibt viele verschiedene Gründe, warum eine Blockierung erfolgen kann. Weitere Informationen finden Sie im Abschnitt Gründe für die Blockierung.
src
- Ein String, der den Pfad zur Quelle des Frames darstellt (z. B.
<iframe src="b.html">
). Wenn der Frame keinesrc
hat, ist der Wert ein leerer String. Für die Seite der obersten Ebene ist dasnull
. url
- Ein String, der die URL der Seite bzw. des Iframes darstellt, zu der bzw. dem die Navigation erfolgt.
Für PerformanceNavigationTiming
-Objekte, die keine Navigationen im Verlauf darstellen, gibt die Eigenschaft notRestoredReasons
null
zurück.
Hinweis: notRestoredReasons
gibt auch null
zurück, wenn es keine Gründe für eine Blockierung gibt. null
ist also kein Indikator dafür, ob der bfcache verwendet wurde oder nicht. Dazu müssen Sie die Property event.persisted
verwenden.
Blockierung von bfcache in Frames mit gleichem Ursprung melden
Wenn auf einer Seite Frames mit demselben Ursprung eingebettet sind, enthält der zurückgegebene notRestoredReasons
-Wert ein Objekt in der children
-Eigenschaft, das den blockierten Status jedes eingebetteten Frames darstellt.
Beispiel:
{
children: [
{
children: [],
id: "iframe-id",
name: "iframe-name",
reasons: [],
src: "./index.html",
url: "https://www.example.com/"
},
{
children: [],
id: "iframe-id2",
name: "iframe-name2",
reasons: [
{"reason": "unload-listener"}
],
src: "./unload-examples.html",
url: "https://www.example.com/unload-examples.html"
},
],
id: null,
name: null,
reasons: [],
src: null,
url:"https://www.example.com"
}
Blockierung von bfcache in Cross-Origin-Frames melden
Wenn auf einer Seite seitenübergreifende Frames eingebettet sind, beschränken wir die Menge der freigegebenen Informationen, um Datenlecks zu vermeiden. Wir geben nur Informationen an, die der äußeren Seite bereits bekannt sind, und ob der plattformübergreifende untergeordnete Knoten den bfcache blockiert hat oder nicht. Wir geben keine Gründe für die Blockierung oder Informationen zu niedrigeren Ebenen des untergeordneten Knotens an, auch wenn einige untergeordnete Ebenen demselben Ursprung unterliegen.
Beispiel:
{
children: [
{
children: [],
id: "iframe-id",
name: "iframe-name",
reasons: [],
src: "./index.html",
url: "https://www.example2.com/"
}
],
id: null,
name: null,
reasons: [
{"reason": "masked"}
],
src: null,
url:"https://www.example.com"
}
Für alle iframes mit unterschiedlichen Ursprüngen wird null
als Wert für reasons
für den Frame angegeben. Der Frame auf oberster Ebene hat den Grund "masked"
. Hinweis: "masked"
kann auch aus nutzeragentenspezifischen Gründen verwendet werden und weist nicht immer auf ein Problem in einem Iframe hin.
Weitere Informationen zu den Sicherheits- und Datenschutzaspekten finden Sie im Abschnitt Sicherheit und Datenschutz.
Gründe für die Blockierung
Wie bereits erwähnt, kann es viele verschiedene Gründe für eine Blockierung geben:
Im Folgenden finden Sie einige der häufigsten Gründe, warum der bfcache nicht verwendet werden kann:
unload-listener
: Die Seite registriert einenunload
-Handler, der die Verwendung des BFCache in bestimmten Browsern verhindert. Weitere Informationen finden Sie unter Einstellung des Ereignisses „unload“.response-cache-control-no-store
: Auf der Seite wirdno-store
alscache-control
-Wert verwendet.related-active-contents
: Die Seite wurde über eine andere Seite geöffnet (entweder über den Tab „Duplizieren“), die noch einen Verweis auf diese Seite enthält.
Feedback
Das Chromium-Team möchte mehr über Ihre Erfahrungen mit der bfcache notRestoredReasons
API erfahren.
Informationen zum API-Design
Funktioniert die API nicht wie erwartet? Oder fehlen Methoden oder Eigenschaften, die Sie zur Implementierung Ihrer Idee benötigen? Haben Sie Fragen oder Kommentare zum Sicherheitsmodell? Reichen Sie ein Problem mit der Spezifikation im entsprechenden GitHub-Repository ein oder fügen Sie Ihre Gedanken zu einem vorhandenen Problem hinzu.
Problem mit der Implementierung melden
Haben Sie einen Fehler in der Chromium-Implementierung gefunden? Oder unterscheidet sich die Implementierung von der Spezifikation?
Melden Sie den Fehler in unserem Issue Tracker. Geben Sie dabei so viele Details wie möglich an, machen Sie eine einfache Anleitung zur Reproduktion und geben Sie die Komponente als UI > Browser > Navigation > BFCache
an.
Glitch eignet sich hervorragend, um schnell und einfach Reproduktionen zu teilen.
Unterstützung für die API anzeigen
Beabsichtigen Sie, die bfcache notRestoredReasons
API zu verwenden? Ihre öffentliche Unterstützung hilft dem Chromium-Team, Funktionen zu priorisieren, und zeigt anderen Browseranbietern, wie wichtig es ist, sie zu unterstützen.
Senden Sie einen Tweet an @ChromiumDev mit dem Hashtag #NotRestoredReasons
und teilen Sie uns mit, wo und wie Sie ihn verwenden.