Atelier de programmation: précharger les éléments critiques pour améliorer la vitesse de chargement

Dans cet atelier de programmation, les performances de la page Web suivante sont améliorées en préchargeant et en préextrayant quelques ressources :

Capture d'écran de l'application

Mesurer

Mesurez d'abord les performances du site Web avant d'ajouter des optimisations.

  • Pour prévisualiser le site, appuyez sur Afficher l'application, puis sur Plein écran plein écran.

Exécutez l'audit des performances Lighthouse (Lighthouse > Options > Performances) sur la version en ligne de votre projet Glitch (voir aussi Découvrir les opportunités d'amélioration des performances avec Lighthouse).

Lighthouse affiche l'échec de l'audit suivant pour une ressource récupérée tardivement :

Lighthouse : audit "Précharger les requêtes clés"
  • Appuyez sur Ctrl+Maj+J (ou Cmd+Option+J sur Mac) pour ouvrir les outils de développement.
  • Cliquez sur l'onglet Réseau.
Panneau "Network" avec une ressource découverte tardivement

Le fichier main.css n'est pas récupéré par un élément Link (<link>) placé dans le document HTML, mais un fichier JavaScript distinct, fetch-css.js, associe l'élément Link au DOM après l'événement window.onLoad. Cela signifie que le fichier n'est récupéré qu'après que le navigateur a terminé d'analyser et d'exécuter le fichier JS. De même, une police Web (K2D.woff2) spécifiée dans main.css n'est récupérée qu'une fois le fichier CSS téléchargé.

La chaîne de demandes critiques représente l'ordre des ressources que le navigateur priorise et récupère. Pour cette page Web, il ressemble actuellement à ceci :

├─┬ / (initial HTML file)
  └── fetch-css.js
    └── main.css
      └── K2D.woff2

Étant donné que le fichier CSS se trouve au troisième niveau de la chaîne de requête, Lighthouse l'a identifié comme une ressource découverte tardivement.

Précharger les ressources critiques

Le fichier main.css est un élément essentiel qui est nécessaire immédiatement dès que la page est chargée. Pour les fichiers importants comme cette ressource, qui sont récupérés tardivement dans votre application, utilisez une balise de préchargement de lien pour informer le navigateur de les télécharger plus tôt en ajoutant un élément Link à l'en-tête du document.

Ajoutez une balise de préchargement pour cette application :

<head>
  <!-- ... -->
  <link rel="preload" href="main.css" as="style">
</head>

L'attribut as permet d'identifier le type de ressource récupéré, et as="style" permet de précharger les fichiers de feuille de style.

Rechargez l'application et examinez le panneau Réseau dans les outils de développement.

Panneau &quot;Réseau&quot; avec une ressource préchargée

Remarquez comment le navigateur récupère le fichier CSS avant même que l'analyse du fichier JavaScript responsable de la récupération ne soit terminée. Avec le préchargement, le navigateur sait qu'il doit récupérer la ressource de manière préventive en partant du principe qu'elle est essentielle pour la page Web.

Si elle n'est pas utilisée correctement, la préchargement peut nuire aux performances en effectuant des requêtes inutiles pour des ressources qui ne sont pas utilisées. Dans cette application, details.css est un autre fichier CSS situé à la racine du projet, mais utilisé pour un /details route distinct. Pour montrer un exemple d'utilisation incorrecte du préchargement, ajoutez également un indice de préchargement pour cette ressource.

<head>
  <!-- ... -->
  <link rel="preload" href="main.css" as="style">
  <link rel="preload" href="details.css" as="style">
</head>

Rechargez l'application et examinez le panneau Réseau. Une requête est envoyée pour récupérer details.css, même s'il n'est pas utilisé par la page Web.

Panneau &quot;Réseau&quot; avec préchargement inutile

Chrome affiche un avertissement dans le panneau Console lorsqu'une ressource préchargée n'est pas utilisée par la page quelques secondes après son chargement.

Avertissement de préchargement dans la console

Utilisez cet avertissement pour identifier les ressources préchargées qui ne sont pas utilisées immédiatement par votre page Web. Vous pouvez maintenant supprimer le lien de préchargement inutile pour cette page.

<head>
  <!-- ... -->
  <link rel="preload" href="main.css" as="style">
  <link rel="preload" href="details.css" as="style">
</head>

Pour obtenir la liste de tous les types de ressources pouvant être récupérés, ainsi que les valeurs correctes à utiliser pour l'attribut as, consultez l'article MDN sur le préchargement.

Précharger les ressources futures

La prérécupération est une autre indication de navigateur qui peut être utilisée pour demander un élément utilisé pour un autre itinéraire de navigation, mais à une priorité inférieure à celle des autres éléments importants nécessaires pour la page actuelle.

Sur ce site Web, lorsque vous cliquez sur l'image, vous êtes redirigé vers un autre itinéraire details/.

Détails de l&#39;itinéraire

Un fichier CSS distinct, details.css, contient tous les styles nécessaires pour cette page simple. Ajoutez un élément de lien à index.html pour précharger cette ressource.

<head>
  <!-- ... -->
  <link rel="prefetch" href="details.css">
</head>

Pour comprendre comment cela déclenche une requête pour le fichier, ouvrez le panneau Réseau dans les outils pour les développeurs et décochez l'option Désactiver le cache.

Désactiver le cache dans les outils pour les développeurs Chrome

Rechargez l'application et notez qu'une requête de très faible priorité est effectuée pour details.css une fois que tous les autres fichiers ont été récupérés.

Panneau &quot;Réseau&quot; avec une ressource préchargée

Une fois les outils de développement ouverts, cliquez sur l'image du site Web pour accéder à la page details. Étant donné qu'un élément de lien est utilisé dans details.html pour récupérer details.css, une requête est effectuée pour la ressource comme prévu.

Requêtes réseau de la page &quot;Détails&quot;

Cliquez sur la requête réseau details.css dans les outils de développement pour afficher ses détails. Vous remarquerez que le fichier est récupéré à partir du cache disque du navigateur.

Détails de la demande récupérés à partir du cache disque

En tirant parti du temps d'inactivité du navigateur, la prélecture permet de demander une ressource nécessaire pour une autre page de manière anticipée. Cela accélère les futures requêtes de navigation en permettant au navigateur de mettre en cache l'élément plus tôt et de le diffuser à partir du cache si nécessaire.

Préchargement et prélecture avec webpack

L'article Réduire les charges utiles JavaScript avec le fractionnement du code explique comment utiliser les importations dynamiques pour fractionner un bundle en plusieurs blocs. Cela est illustré par une application simple qui importe dynamiquement un module à partir de Lodash lorsqu'un formulaire est envoyé.

Application Magic Sorter qui illustre le fractionnement du code

Vous pouvez accéder à Glitch pour cette application ici.

Le bloc de code suivant, qui se trouve dans src/index.js,, est responsable de l'importation dynamique de la méthode lorsque l'utilisateur clique sur le bouton.

form.addEventListener("submit", e => {
  e.preventDefault()
  import('lodash.sortby')
    .then(module => module.default)
    .then(sortInput())
    .catch(err => { alert(err) });
});

La division d'un bundle améliore le temps de chargement des pages en réduisant sa taille initiale. La version 4.6.0 de webpack permet de précharger ou de préextraire les blocs importés de manière dynamique. En utilisant cette application comme exemple, la méthode lodash peut être préchargée pendant le temps d'inactivité du navigateur. Lorsqu'un utilisateur appuie sur le bouton, la ressource est récupérée sans délai.

Utilisez le paramètre de commentaire webpackPrefetch spécifique dans une importation dynamique pour précharger un bloc particulier. Voici à quoi cela ressemblerait avec cette application en particulier.

form.addEventListener("submit", e => {
  e.preventDefault()
  import(/* webpackPrefetch: true */ 'lodash.sortby')
    .then(module => module.default)
    .then(sortInput())
    .catch(err => { alert(err) });
});

Une fois l'application rechargée, webpack insère une balise de préchargement pour la ressource dans l'en-tête du document. Vous pouvez le voir dans le panneau Éléments des outils de développement.

Panneau &quot;Éléments&quot; avec une balise de préchargement

L'observation des requêtes dans le panneau Réseau montre également que ce bloc est récupéré avec une faible priorité après que toutes les autres ressources ont été demandées.

Panneau &quot;Réseau&quot; avec requête préchargée

Bien que la prélecture soit plus adaptée à ce cas d'utilisation, webpack prend également en charge le préchargement des blocs importés dynamiquement.

import(/* webpackPreload: true */ 'module')

Conclusion

Grâce à cet atelier de programmation, vous devriez avoir une bonne compréhension de la façon dont le préchargement ou la prélecture de certains éléments peuvent améliorer l'expérience utilisateur de votre site. Il est important de noter que ces techniques ne doivent pas être utilisées pour toutes les ressources et que leur utilisation incorrecte peut nuire aux performances. Les meilleurs résultats sont obtenus en préchargeant ou en préextrayant sélectivement.

En résumé :

  • Utilisez preload pour les ressources découvertes tardivement, mais essentielles à la page actuelle.
  • Utilisez prefetch pour les ressources nécessaires à un futur itinéraire de navigation ou à une action de l'utilisateur.

Tous les navigateurs ne sont pas compatibles avec le préchargement et la prélecture. Cela signifie que tous les utilisateurs de votre application ne remarqueront pas forcément d'amélioration des performances.

Pour en savoir plus sur des aspects spécifiques de l'impact du préchargement et de la prélecture sur votre page Web, consultez les articles suivants :