Finden Sie heraus, welche Navigationen den bfcache nicht verwenden konnten und warum.
Die notRestoredReasons
-Property, die der Klasse PerformanceNavigationTiming
hinzugefügt wurde, gibt Informationen darüber an, ob im Dokument vorhandene Frames bei der Navigation blockiert wurden und warum der bfcache blockiert wurde. Anhand dieser Informationen können Entwickler Seiten identifizieren, die aktualisiert werden müssen, um sie bfcache-kompatibel zu machen, wodurch die Websiteleistung verbessert wird.
Aktueller Status
Step | Status |
---|---|
1. Erklärende Erklärung erstellen | Abschließen |
2. Ersten Entwurf der Spezifikation erstellen | Nicht gestartet |
3. Feedback einholen und Design iterieren | In Bearbeitung |
4. Ursprungstest | Gestartet |
5. Launch | Nicht gestartet |
bfcache notRestoredReasons
API testen
Ab Version 109 ist die bfcache notRestoredReasons
API als Ursprungstest in Chromium verfügbar. Aktualisierte Informationen zum Veröffentlichungszeitplan für diese Funktion finden Sie auf der entsprechenden Funktionsseite von ChromeStatus.com. Die Veröffentlichungsdaten der einzelnen Versionen finden Sie in der Chrome-Roadmap.
Sie können die bfcache notRestoredReasons
API testen, indem Sie sich für den Ursprungstest registrieren und die API in Ihren Tests verwenden. Eine Anleitung zur Verwendung Ihres Tokens nach der Registrierung finden Sie unter An einem Ursprungstest teilnehmen.
Konzepte und Nutzung
Moderne Browser bieten eine Optimierungsfunktion für die Verlaufsnavigation, den Back-Forward-Cache (bfcache). Dadurch wird der Ladevorgang sofort durchgeführt, wenn Nutzende zu einer Seite zurückkehren, die sie bereits besucht haben. Es kann vorkommen, dass Seiten aus verschiedenen Gründen nicht in den bfcache gelangen oder gelöscht werden. Einige davon sind aufgrund einer Spezifikation erforderlich, andere sind jedoch spezifisch für die Browserimplementierungen.
Bisher gab es für Entwickler keine Möglichkeit, herauszufinden, warum der bfcache vor Ort für ihre Seiten blockiert wurde. Allerdings gab es einen Test in den Chrome-Entwicklertools. Die Klasse PerformanceNavigationTiming
wurde um eine notRestoredReasons
-Property erweitert, um das Monitoring im Außendienst zu ermöglichen. Dadurch wird ein Objekt zurückgegeben, das zugehörige Informationen zu allen im Dokument vorhandenen Frames enthält:
- Details wie Frame
id
undname
zur Identifizierung im HTML-Code. - Ob sie daran gehindert wurden, den bfcache zu verwenden.
Gründe, warum sie den bfcache nicht verwenden konnten.
Dadurch können Entwickler Maßnahmen ergreifen, um diese Seiten bfcache-kompatibel zu machen, und so die Websiteleistung verbessern.
Beispiele
Eine PerformanceNavigationTiming
-Instanz kann aus Features wie Performance.getEntriesByType()
und PerformanceObserver
abgerufen werden.
Sie können beispielsweise die folgende Funktion aufrufen, um alle PerformanceNavigationTiming
-Objekte zurückzugeben, die derzeit in der Leistungszeitachse vorhanden sind, 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);
}
}
Für die Navigation im Verlauf gibt die Eigenschaft PerformanceNavigationTiming.notRestoredReasons
ein Objekt mit der folgenden Struktur zurück, die den Sperrstatus des Frames auf oberster Ebene darstellt:
{
blocked: true,
children: [],
id: "",
name: "",
reasons: [ "Internal Error", "Unload handler" ],
src: "",
url: "a.com"
}
Folgende Eigenschaften sind verfügbar:
blocked
- Ein boolescher Wert, der angibt, ob die aufgerufene Seite den bfcache nicht verwenden kann (
true
) oder nicht (false
). children
- Ein Array mit Objekten, die den Blockierungsstatus aller Frames darstellen, die im Frame auf oberster Ebene eingebettet sind. Jedes Objekt hat die gleiche Struktur wie das übergeordnete Objekt. Auf diese Weise kann eine beliebige Anzahl von Ebenen eingebetteter Frames innerhalb des Objekts rekursiv 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 Wert ein leerer String. 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. reasons
- Ein Array mit Strings, die jeweils einen Grund darstellen, warum die aufgerufene Seite den bfcache nicht verwenden konnte. Dafür gibt es viele verschiedene Gründe. Weitere Informationen finden Sie unten im Abschnitt Gründe für die Blockierung.
src
- Ein String, der den Pfad zur Frame-Quelle darstellt (z. B.
<iframe src="b.html">
). Wenn der Frame keinesrc
hat, ist der Wert ein leerer String. url
- Ein String, der die URL der aufgerufenen Seite darstellt.
Für PerformanceNavigationTiming
-Objekte, die keine Verlaufsnavigationen darstellen, gibt das Attribut notRestoredReasons
den Wert null
zurück. Dies ist nützlich, um festzustellen, ob der bfcache für eine bestimmte Navigation relevant ist und ob notRestoredReasons
nicht unterstützt wird. In diesem Fall würde undefined
zurückgegeben.
Bf-Cache-Blockierung in Frames desselben Ursprungs melden
Wenn auf einer Seite Frames desselben Ursprungs eingebettet sind, enthält der zurückgegebene notRestoredReasons
-Wert ein Objekt innerhalb der children
-Eigenschaft, das den Blockierungsstatus jedes eingebetteten Frames darstellt.
Beispiel:
{
blocked: false,
children: [
{ url: "a.com", src: "b.a.com", id: "b", name: "b", blocked: false, reasons: [], children: [] },
{ url: "a.com", src: "c.a.com", id: "c", name: "c", blocked: true, reasons: [ "BroadcastChannel" ], children: [] },
{ url: "a.com", src: "d.a.com", id: "d", name: "d", blocked: false, reasons: [], children: [] }
],
id: "",
name: "",
reasons: [],
src: "",
url:"a.com"
}
Berichterstellung zu bfcache-Blockierungen in ursprungsübergreifenden Frames
Wenn auf einer Seite ursprungsübergreifende Frames eingebettet sind, begrenzen wir die Menge an Informationen, die über sie weitergegeben werden, um die Offenlegung ursprungsübergreifender Informationen zu vermeiden. Wir fügen nur Informationen hinzu, die der äußeren Seite bereits bekannt sind, und ob die ursprungsübergreifende Unterstruktur den bfcache blockiert hat oder nicht. Wir fügen keine Blockierungsgründe oder Informationen zu niedrigeren Ebenen der Unterstruktur hinzu, selbst wenn einige Unterebenen denselben Ursprung haben.
Beispiel:
{
blocked: false,
children: [
{ url: "a.com", src: "c.a.com", id: "c", name: "c", blocked: true, reasons: [ "ScreenReader" ], children: [] },
/* cross-origin frame */
{ url: "", src: "b.com", id: "d", name: "d", blocked: true, reasons: [], children: [] }
],
id: "",
name: "",
reasons: [],
src: "",
url:"a.com"
}
Wenn mehrere ursprungsübergreifende Frames blockierende Gründe haben, wählen wir nach dem Zufallsprinzip einen ursprungsübergreifenden iFrame aus und geben an, ob bfcache blockiert wurde oder nicht. Für die restlichen Frames wird null
als blocked
-Wert gemeldet. Damit soll verhindert werden, dass böswillige Akteure auf Websites, auf die sie keine Kontrolle haben, Informationen zum Nutzerstatus ableiten, indem sie mehrere Frames von Drittanbietern in eine Seite einbetten und dann die Blockierungsinformationen von jedem einzelnen vergleichen.
{
blocked: false,
children: [
/* cross-origin frames */
{url: "", src: "b.com", id: "b", name: "b", blocked: null, reasons: [], children: []},
{url: "", src: "c.com", id: "c", name: "c", blocked: true, reasons: [], children: []},
{url: "", src: "d.com", id: "d", name: "d", blocked: null, reasons: [], children: []}
]
id: "",
name: "",
reasons: [],
src: "",
url:"a.com"
}
Weitere Informationen zu Sicherheits- und Datenschutzaspekten finden Sie in der Erläuterung im Abschnitt Sicherheit und Datenschutz.
Gründe für die Blockierung
Wie bereits erwähnt, gibt es viele verschiedene Gründe für eine Blockierung. Wir haben eine praktische Tabelle zusammengestellt, in der alle Zeichenfolgen für die Gründe und deren Bedeutung aufgeführt sind.
Es gibt einige Hauptkategorien, die erwähnenswert sind:
Circumstantial
: Bezieht sich auf Blockierungen, die nicht direkt mit dem Seitencode des Entwicklers zusammenhängen. Zum Beispiel ist eine zugehörige Komponente abgestürzt, ein Fehler beim Laden ist aufgetreten, die Seite befindet sich in einem temporären Status, der nicht im Cache gespeichert werden kann, der bfcache wurde aufgrund von unzureichendem Arbeitsspeicher deaktiviert oder ein Service Worker hat eine Aktion für die Seite vorgenommen, wodurch sie nicht im Cache gespeichert werden kann.Extensions
: Es gibt verschiedene Gründe für Meldungen im Zusammenhang mit Erweiterungen. Im Allgemeinen führen wir unter dem Grund „Erweiterungen“ einige unterschiedliche Gründe zusammen. Wir machen uns bewusst, welche Gründe es für das Blockieren von Erweiterungen gibt, da wir nicht allzu viele Informationen darüber preisgeben möchten, welche Erweiterungen der Nutzer installiert hat, welche auf der Seite aktiv sind, was er gerade tut usw.PageSupportNeeded
: Der Code des Entwicklers verwendet eine Webplattformfunktion, die ansonsten nicht durch den bfcache blockiert wird. Der Code befindet sich jedoch derzeit in einem bfcache-Blockierung. Beispielsweise hat die Seite derzeit einen BroadcastChannel mit registrierten Listenern oder eine offene IndexedDB-Verbindung. Oder die Seite hat einenunload
-Handler registriert, der derzeit in einigen Browsern verhindert, dass der bfcache verwendet wird.SupportPending
: Im Code des Entwicklers wird eine Webplattformfunktion verwendet, durch die die Seite vom bfcache ausgeschlossen wird, z. B. die Web Serial API, die Web Authentication API, die File System Access API oder die Media Session API. Oder die Seite verwendetCache-Control: no-store
, wodurch derzeit in einigen Browsern der bfcache nicht verwendet wird. In dieser Kategorie wird auch gemeldet, dass außerhalb der Seite ein Tool vorhanden ist, das den bfcache blockiert, z. B. ein Screenreader oder der Passwortmanager von Chrome.
Feedback
Das Chromium-Team möchte mehr über Ihre Erfahrungen mit der notRestoredReasons
API des bfcache erfahren.
Informationen zum API-Design
Gibt es etwas an der API, das nicht so funktioniert, wie Sie erwartet haben? Oder fehlen Methoden oder Eigenschaften, um Ihre Idee zu implementieren? Haben Sie eine Frage oder einen Kommentar zum Sicherheitsmodell? Melden Sie ein Spezifikationsproblem im entsprechenden [GitHub-Repository][Feedback] oder fügen Sie Ihre Gedanken zu einem vorhandenen Problem hinzu.
Problem mit der Implementierung melden
Haben Sie einen Fehler bei der Implementierung von Chromium gefunden? Oder unterscheidet sich die Implementierung von der Spezifikation?
Melden Sie einen Fehler unter new.crbug.com. Geben Sie so viele Details wie möglich, eine einfache Anleitung zum Reproduzieren an und legen Sie die Komponente als UI > Browser > Navigation > bfcache
fest.
Glitch eignet sich perfekt, um schnelle und einfache Reproduzierungen zu teilen.
Unterstützung für die API zeigen
Möchten Sie die notRestoredReasons
API von bfcache verwenden? Ihre öffentliche Unterstützung hilft dem Chromium-Team, Funktionen zu priorisieren und anderen Browseranbietern zu zeigen, wie wichtig es ist, sie zu unterstützen.
Senden Sie einen Tweet mit dem Hashtag #NotRestoredReasons
an @ChromiumDev und teilen Sie uns mit, wo und wie Sie den Dienst verwenden.