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échargeant quelques ressources:

Capture d'écran de l'application

Mesurer

Commencez par mesurer les performances du site Web avant d'ajouter des optimisations.

  • Pour prévisualiser le site, appuyez sur View App (Afficher l'application), puis sur Fullscreen (Plein écran) plein écran.

Exécutez l'audit de performances Lighthouse (Lighthouse > Options > Performance) sur la version en ligne de votre Glitch (consultez également Découvrir les opportunités de performances avec Lighthouse).

Lighthouse affiche l'audit suivant ayant échoué pour une ressource récupérée tardivement:

Lighthouse : audit du préchargement des requêtes clés
  • Appuyez sur Ctrl+Maj+J (ou Cmd+Option+J sur Mac) pour ouvrir DevTools.
  • Cliquez sur l'onglet Réseau.
Panneau "Network" (Réseau) avec ressource découverte tardivement

Le fichier main.css n'est pas extrait 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é que après que le navigateur a terminé l'analyse et l'exécution du fichier JavaScript. 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 requêtes critiques représente l'ordre des ressources qui sont priorisées et extraites par le navigateur. Pour cette page Web, il se présente actuellement comme suit:

├─┬ / (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êtes, 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 indiquer au navigateur de le télécharger plus tôt en ajoutant un élément Link à l'en-tête du document.

Ajoutez un tag 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 Network (Réseau) dans DevTools.

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

Notez que le navigateur extrait le fichier CSS avant même que l'analyse JavaScript chargée de l'extraire ne soit terminée. Avec le préchargement, le navigateur sait effectuer une récupération préventive de la ressource en supposant qu'elle est essentielle pour la page Web.

Si elle n'est pas utilisée correctement, la précharge peut nuire aux performances en envoyant 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>

Actualisez l'application et examinez le panneau Network (Réseau). Une requête est envoyée pour récupérer details.css, même si elle n'est pas utilisée par la page Web.

Panneau &quot;Network&quot; (Réseau) avec un 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 dans les quelques secondes qui suivent son chargement.

Avertissement de préchargement dans la console

Utilisez cet avertissement comme indicateur pour déterminer si des ressources préchargées ne sont pas immédiatement utilisées 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écharge est une autre indication du navigateur qui peut être utilisée pour envoyer une requête pour un composant utilisé pour un autre parcours de navigation, mais avec une priorité inférieure à celle des autres composants importants nécessaires à la page actuelle.

Sur ce site Web, cliquer sur l'image vous redirige 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 à 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 Network (Réseau) dans les outils de développement et décochez l'option Disable cache (Désactiver le cache).

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

Actualisez l'application. Vous remarquerez qu'une requête de priorité très faible est envoyée pour details.css une fois que tous les autres fichiers ont été récupérés.

Panneau &quot;Network&quot; (Réseau) avec 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 envoyée pour la ressource comme prévu.

Requêtes réseau de la page d&#39;informations

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

Requête de détails récupérée à partir du cache de disque

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

Préchargement et préchargement avec webpack

L'article Réduire les charges utiles JavaScript avec le fractionnement du code explore l'utilisation d'importations dynamiques pour diviser un groupe en plusieurs segments. 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 la division 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) });
});

Diviser un bundle améliore les 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écharger des blocs importés de manière dynamique. En utilisant cette application comme exemple, la méthode lodash peut être pré-extraite lorsque le navigateur est inactif. Lorsqu'un utilisateur appuie sur le bouton, la ressource n'est pas retardée.

Utilisez le paramètre de commentaire webpackPrefetch spécifique dans une importation dynamique pour précharger un bloc spécifique. 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 actualisée, webpack injecte une balise de préchargement pour la ressource dans la section "head" du document. Vous pouvez le voir dans le panneau Éléments des outils de développement.

Panneau des éléments avec balise de préchargement

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

Panneau &quot;Network&quot; avec requête pré-extraite

Bien que le préchargement soit plus judicieux dans ce cas d'utilisation, webpack permet également de précharger les fragments importés de manière dynamique.

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 le préchargement de certains éléments peut améliorer l'expérience utilisateur sur votre site. Il est important de mentionner que ces techniques ne doivent pas être utilisées pour toutes les ressources. Une utilisation incorrecte peut nuire aux performances. Les meilleurs résultats sont obtenus en ne préchargeant ou en ne préchargeant que de manière sélective.

En résumé :

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

Actuellement, tous les navigateurs ne prennent pas en charge à la fois le préchargement et le préchargement. Cela signifie que tous les utilisateurs de votre application ne verront pas forcément une amélioration des performances.

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