Navigateurs pris en charge
Aujourd'hui, les navigateurs récents suspendent parfois des pages ou les suppriment entièrement lorsque les ressources système sont limitées. À l'avenir, les navigateurs souhaitent le faire de manière proactive afin de consommer moins d'énergie et de mémoire. L'API Page Lifecycle fournit des crochets de cycle de vie afin que vos pages puissent gérer ces interventions du navigateur de manière sécurisée sans affecter l'expérience utilisateur. Consultez l'API pour déterminer si vous devez implémenter ces fonctionnalités dans votre application.
Contexte
Le cycle de vie des applications est un moyen essentiel pour les systèmes d'exploitation modernes de gérer les ressources. Sur Android, iOS et les versions récentes de Windows, les applications peuvent être démarrées et arrêtées à tout moment par l'OS. Cela permet à ces plates-formes de rationaliser et de réallouer les ressources là où elles profitent le mieux à l'utilisateur.
Sur le Web, il n'y a historiquement pas de cycle de vie de ce type, et les applications peuvent être maintenues en vie indéfiniment. Avec un grand nombre de pages Web en cours d'exécution, les ressources système critiques telles que la mémoire, le processeur, la batterie et le réseau peuvent subir une sursouscription, ce qui nuit à l'expérience utilisateur.
Bien que la plate-forme Web dispose depuis longtemps d'événements liés aux états de cycle de vie (comme load
, unload
et visibilitychange
), ces événements ne permettent aux développeurs que de répondre aux changements d'état de cycle de vie déclenchés par l'utilisateur. Pour que le Web fonctionne de manière fiable sur les appareils à faible puissance (et soit, en général, plus attentif aux ressources sur toutes les plates-formes), les navigateurs doivent pouvoir récupérer et réallouer les ressources système de manière proactive.
De nos jours, les navigateurs prennent déjà des mesures actives pour préserver les ressources des pages dans les onglets en arrière-plan, et de nombreux navigateurs (en particulier Chrome) souhaitent en faire beaucoup plus, afin de réduire leur empreinte globale des ressources.
Le problème est que les développeurs n'ont aucun moyen de se préparer à ces types d'interventions déclenchées par le système, ni même de savoir qu'elles se produisent. Cela signifie que les navigateurs doivent être conservateurs, sinon ils risquent de casser les pages Web.
L'API Page Lifecycle tente de résoudre ce problème en :
- Introduction et normalisation du concept d'états de cycle de vie sur le Web.
- Définir de nouveaux états initiés par le système qui permettent aux navigateurs de limiter les ressources pouvant être consommées par les onglets masqués ou inactifs.
- Créer des API et des événements qui permettent aux développeurs Web de répondre aux transitions vers et depuis ces nouveaux états déclenchés par le système.
Cette solution offre aux développeurs Web la prévisibilité dont ils ont besoin pour créer des applications résilientes aux interventions du système. Elle permet également aux navigateurs d'optimiser les ressources système de manière plus agressive, au profit de tous les internautes.
Le reste de cet article présente les nouvelles fonctionnalités du cycle de vie des pages et explique comment elles se rapportent à tous les états et événements existants de la plate-forme Web. Il fournit également des recommandations et des bonnes pratiques concernant les types de tâches que les développeurs doivent (et ne doivent pas) effectuer à chaque étape.
Présentation des états et des événements du cycle de vie des pages
Tous les états du cycle de vie des pages sont distincts et exclusifs les uns des autres, ce qui signifie qu'une page ne peut être dans qu'un seul état à la fois. La plupart des modifications apportées à l'état du cycle de vie d'une page sont généralement observables via des événements DOM (voir les recommandations pour les développeurs pour chaque état pour les exceptions).
Le moyen le plus simple d'expliquer les états du cycle de vie de la page, ainsi que les événements qui signalent les transitions entre eux, est de créer un diagramme :
États
Le tableau suivant explique en détail chaque état. Il liste également les états possibles qui peuvent se produire avant et après, ainsi que les événements que les développeurs peuvent utiliser pour observer les modifications.
État | Description |
---|---|
Actif |
Une page est dans l'état actif si elle est visible et que le focus de saisie est défini dessus.
États précédents possibles : |
Passif |
Une page est à l'état passif si elle est visible et qu'elle n'est pas sélectionnée.
États précédents possibles :
États suivants possibles : |
Hidden |
Une page est dans l'état masquée si elle n'est pas visible (et qu'elle n'a pas été figée, supprimée ni arrêtée).
États précédents possibles :
États suivants possibles : |
Figé |
À l'état gelé, le navigateur suspend l'exécution des
tâches
gelées dans les
files d'attente de tâches de la page jusqu'à ce que celle-ci soit libérée. Cela signifie que les minuteurs JavaScript et les rappels de récupération ne s'exécutent pas. Les tâches déjà en cours d'exécution peuvent se terminer (en particulier le rappel Les navigateurs figent les pages pour préserver l'utilisation du processeur, de la batterie et des données. Ils le font également pour accélérer les navigations avant/arrière, ce qui évite de recharger complètement la page.
États précédents possibles :
Étapes suivantes possibles : |
Arrêtée |
Une page est dans l'état terminé une fois qu'elle a commencé à être désinstallée et effacée de la mémoire par le navigateur. Aucune nouvelle tâche ne peut démarrer dans cet état, et les tâches en cours peuvent être arrêtées si elles s'exécutent trop longtemps.
États précédents possibles :
Étapes suivantes possibles : |
Supprimées |
Une page est dans l'état supprimée lorsqu'elle est déchargée par le navigateur afin de conserver des ressources. Aucune tâche, aucun rappel d'événement ni aucun code JavaScript d'aucun type ne peut s'exécuter dans cet état, car les suppressions se produisent généralement en cas de contraintes de ressources, où le démarrage de nouveaux processus est impossible. Dans l'état abandonné, l'onglet lui-même (y compris le titre et l'icône de l'onglet) est généralement visible par l'utilisateur, même si la page a disparu.
États précédents possibles :
Étapes suivantes possibles : |
Événements
Les navigateurs envoient de nombreux événements, mais seule une petite partie d'entre eux indique un changement possible de l'état du cycle de vie de la page. Le tableau suivant décrit tous les événements liés au cycle de vie et indique les états vers lesquels et à partir desquels ils peuvent effectuer une transition.
Nom | Détails |
---|---|
focus
|
Un élément DOM a été sélectionné.
Remarque:Un événement
États précédents possibles :
États actuels possibles : |
blur
|
Un élément DOM a perdu la sélection.
Remarque : Un événement
États précédents possibles :
États actuels possibles : |
visibilitychange
|
La valeur |
freeze
*
|
La page vient d'être figée. Aucune tâche figable dans les files d'attente de tâches de la page ne sera démarrée.
États précédents possibles :
États actuels possibles: |
resume
*
|
Le navigateur a réactivé une page figée.
États précédents possibles:
États actuels possibles : |
pageshow
|
Une entrée de l'historique des sessions est parcourue. Il peut s'agir d'un chargement de page entièrement nouveau ou d'une page extraite du cache "Précédent/Suivant". Si la page a été extraite du cache amélioré, la propriété
États précédents possibles: |
pagehide
|
Une entrée de l'historique des sessions est parcourue. Si l'utilisateur accède à une autre page et que le navigateur peut ajouter la page actuelle au cache avant/arrière pour la réutiliser ultérieurement, la propriété
États précédents possibles:
États actuels possibles : |
beforeunload
|
La fenêtre, le document et ses ressources sont sur le point d'être désinstallés. Le document est toujours visible et l'événement peut toujours être annulé à ce stade.
Important : L'événement
États précédents possibles :
États actuels possibles : |
unload
|
La page est en cours de déchargement.
Avertissement : L'utilisation de l'événement
États précédents possibles:
États actuels possibles : |
* Indique un nouvel événement défini par l'API Page Lifecycle
Nouvelles fonctionnalités ajoutées à Chrome 68
Le graphique précédent montre deux états déclenchés par le système plutôt que par l'utilisateur : gelé et abandonné. Comme indiqué précédemment, les navigateurs actuels gèlent et suppriment parfois des onglets masqués (à leur discrétion), mais les développeurs n'ont aucun moyen de savoir quand cela se produit.
Dans Chrome 68, les développeurs peuvent désormais observer quand un onglet masqué est gelé et dégelé en écoutant les événements freeze
et resume
sur document
.
document.addEventListener('freeze', (event) => {
// The page is now frozen.
});
document.addEventListener('resume', (event) => {
// The page has been unfrozen.
});
À partir de Chrome 68, l'objet document
inclut désormais une propriété wasDiscarded
dans Chrome pour ordinateur (la prise en charge d'Android est en cours de suivi pour ce problème). Pour déterminer si une page a été supprimée dans un onglet masqué, vous pouvez inspecter la valeur de cette propriété au moment du chargement de la page (remarque : les pages supprimées doivent être actualisées pour être réutilisées).
if (document.wasDiscarded) {
// Page was previously discarded by the browser while in a hidden tab.
}
Pour obtenir des conseils sur les actions importantes à effectuer dans les événements freeze
et resume
, ainsi que sur la façon de gérer et de préparer la suppression de pages, consultez les recommandations pour les développeurs pour chaque état.
Les sections suivantes offrent un aperçu de la façon dont ces nouvelles fonctionnalités s'intègrent aux états et événements existants de la plate-forme Web.
Comment observer les états du cycle de vie de la page dans le code
Dans les états actif, passif et caché, il est possible d'exécuter du code JavaScript qui détermine l'état actuel du cycle de vie de la page à partir des API de plate-forme Web existantes.
const getState = () => {
if (document.visibilityState === 'hidden') {
return 'hidden';
}
if (document.hasFocus()) {
return 'active';
}
return 'passive';
};
En revanche, les états gelé et terminé ne peuvent être détectés que dans leur écouteur d'événements respectif (freeze
et pagehide
) lorsque l'état change.
Observer les changements d'état
En s'appuyant sur la fonction getState()
définie précédemment, vous pouvez observer tous les changements d'état de la page avec le code suivant.
// Stores the initial state using the `getState()` function (defined above).
let state = getState();
// Accepts a next state and, if there's been a state change, logs the
// change to the console. It also updates the `state` value defined above.
const logStateChange = (nextState) => {
const prevState = state;
if (nextState !== prevState) {
console.log(`State change: ${prevState} >>> ${nextState}`);
state = nextState;
}
};
// Options used for all event listeners.
const opts = {capture: true};
// These lifecycle events can all use the same listener to observe state
// changes (they call the `getState()` function to determine the next state).
['pageshow', 'focus', 'blur', 'visibilitychange', 'resume'].forEach((type) => {
window.addEventListener(type, () => logStateChange(getState()), opts);
});
// The next two listeners, on the other hand, can determine the next
// state from the event itself.
window.addEventListener('freeze', () => {
// In the freeze event, the next state is always frozen.
logStateChange('frozen');
}, opts);
window.addEventListener('pagehide', (event) => {
// If the event's persisted property is `true` the page is about
// to enter the back/forward cache, which is also in the frozen state.
// If the event's persisted property is not `true` the page is
// about to be unloaded.
logStateChange(event.persisted ? 'frozen' : 'terminated');
}, opts);
Ce code effectue trois opérations :
- Définit l'état initial à l'aide de la fonction
getState()
. - Définit une fonction qui accepte un état suivant et, en cas de modification, consigne les modifications d'état dans la console.
- Ajoute des écouteurs d'événements de capture pour tous les événements de cycle de vie nécessaires, qui à leur tour appellent
logStateChange()
, en transmettant l'état suivant.
Notez que tous les écouteurs d'événements sont ajoutés à window
et qu'ils transmettent tous {capture: true}
.
Plusieurs raisons peuvent expliquer ce phénomène :
- Tous les événements de cycle de vie de la page n'ont pas la même cible.
pagehide
etpageshow
sont déclenchés surwindow
.visibilitychange
,freeze
etresume
sont déclenchés surdocument
, etfocus
etblur
sont déclenchés sur leurs éléments DOM respectifs. - La plupart de ces événements ne remontent pas, ce qui signifie qu'il est impossible d'ajouter des écouteurs d'événements non capturants à un élément ancêtre commun et de tous les observer.
- La phase de capture s'exécute avant les phases de cible ou de bulle. L'ajout d'écouteurs à cet endroit permet de s'assurer qu'ils s'exécutent avant qu'un autre code ne puisse les annuler.
Recommandations de développeurs pour chaque État
En tant que développeur, il est important de comprendre les états du cycle de vie de la page et de savoir les observer dans le code, car le type de travail que vous devez (et ne devez pas) effectuer dépend en grande partie de l'état de votre page.
Par exemple, il n'a pas de sens d'afficher une notification temporaire à l'utilisateur si la page est à l'état masqué. Bien que cet exemple soit assez évident, d'autres recommandations moins évidentes méritent d'être énumérées.
État | Recommandations pour les développeurs |
---|---|
Active |
L'état actif correspond au moment le plus critique pour l'utilisateur et, par conséquent, au moment le plus important pour que votre page réponde à l'entrée utilisateur. Toutes les tâches autres que celles liées à l'interface utilisateur susceptibles de bloquer le thread principal doivent être définies sur les périodes d'inactivité ou déchargées vers un nœud de calcul Web. |
Passive |
À l'état passif, l'utilisateur n'interagit pas avec la page, mais il peut tout de même la voir. Cela signifie que les mises à jour et les animations de l'interface utilisateur doivent toujours être fluides, mais le moment où ces mises à jour se produisent est moins critique. Lorsque la page passe de l'état active à l'état passive, il est temps de conserver l'état de l'application non enregistré. |
Lorsque la page passe de passive à masquée, il est possible que l'utilisateur ne l'interagisse plus jusqu'à ce qu'elle soit actualisée. La transition vers l'état masqué est également souvent le dernier changement d'état observable de manière fiable par les développeurs (c'est particulièrement vrai sur mobile, car les utilisateurs peuvent fermer des onglets ou l'application de navigateur elle-même, et les événements Par conséquent, vous devez considérer l'état masqué comme la fin probable de la session de l'utilisateur. En d'autres termes, conservez tout état de l'application non enregistré et envoyez toutes les données d'analyse non envoyées. Vous devez également arrêter de mettre à jour l'UI (car elle ne sera pas visible par l'utilisateur) et arrêter toutes les tâches qu'un utilisateur ne souhaite pas exécuter en arrière-plan. |
|
Frozen |
À l'état figé, les tâches figables dans les files d'attente de tâches sont suspendues jusqu'à ce que la page soit dégelée, ce qui peut ne jamais se produire (par exemple, si la page est supprimée). Par conséquent, lorsque la page passe de l'état masquée à l'état figée, il est essentiel d'arrêter tous les minuteurs ou de supprimer toutes les connexions qui, si elles sont figées, pourraient affecter d'autres onglets ouverts de la même origine ou la capacité du navigateur à placer la page dans le cache avant/arrière. En particulier, vous devez :
Vous devez également conserver tout état de vue dynamique (par exemple, la position de défilement dans une vue de liste infinie) dans Si la page passe de gelée à masquée, vous pouvez rouvrir les connexions fermées ou relancer tout sondage que vous avez arrêté lorsque la page a été initialement figée. |
Terminated |
En général, aucune action n'est requise de votre part lorsqu'une page passe à l'état terminé. Étant donné que les pages qui sont désinstallées en raison d'une action de l'utilisateur passent toujours par l'état masqué avant d'atteindre l'état terminé, c'est à l'état masqué que la logique de fin de session (par exemple, la persistance de l'état de l'application et les rapports aux outils d'analyse) doit être effectuée. De plus (comme indiqué dans les recommandations concernant l'état masqué), il est très important que les développeurs comprennent que la transition vers l'état arrêté ne peut pas être détectée de manière fiable dans de nombreux cas (en particulier sur mobile). Les développeurs qui dépendent d'événements d'arrêt (par exemple, |
Discarded |
L'état supprimé n'est pas visible par les développeurs au moment où une page est supprimée. En effet, les pages sont généralement supprimées en raison de contraintes de ressources, et dans la plupart des cas, il n'est tout simplement pas possible de libérer une page pour autoriser l'exécution du script en réponse à un événement de suppression. Par conséquent, vous devez vous préparer à la possibilité d'une suppression lors du passage de masqué à figé, puis vous pouvez réagir à la restauration d'une page supprimée au moment du chargement de la page en vérifiant |
Là encore, comme la fiabilité et l'ordre des événements de cycle de vie ne sont pas systématiquement mis en œuvre dans tous les navigateurs, le moyen le plus simple de suivre les conseils du tableau consiste à utiliser PageLifecycle.js.
API de cycle de vie obsolètes à éviter
Dans la mesure du possible, les événements suivants doivent être évités.
Événement de déchargement
De nombreux développeurs traitent l'événement unload
comme un rappel garanti et l'utilisent comme un signal de fin de session pour enregistrer l'état et envoyer des données d'analyse. Toutefois, cela n'est extrêmement pas fiable, en particulier sur mobile. L'événement unload
ne se déclenche pas dans les situations de déchargement courantes, y compris la fermeture d'un onglet à partir du sélecteur d'onglets sur mobile ou la fermeture de l'application de navigateur à partir du sélecteur d'applications.
Pour cette raison, il est toujours préférable de s'appuyer sur l'événement visibilitychange
pour déterminer le moment où une session se termine, et de considérer l'état masqué comme le dernier moment fiable pour enregistrer les données de l'application et des données utilisateur.
De plus, la simple présence d'un gestionnaire d'événements unload
enregistré (via onunload
ou addEventListener()
) peut empêcher les navigateurs de placer des pages dans le cache avant/arrière pour un chargement plus rapide des pages précédentes et suivantes.
Dans tous les navigateurs modernes, nous vous recommandons de toujours utiliser l'événement pagehide
pour détecter les déchargements de page possibles (également appelés état terminé) plutôt que l'événement unload
. Si vous devez prendre en charge les versions 10 et antérieures d'Internet Explorer, vous devez détecter l'événement pagehide
et n'utiliser unload
que si le navigateur n'est pas compatible avec pagehide
:
const terminationEvent = 'onpagehide' in self ? 'pagehide' : 'unload';
window.addEventListener(terminationEvent, (event) => {
// Note: if the browser is able to cache the page, `event.persisted`
// is `true`, and the state is frozen rather than terminated.
});
Événement beforeunload
L'événement beforeunload
présente un problème semblable à l'événement unload
, en ce sens que, historiquement, la présence d'un événement beforeunload
peut empêcher les pages d'être éligibles au cache amélioré. Cette restriction ne s'applique pas aux navigateurs récents. Toutefois, par mesure de précaution, certains navigateurs ne déclenchent pas l'événement beforeunload
lorsqu'ils tentent de placer une page dans le cache "Retour/Avance", ce qui signifie que l'événement n'est pas fiable en tant que signal de fin de session.
De plus, certains navigateurs (y compris Chrome) nécessitent une interaction de l'utilisateur sur la page avant de permettre le déclenchement de l'événement beforeunload
, ce qui affecte encore plus sa fiabilité.
Une différence entre beforeunload
et unload
est qu'il existe des utilisations légitimes de beforeunload
. Par exemple, lorsque vous souhaitez avertir l'utilisateur qu'il a des modifications non enregistrées qu'il perdra s'il continue de vider la page.
Étant donné qu'il existe des raisons valables d'utiliser beforeunload
, nous vous recommandons d'ajouter uniquement des écouteurs beforeunload
lorsqu'un utilisateur présente des modifications non enregistrées, puis de les supprimer immédiatement après leur enregistrement.
En d'autres termes, ne faites pas cela (car cela ajoute un écouteur beforeunload
sans condition) :
addEventListener('beforeunload', (event) => {
// A function that returns `true` if the page has unsaved changes.
if (pageHasUnsavedChanges()) {
event.preventDefault();
// Legacy support for older browsers.
return (event.returnValue = true);
}
});
À la place, procédez comme suit (puisque l'écouteur beforeunload
n'est ajouté que lorsqu'il est nécessaire et supprimé lorsqu'il ne l'est pas) :
const beforeUnloadListener = (event) => {
event.preventDefault();
// Legacy support for older browsers.
return (event.returnValue = true);
};
// A function that invokes a callback when the page has unsaved changes.
onPageHasUnsavedChanges(() => {
addEventListener('beforeunload', beforeUnloadListener);
});
// A function that invokes a callback when the page's unsaved changes are resolved.
onAllChangesSaved(() => {
removeEventListener('beforeunload', beforeUnloadListener);
});
Questions fréquentes
Pourquoi n'y a-t-il pas d'état "chargement" ?
L'API Page Lifecycle définit les états de manière distincte et mutuellement exclusive. Étant donné qu'une page peut être chargée dans les états actif, passif ou masqué, et qu'elle peut changer d'état (ou même être arrêtée) avant la fin du chargement, un état de chargement distinct n'a pas de sens dans ce paradigme.
Ma page effectue une tâche importante lorsqu'elle est masquée. Comment empêcher son blocage ou son abandon ?
De nombreuses raisons légitimes expliquent pourquoi les pages Web ne doivent pas être figées lorsqu'elles s'exécutent dans l'état masqué. L'exemple le plus évident est une application qui diffuse de la musique.
Dans certains cas, Chrome risque également de supprimer une page, par exemple si elle contient un formulaire avec une entrée utilisateur non envoyée ou si un gestionnaire beforeunload
vous avertit lorsque la page est en cours de déchargement.
Pour le moment, Chrome sera conservateur lorsqu'il abandonnera des pages et ne le fera que lorsqu'il sera sûr que cela n'affectera pas les utilisateurs. Par exemple, les pages qui ont été observées en train d'effectuer l'une des opérations suivantes lorsqu'elles sont dans l'état masqué ne seront pas supprimées, sauf en cas de contraintes de ressources extrêmes :
- Lecture d'un contenu audio
- Utiliser WebRTC
- Modifier le titre ou la favicon de la table
- Afficher les alertes
- Envoyer des notifications push
Pour connaître les fonctionnalités de liste actuelles utilisées pour déterminer si un onglet peut être gelé ou supprimé de manière sécurisée, consultez la section Heuristiques de gel et de suppression dans Chrome.
Qu'est-ce que le cache amélioré ?
Le cache "Précédent/Suivant" est un terme utilisé pour décrire une optimisation de la navigation implémentée par certains navigateurs, qui accélère l'utilisation des boutons "Précédent" et "Suivant".
Lorsqu'un utilisateur quitte une page, ces navigateurs figent une version de cette page afin qu'elle puisse être rapidement reprise si l'utilisateur revient en arrière à l'aide des boutons "Précédent" ou "Avant". N'oubliez pas que l'ajout d'un gestionnaire d'événements unload
empêche cette optimisation.
À tous égards, ce blocage est fonctionnellement identique à celui effectué par les navigateurs pour économiser le processeur/la batterie. C'est pourquoi il fait partie de l'état de cycle de vie gelé.
Si je ne peux pas exécuter d'API asynchrones dans les états "gelé" ou "terminé", comment enregistrer des données dans IndexedDB ?
Dans les états "gelé" et "terminé", les tâches pouvant être gelées dans les files d'attente de tâches d'une page sont suspendues, ce qui signifie que les API asynchrones et basées sur des rappels telles que IndexedDB ne peuvent pas être utilisées de manière fiable.
À l'avenir, nous allons ajouter une méthode commit()
aux objets IDBTransaction
, ce qui permettra aux développeurs d'effectuer des transactions en écriture seule qui ne nécessitent pas de rappels. En d'autres termes, si le développeur ne fait que saisir des données dans IndexedDB et n'effectue pas de transaction complexe consistant en des lectures et des écritures, la méthode commit()
pourra se terminer avant que les files d'attente de tâches ne soient suspendues (en supposant que la base de données IndexedDB est déjà ouverte).
Toutefois, pour le code qui doit fonctionner dès aujourd'hui, les développeurs ont deux options :
- Utilisez le stockage de session : le stockage de session est synchrone et persiste lors de l'abandon de la page.
- Utilisez IndexedDB à partir de votre service worker : un service worker peut stocker des données dans IndexedDB une fois la page terminée ou supprimée. Dans l'écouteur d'événements
freeze
oupagehide
, vous pouvez envoyer des données à votre service worker viapostMessage()
. Celui-ci se charge de les enregistrer.
Tester votre application à l'état figée ou supprimée
Pour tester le comportement de votre application dans les états "congelé" et "supprimé", vous pouvez accéder à chrome://discards
pour congeler ou supprimer l'un de vos onglets ouverts.
Cela vous permet de vous assurer que votre page gère correctement les événements freeze
et resume
, ainsi que l'indicateur document.wasDiscarded
lorsque les pages sont actualisées après un abandon.
Résumé
Les développeurs qui souhaitent respecter les ressources système des appareils de leurs utilisateurs doivent créer leurs applications en tenant compte des états de cycle de vie de la page. Il est essentiel que les pages Web ne consomment pas des ressources système excessives dans des situations auxquelles l'utilisateur ne s'attend pas
Plus les développeurs commenceront à implémenter les nouvelles API de cycle de vie des pages, plus il sera sûr pour les navigateurs de geler et d'abandonner les pages qui ne sont pas utilisées. Cela signifie que les navigateurs consomment moins de mémoire, de processeur, de batterie et de ressources réseau, ce qui est un avantage pour les utilisateurs.