Scopri per quali navigazioni è stato impedito l'utilizzo di bfcache e perché.
La proprietà notRestoredReasons
, aggiunta alla classe PerformanceNavigationTiming
, segnala se i frame presenti nel documento sono stati bloccati dall'utilizzo di bfcache durante la navigazione e perché. Gli sviluppatori possono usare queste informazioni per identificare le pagine che necessitano di aggiornamenti per renderle compatibili con bfcache, migliorando così le prestazioni del sito.
Stato attuale
L'API notRestoredReasons
è stata spedita da Chrome 123 e verrà implementata gradualmente.
Concetti e utilizzo
I browser moderni offrono una funzionalità di ottimizzazione per la navigazione della cronologia chiamata cache back/forward (bfcache). Ciò consente un'esperienza di caricamento istantaneo quando gli utenti tornano a una pagina che hanno già visitato. Le pagine possono essere bloccate dall'ingresso nella cache bfcache o essere rimosse mentre si trovano nella cache bfcache per diversi motivi, alcuni richiesti da una specifica e altri specifici per le implementazioni del browser.
In precedenza, gli sviluppatori non avevano modo di scoprire perché alle loro pagine fosse impedito l'utilizzo di bfcache sul campo, nonostante fosse presente un test negli strumenti per sviluppatori di Chrome. Per abilitare il monitoraggio sul campo, la classe PerformanceNavigationTiming
è stata estesa per includere una proprietà notRestoredReasons
. Questo restituisce un oggetto contenente le informazioni correlate nel frame superiore e tutti gli iframe presenti nel documento:
- I motivi per cui è stato bloccato l'utilizzo di bfcache.
Dettagli come i frame
id
ename
, per facilitare l'identificazione degli iframe nel codice HTML.In questo modo gli sviluppatori possono intervenire per rendere le pagine compatibili con bfcache, migliorando così le prestazioni del sito.
Esempi
Puoi ottenere un'istanza PerformanceNavigationTiming
da funzionalità come Performance.getEntriesByType()
e PerformanceObserver
.
Ad esempio, potresti richiamare la funzione seguente per restituire tutti gli oggetti PerformanceNavigationTiming
presenti nella sequenza temporale delle prestazioni e registrarne i notRestoredReasons
:
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);
}
}
Per le navigazioni della cronologia, la proprietà PerformanceNavigationTiming.notRestoredReasons
restituisce un oggetto con la seguente struttura, che rappresenta lo stato bloccato del frame di primo livello:
{
children: [],
id: null,
name: null,
reasons: [
{"reason", "unload-listener"}
],
src: null,
url: "https://www.example.com/page/"
}
Le proprietà sono le seguenti:
children
- Un array di oggetti che rappresenta lo stato bloccato di qualsiasi frame della stessa origine incorporati nel frame di primo livello. Ogni oggetto ha la stessa struttura dell'oggetto principale: in questo modo, all'interno dell'oggetto è possibile rappresentare in modo ricorsivo qualsiasi numero di livelli di frame incorporati. Se il frame non ha elementi figlio, l'array sarà vuoto.
id
- Una stringa che rappresenta il valore dell'attributo
id
del frame (ad esempio<iframe id="foo" src="...">
). Se il frame non haid
, il valore sarànull
. Per la pagina di primo livello, il valore ènull
. name
- Una stringa che rappresenta il valore dell'attributo
name
del frame (ad esempio<iframe name="bar" src="...">
). Se nel frame non è presente alcun valorename
, il valore sarà una stringa vuota. Per la pagina di primo livello, il valore ènull
. reasons
- Un array di stringhe che rappresentano ciascuna un motivo per cui alla pagina navigata è stato impedito l'utilizzo di bfcache. Il blocco potrebbe essere dovuto a diversi motivi. Per ulteriori dettagli, consulta la sezione Motivi del blocco.
src
- Una stringa che rappresenta il percorso all'origine del frame (ad esempio
<iframe src="b.html">
). Se il frame non hasrc
, il valore sarà una stringa vuota. Per la pagina di primo livello, il valore ènull
. url
- Una stringa che rappresenta l'URL della pagina o dell'iframe navigato.
Per gli oggetti PerformanceNavigationTiming
che non rappresentano le navigazioni della cronologia, la proprietà notRestoredReasons
restituirà null
.
Tieni presente che notRestoredReasons
restituisce null
anche quando non ci sono motivi di blocco, pertanto questo valore su null
non indica che bfcache è stata o non è stata utilizzata. Per questo motivo, devi utilizzare la proprietà event.persisted
.
Segnala il blocco bfcache nei frame della stessa origine
Quando una pagina ha frame della stessa origine incorporati, il valore notRestoredReasons
restituito conterrà un oggetto all'interno della proprietà children
che rappresenta lo stato bloccato di ciascun frame incorporato.
Ad esempio:
{
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"
}
Segnala il blocco bfcache nei frame multiorigine
Quando una pagina ha frame multiorigine incorporati, limitiamo la quantità di informazioni condivise su questa pagina per evitare la divulgazione di informazioni multiorigine. Vengono incluse solo le informazioni già note alla pagina esterna e se il sottoalbero multiorigine ha bloccato bfcache o meno. Non includiamo alcun motivo di blocco o informazioni sui livelli inferiori del sottoalbero (anche se alcuni sottolivelli hanno la stessa origine).
Ad esempio:
{
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"
}
Per tutti gli iframe multiorigine, segnaliamo null
per il valore reasons
relativo al frame e il frame di primo livello mostrerà un motivo di "masked"
. Tieni presente che "masked"
può essere utilizzato anche per motivi specifici dello user agent, pertanto potrebbe non sempre indicare un problema in un iframe.
Per ulteriori dettagli in merito alle considerazioni sulla sicurezza e sulla privacy, consulta la sezione Sicurezza e privacy nell'annuncio esplicativo.
Motivi del blocco
Come detto in precedenza, il blocco potrebbe essere dovuto a diversi motivi:
Di seguito sono riportati alcuni esempi dei motivi più comuni per cui non è possibile utilizzare bfcache:
unload-listener
: la pagina registra un gestoreunload
, che impedisce l'utilizzo di bfcache in alcuni browser. Per saperne di più, consulta Ritiro dell'evento unload.response-cache-control-no-store
: la pagina utilizzano-store
come valorecache-control
.related-active-contents
: la pagina è stata aperta da un'altra pagina (utilizzando la "scheda duplicata") che contiene ancora un riferimento a questa pagina.
Feedback
Il team di Chromium vuole saperne di più sulla tua esperienza con l'API bfcache notRestoredReasons
.
Parlaci della progettazione dell'API
C'è qualcosa nell'API che non funziona come previsto? Oppure mancano metodi o proprietà per implementare la tua idea? Hai una domanda o un commento sul modello di sicurezza? Invia un problema relativo alle specifiche sul repository GitHub corrispondente o aggiungi le tue opinioni a un problema esistente.
Segnalare un problema con l'implementazione
Hai trovato un bug nell'implementazione di Chromium? Oppure l'implementazione è diversa dalle specifiche?
Segnala un bug sul nostro Issue Tracker. Includi il maggior numero di dettagli possibile e
semplici istruzioni per la riproduzione e specifica UI > Browser > Navigation > BFCache
come componente.
Glitch è la soluzione perfetta per condividere riproduzioni in modo facile e veloce.
Mostra il supporto per l'API
Intendi utilizzare l'API bfcache notRestoredReasons
? Il supporto pubblico aiuta il team di Chromium a dare priorità alle funzionalità e mostra agli altri fornitori di browser quanto sia fondamentale supportarle.
Invia un tweet a @ChromiumDev utilizzando l'hashtag
#NotRestoredReasons
e
facci sapere dove e come lo utilizzi.