Identifiez les navigations qui ont été bloquées à l'aide du bfcache et pourquoi.
La propriété notRestoredReasons
, ajoutée à la classe PerformanceNavigationTiming
, indique si les cadres présents dans le document ont été empêchés d'utiliser le bfcache lors de la navigation et pourquoi. Les développeurs peuvent utiliser ces informations pour identifier les pages qui doivent être mises à jour pour être compatibles avec bfcache, et ainsi améliorer les performances du site.
État actuel
L'API notRestoredReasons
est disponible à partir de Chrome 123 et est déployée progressivement.
Concepts et utilisation
Les navigateurs modernes proposent une fonctionnalité d'optimisation de la navigation dans l'historique appelée cache amélioré (bfcache). Cela permet une expérience de chargement instantanée lorsque les utilisateurs reviennent sur une page qu'ils ont déjà consultée. Les pages peuvent être bloquées pour accéder au bfcache ou être supprimées du bfcache pour différentes raisons, certaines requises par une spécification et d'autres spécifiques aux implémentations de navigateur.
Auparavant, les développeurs ne pouvaient pas savoir pourquoi leurs pages étaient bloquées pour utiliser le bfcache sur le terrain, même s'il y avait un test dans les outils pour les développeurs Chrome. Pour activer la surveillance sur le terrain, la classe PerformanceNavigationTiming
a été étendue pour inclure une propriété notRestoredReasons
. Cela renvoie un objet contenant des informations associées au frame supérieur et à toutes les iFrames présentes dans le document:
- Motifs pour lesquels l'utilisation du bfcache a été bloquée.
Informations telles que les cadres
id
etname
, pour identifier les iFrames dans le code HTML.Les développeurs peuvent ainsi prendre des mesures pour rendre ces pages compatibles avec bfcache, ce qui améliore les performances du site.
Exemples
Une instance PerformanceNavigationTiming
peut être obtenue à partir de fonctionnalités telles que Performance.getEntriesByType()
et PerformanceObserver
.
Par exemple, vous pouvez appeler la fonction suivante pour renvoyer tous les objets PerformanceNavigationTiming
présents dans la chronologie des performances et consigner leur 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);
}
}
Pour les navigations dans l'historique, la propriété PerformanceNavigationTiming.notRestoredReasons
renvoie un objet dont la structure représente l'état bloqué du frame de niveau supérieur:
{
children: [],
id: null,
name: null,
reasons: [
{"reason", "unload-listener"}
],
src: null,
url: "https://www.example.com/page/"
}
Les propriétés sont les suivantes:
children
- Tableau d'objets représentant l'état bloqué de tous les cadres de même origine intégrés au cadre de premier niveau. Chaque objet a la même structure que l'objet parent. De cette manière, un nombre illimité de niveaux de cadres intégrés peut être représenté de manière récursive dans l'objet. Si le frame n'a pas d'enfants, le tableau sera vide.
id
- Chaîne représentant la valeur de l'attribut
id
de la trame (par exemple,<iframe id="foo" src="...">
). Si la trame ne comporte pas deid
, la valeur estnull
. Pour la page de premier niveau, il s'agit denull
. name
- Chaîne représentant la valeur de l'attribut
name
de la trame (par exemple,<iframe name="bar" src="...">
). Si la trame ne comporte pas dename
, la valeur est une chaîne vide. Pour la page de premier niveau, il s'agit denull
. reasons
- Un tableau de chaînes, chacune représentant un motif pour lequel l'utilisation du bfcache a été bloquée pour la page consultée. Plusieurs raisons peuvent expliquer un blocage. Pour en savoir plus, consultez la section Motifs de blocage.
src
- Chaîne représentant le chemin d'accès à la source du frame (par exemple,
<iframe src="b.html">
). Si le frame ne comporte pas desrc
, la valeur est une chaîne vide. Pour la page de premier niveau, il s'agit denull
. url
- Chaîne représentant l'URL de la page/IFrame consultée.
Pour les objets PerformanceNavigationTiming
qui ne représentent pas de navigations dans l'historique, la propriété notRestoredReasons
renvoie null
.
Notez que notRestoredReasons
renvoie également null
lorsqu'il n'y a pas de motif de blocage. Par conséquent, la valeur null
n'indique pas si le bfcache a été utilisé ou non. Pour ce faire, vous devez utiliser la propriété event.persisted
.
Signaler le blocage de bfcache dans les frames de même origine
Lorsqu'une page contient des cadres de même origine intégrés, la valeur notRestoredReasons
renvoyée contient un objet dans la propriété children
représentant l'état bloqué de chaque cadre intégré.
Exemple :
{
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"
}
Signaler le blocage de bfcache dans les cadres d'origine croisée
Lorsqu'une page comporte des cadres inter-origines intégrés, nous limitons la quantité d'informations partagées à leur sujet pour éviter toute fuite d'informations inter-origines. Nous n'incluons que les informations que la page externe connaît déjà, et si le sous-arbre inter-origine a bloqué bfcache ou non. Nous n'incluons aucun motif de blocage ni aucune information sur les niveaux inférieurs du sous-arbre (même si certains sous-niveaux sont de même origine).
Exemple :
{
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"
}
Pour toutes les iFrames inter-origines, nous signalons null
pour la valeur reasons
de la frame, et la frame de premier niveau affiche une raison de "masked"
. Notez que "masked"
peut également être utilisé pour des raisons spécifiques à l'agent utilisateur. Il n'indique donc pas toujours un problème dans une iframe.
Pour en savoir plus sur les considérations en matière de sécurité et de confidentialité, consultez la section Sécurité et confidentialité de la vidéo explicative.
Motifs de blocage
Comme nous l'avons indiqué précédemment, de nombreuses raisons peuvent expliquer un blocage:
Voici quelques-unes des raisons les plus courantes pour lesquelles le bfcache ne peut pas être utilisé:
unload-listener
: la page enregistre un gestionnaireunload
, ce qui empêche l'utilisation de bfcache dans certains navigateurs. Pour en savoir plus, consultez Abandon de l'événement de déchargement.response-cache-control-no-store
: la page utiliseno-store
comme valeurcache-control
.related-active-contents
: la page a été ouverte à partir d'une autre page (à l'aide de l'option "Onglet en double") qui contient toujours une référence à cette page.
Commentaires
L'équipe Chromium souhaite connaître votre expérience avec l'API notRestoredReasons
bfcache.
Parlez-nous de la conception de l'API
L'API ne fonctionne-t-elle pas comme prévu ? Ou manque-t-il des méthodes ou des propriétés dont vous avez besoin pour implémenter votre idée ? Vous avez une question ou un commentaire sur le modèle de sécurité ? Signalez un problème de spécification dans le dépôt GitHub correspondant ou ajoutez vos commentaires à un problème existant.
Signaler un problème d'implémentation
Avez-vous trouvé un bug dans l'implémentation de Chromium ? Ou l'implémentation est-elle différente de la spécification ?
Signalez un bug dans notre outil de suivi des problèmes. Veillez à inclure autant de détails que possible, des instructions simples pour reproduire le problème et à spécifier le composant en tant que UI > Browser > Navigation > BFCache
.
Glitch est idéal pour partager des reproductions rapidement et facilement.
Afficher la compatibilité avec l'API
Comptez-vous utiliser l'API notRestoredReasons
bfcache ? Votre soutien public aide l'équipe Chromium à hiérarchiser les fonctionnalités et montre aux autres fournisseurs de navigateurs à quel point il est essentiel de les prendre en charge.
Envoyez un tweet à @ChromiumDev en utilisant le hashtag #NotRestoredReasons
et indiquez-nous où et comment vous l'utilisez.