Présentation du préchargement NoState

Katie Hempenius
Katie Hempenius

présentation

NoState Prefetch est un nouveau mécanisme dans Chrome qui constitue une alternative au processus de prérendu obsolète, utilisé pour alimenter des fonctionnalités telles que <link rel="prerender">. Tout comme le prérendu, il récupère les ressources à l'avance. Toutefois, contrairement au prérendu, il n'exécute pas JavaScript et n'affiche aucune partie de la page à l'avance. L'objectif du préchargement NoState est d'utiliser moins de mémoire que le prérendu, tout en réduisant le temps de chargement des pages.

NoState Prefetch n'est pas une API, mais un mécanisme utilisé par Chrome pour implémenter diverses API et fonctionnalités. L'API Resource Hints, ainsi que le préchargement des pages via la barre d'adresse Chrome, sont tous deux mis en œuvre à l'aide du préchargement NoState. Si vous utilisez Chrome 63 ou une version ultérieure, votre navigateur utilise déjà NoState Prefetch pour des fonctionnalités telles que <link rel="prerender">.

Cet article explique le fonctionnement de NoStatePrefetch, ses motivations et des instructions pour afficher des statistiques d'utilisation à l'aide des histogrammes Chrome.

Motivation

Deux raisons principales ont motivé l'introduction du préchargement NoState:

Réduire l'utilisation de la mémoire

Le préchargement NoState n'utilise qu'environ 45 Mio de mémoire. La maintenance de l'analyseur de préchargement constitue la principale dépense de mémoire pour le préchargement NoState, et ce coût reste relativement constant selon les différents cas d'utilisation. L'augmentation de la taille ou du volume des récupérations n'a pas d'effet significatif sur la quantité de mémoire consommée par le préchargement NoState.

En revanche, le prérendu consomme généralement 100 Mio de mémoire, et la consommation de mémoire est limitée à 150 Mio. Cette consommation élevée de mémoire n'est pas adaptée aux appareils d'entrée de gamme (c'est-à-dire <= 512 Mo de RAM). Par conséquent, Chrome n'effectue pas de prérendu sur les appareils d'entrée de gamme, mais procède à une préconnexion.

Faciliter la prise en charge des nouvelles fonctionnalités de la plate-forme Web

Avec le prérendu, aucune action destinée à l'utilisateur (par exemple, lecture de musique ou de vidéo) ni aucune action avec état (par exemple, mutation de session ou de stockage local) ne doit se produire. Cependant, il peut être difficile et complexe d'empêcher ces actions lors de l'affichage d'une page. NoState Prefetch ne récupère que les ressources à l'avance: il n'exécute pas de code et n'affiche pas la page. Il est ainsi plus simple d'empêcher les actions avec état et celles destinées aux utilisateurs.

Implémentation

Les étapes suivantes expliquent le fonctionnement du préchargement NoState.

  1. Déclenchement de NoStatePrefetch.

    Un indice de ressource de prérendu (par exemple, <link rel="prerender">) et certaines fonctionnalités Chrome déclenchent le préchargement NoState à condition que les deux conditions suivantes soient remplies: a) l'utilisateur n'utilise pas un appareil d'entrée de gamme et b) l'utilisateur n'est pas connecté à un réseau mobile.

  2. Un moteur de rendu dédié est créé pour le préchargement NoState.

    Dans Chrome, un moteur de rendu est un processus chargé de prendre un document HTML, de l'analyser, de construire son arborescence de rendu et d'afficher le résultat à l'écran. Chaque onglet de Chrome, ainsi que chaque processus de préchargement NoState, possède son propre moteur de rendu pour assurer une isolation. Cela permet de minimiser les effets d'un problème (par exemple, le plantage d'un onglet) et d'empêcher du code malveillant d'accéder à d'autres onglets ou à d'autres parties du système.

  3. La ressource en cours de chargement avec le préchargement NoState est récupérée. HTMLPreloadScanner analyse ensuite cette ressource pour détecter toutes les sous-ressources à extraire. Si la ressource principale ou l'une de ses sous-ressources dispose d'un service worker enregistré, ces requêtes passent par le service worker approprié.

    Le préchargement NoState n'est compatible qu'avec la méthode HTTP GET. Il ne récupère aucune sous-ressource nécessitant l'utilisation d'autres méthodes HTTP. De plus, il ne récupère aucune ressource nécessitant des actions de l'utilisateur (par exemple, des pop-ups d'authentification, un certificat client SSL ou des remplacements manuels).

  4. Les sous-ressources récupérées seront récupérées avec une priorité de réseau "IDLE".

    La priorité réseau "IDLE" est la priorité réseau la plus faible possible dans Chrome.

  5. Toutes les ressources récupérées par le préchargement NoState sont mises en cache en fonction de leurs en-têtes de cache.

    NoState Prefetch met en cache toutes les ressources, à l'exception de celles avec l'en-tête Cache-Control no-store. Une ressource est revalidée avant utilisation s'il existe un en-tête de réponse Vary, un en-tête Cache-Control no-cache, ou si la ressource a plus de cinq minutes.

  6. Le moteur de rendu est arrêté après le chargement de toutes les sous-ressources.

    Si les sous-ressources expirent, le moteur de rendu est arrêté au bout de 30 secondes.

  7. Le navigateur ne modifie l'état que pour mettre à jour le magasin de cookies et le cache DNS local. Il est important de le souligner car il s'agit de "NoState" dans "NoState Prefetch".

    À ce stade du processus de chargement "normal", le navigateur effectuerait probablement des opérations qui modifieraient l'état du navigateur: par exemple, exécuter JavaScript, modifier sessionStorage ou localStorage, lire de la musique ou des vidéos, utiliser l'API History ou envoyer une invite à l'utilisateur. Les seules modifications d'état qui se produisent lors du préchargement NoState sont la mise à jour du cache DNS à l'arrivée des réponses et la mise à jour du magasin de cookies si une réponse contient l'en-tête Set-Cookie.

  8. Lorsque la ressource est nécessaire, elle est chargée dans la fenêtre du navigateur.

    Toutefois, contrairement à une page prérendue, la page n'est pas immédiatement visible. Elle doit toujours être affichée par le navigateur. Le navigateur ne réutilise pas le moteur de rendu utilisé pour le préchargement NoState et utilise à la place un nouveau moteur de rendu. Ne pas afficher la page à l'avance réduit la consommation de mémoire de NoStatePrefetch, mais aussi l'impact potentiel que cela peut avoir sur le temps de chargement de la page.

    S'il y a un service worker, le chargement de la page sera à nouveau transmis par le service worker.

    Si le préchargement NoState n'a pas fini de récupérer les sous-ressources au moment où la page est nécessaire, le navigateur poursuit le processus de chargement de la page là où le préchargement NoState s'est arrêté. Le navigateur doit toujours récupérer les ressources, mais pas autant que nécessaire si le préchargement NoState n'a pas été lancé.

Impact sur l'analyse d'audience Internet

Les pages chargées à l'aide de NoState Prefetch sont enregistrées par les outils d'analyse d'audience Internet à des moments légèrement différents selon que l'outil collecte des données côté client ou côté serveur.

Les scripts d'analyse côté client enregistrent une page vue lorsque la page est présentée à l'utilisateur. Ces scripts reposent sur l'exécution de JavaScript, et NoState Prefetch n'exécute aucun code JavaScript.

Les outils d'analyse côté serveur enregistrent des métriques lorsqu'une requête est traitée. Pour les ressources chargées via le préchargement NoState, il peut y avoir un intervalle de temps important entre le moment où une requête est traitée et le moment où la réponse est réellement utilisée par le client (le cas échéant). Depuis Chrome 69, NoState Prefetch ajoute l'en-tête Purpose: Prefetch à toutes les requêtes afin de les distinguer de la navigation normale.

Découvrir

NoStatePrefetch est disponible en décembre 2017 dans Chrome 63. Il est actuellement utilisé pour:

  • Implémenter l'indice de ressource prerender
  • Récupérer le premier résultat dans les résultats de recherche Google
  • Extraire les pages qui, selon la barre d'adresse Chrome, sont susceptibles d'être consultées ensuite

Vous pouvez consulter les éléments internes de Chrome pour savoir comment vous utilisez NoStatePrefetch.

Pour afficher la liste des sites qui ont été chargés avec NoState Prefetch, accédez à chrome://net-internals/#prerender.

Pour afficher les statistiques sur votre utilisation du préchargement NoState, accédez à chrome://noms de la prélecture et recherchez "NoStatePrefetch". Il existe trois histogrammes différents pour le préchargement NoState, un pour chaque cas d'utilisation de préchargement NoState:

  • "NoStatePrefetch" (statistiques d'utilisation par les indices de ressources de prérendu)
  • "gws_NoStatePrefetch" (statistiques d'utilisation par la page de résultats de recherche Google)
  • "omnibox_NoStatePrefetch" (statistiques d'utilisation de la barre d'adresse Chrome)