Ontdek welke navigaties zijn geblokkeerd voor het gebruik van de bfcache, en waarom.
De eigenschap notRestoredReasons
, toegevoegd aan de klasse PerformanceNavigationTiming
, rapporteert informatie over de vraag of frames in het document zijn geblokkeerd voor het gebruik van de bfcache bij navigatie, en waarom. Ontwikkelaars kunnen deze informatie gebruiken om pagina's te identificeren die updates nodig hebben om ze bfcache-compatibel te maken, waardoor de prestaties van de site worden verbeterd.
Huidige status
De notRestoredReasons
API is afkomstig uit Chrome 123 en wordt geleidelijk uitgerold.
Concepten en gebruik
Moderne browsers bieden een optimalisatiefunctie voor geschiedenisnavigatie, de back/forward cache (bfcache). Dit maakt een onmiddellijke laadervaring mogelijk wanneer gebruikers terugkeren naar een pagina die ze al hebben bezocht. Pagina's kunnen om verschillende redenen worden geblokkeerd voor toegang tot de bfcache of worden uitgezet terwijl ze zich in bfcache bevinden, sommige vereist door een specificatie en sommige specifiek voor browserimplementaties.
Voorheen konden ontwikkelaars er op geen enkele manier achter komen waarom hun pagina's werden geblokkeerd voor het gebruik van de bfcache in het veld, hoewel er wel een test was in Chrome dev tools . Om monitoring in het veld mogelijk te maken, is de klasse PerformanceNavigationTiming
uitgebreid met de eigenschap notRestoredReasons
. Dit retourneert een object met gerelateerde informatie over het bovenste frame en alle iframes die in het document aanwezig zijn:
- Redenen waarom ze de bfcache niet konden gebruiken.
Details zoals frame-
id
enname
, om iframes in de HTML te helpen identificeren.Hierdoor kunnen ontwikkelaars actie ondernemen om die pagina's bfcache-compatibel te maken, waardoor de prestaties van de site worden verbeterd.
Voorbeelden
Een PerformanceNavigationTiming
instantie kan worden verkregen uit functies zoals Performance.getEntriesByType()
en PerformanceObserver
.
U kunt bijvoorbeeld de volgende functie aanroepen om alle PerformanceNavigationTiming
objecten te retourneren die aanwezig zijn in de prestatietijdlijn en hun notRestoredReasons
te loggen:
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);
}
}
Voor geschiedenisnavigatie retourneert de eigenschap PerformanceNavigationTiming.notRestoredReasons
een object met de volgende structuur, die de geblokkeerde status van het frame op het hoogste niveau vertegenwoordigt:
{
children: [],
id: null,
name: null,
reasons: [
{"reason", "unload-listener"}
],
src: null,
url: "https://www.example.com/page/"
}
De eigenschappen zijn als volgt:
-
children
- Een array van objecten die de geblokkeerde status vertegenwoordigen van frames van dezelfde oorsprong die zijn ingebed in het frame op het hoogste niveau. Elk object heeft dezelfde structuur als het bovenliggende object. Op deze manier kan een willekeurig aantal niveaus van ingebedde frames recursief in het object worden weergegeven. Als het frame geen kinderen heeft, is de array leeg.
-
id
- Een tekenreeks die de
id
-attribuutwaarde van het frame vertegenwoordigt (bijvoorbeeld<iframe id="foo" src="...">
). Als het frame geenid
heeft, is de waardenull
. Voor de pagina op het hoogste niveau is ditnull
. -
name
- Een tekenreeks die de
name
van het frame vertegenwoordigt (bijvoorbeeld<iframe name="bar" src="...">
). Als het frame geenname
heeft, is de waarde een lege tekenreeks. Voor de pagina op het hoogste niveau is ditnull
. -
reasons
- Een array van tekenreeksen die elk een reden vertegenwoordigen waarom de genavigeerde pagina werd geblokkeerd voor het gebruik van de bfcache. Er zijn veel verschillende redenen waarom blokkering kan optreden. Zie het gedeelte Blokkeerredenen voor meer details.
-
src
- Een tekenreeks die het pad naar de bron van het frame vertegenwoordigt (bijvoorbeeld
<iframe src="b.html">
). Als het frame geensrc
heeft, is de waarde een lege string. Voor de pagina op het hoogste niveau is ditnull
. -
url
- Een tekenreeks die de URL van de genavigeerde pagina/iframe vertegenwoordigt.
Voor PerformanceNavigationTiming
objecten die geen geschiedenisnavigatie vertegenwoordigen, retourneert de eigenschap notRestoredReasons
null
.
Houd er rekening mee dat notRestoredReasons
ook null
retourneert als er geen blokkeringsredenen zijn. Het feit dat null
is, is dus geen indicatie dat de bfcache wel of niet werd gebruikt. Daarvoor moet u de eigenschap event.persisted
gebruiken .
Rapporteer bfcache-blokkering in frames van dezelfde oorsprong
Wanneer op een pagina frames van dezelfde oorsprong zijn ingesloten, bevat de geretourneerde notRestoredReasons
waarde een object binnen de eigenschap children
dat de geblokkeerde status van elk ingesloten frame vertegenwoordigt.
Bijvoorbeeld:
{
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"
}
Rapporteer bfcache-blokkering in cross-origin-frames
Wanneer op een pagina cross-origin-frames zijn ingesloten, beperken we de hoeveelheid informatie die over de pagina wordt gedeeld om te voorkomen dat er cross-origin-informatie lekt. We nemen alleen informatie op die de buitenste pagina al kent, en of de cross-origin subboom bfcache heeft geblokkeerd of niet. We nemen geen blokkeringsredenen of informatie op over lagere niveaus van de subboom (zelfs als sommige subniveaus dezelfde oorsprong hebben).
Bijvoorbeeld:
{
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"
}
Voor alle cross-origin iframes rapporteren we null
vanwege de reasons
voor het frame, en het frame op het hoogste niveau toont de reden "masked"
. Houd er rekening mee dat "masked"
ook kan worden gebruikt om user-agent-specifieke redenen en dus niet altijd op een probleem in een iframe duidt.
Zie het gedeelte Beveiliging en privacy in de uitleg voor meer informatie over beveiligings- en privacyoverwegingen.
Blokkerende redenen
Zoals we eerder zeiden, zijn er veel verschillende redenen waarom blokkering kan optreden:
Hieronder volgen voorbeelden van enkele van de meest voorkomende redenen waarom de bfcache niet kan worden gebruikt:
-
unload-listener
: de pagina registreert eenunload
-handler, die het gebruik van bfcache in bepaalde browsers verhindert. Zie De unload-gebeurtenis afschaffen voor meer informatie. -
response-cache-control-no-store
: De pagina gebruiktno-store
alscache-control
waarde. -
related-active-contents
: de pagina is geopend vanaf een andere pagina (ofwel met behulp van "duplicate tab") die nog steeds een verwijzing naar deze pagina heeft.
Feedback
Het Chromium-team wil graag horen wat uw ervaringen zijn met de bfcache notRestoredReasons
API.
Vertel ons over het API-ontwerp
Is er iets aan de API dat niet werkt zoals je had verwacht? Of ontbreken er methoden of eigenschappen die je nodig hebt om je idee te implementeren? Heeft u een vraag of opmerking over het beveiligingsmodel? Dien een spec issue in op de corresponderende GitHub repository , of voeg uw gedachten toe aan een bestaand issue.
Meld een probleem met de implementatie
Heb je een bug gevonden in de implementatie van Chromium? Of wijkt de uitvoering af van de specificaties? Dien een bug in op onze issuetracker . Zorg ervoor dat u zoveel mogelijk details opneemt, eenvoudige instructies voor het reproduceren, en specificeer de component als UI > Browser > Navigation > BFCache
. Glitch werkt uitstekend voor het delen van snelle en gemakkelijke reproducties.
Toon ondersteuning voor de API
Bent u van plan de bfcache notRestoredReasons
API te gebruiken? Jouw publieke steun helpt het Chromium-team bij het prioriteren van functies en laat andere browserleveranciers zien hoe belangrijk het is om deze te ondersteunen.
Stuur een tweet naar @ChromiumDev met de hashtag #NotRestoredReasons
en laat ons weten waar en hoe je deze gebruikt.