change de nom...
Le pattern PRPL est une méthodologie utilisée pour que les pages Web se chargent et deviennent interactives, plus rapidement :
"P" pour Push ou Preload
"R" pour Render
"P" pour Pre-cache
"L" pour Lazy load
Dans cet article nous aborderons ces 4 techniques que vous pouvez utiliser ensemble ou de manière indépendante ainsi que les solutions open sources qui vous permettront d'atteindre vos objectifs de performance.
Source : https://web.dev/apply-instant-loading-with-prpl
Objectif :
Optimiser le chemin critique de rendu en réduisant le plus possible le temps entre la réception de l’HTML et la demande des ressources critiques (CSS et JS)
Afin d'accélérer le chargement de la page ainsi que de ses ressources, une technique consiste à demander ces dernières dès le début du chargement de la page.
Pour indiquer au navigateur qu'il doit télécharger en amont une ressource, on utilise les balises '<link rel="preload" href="/app.js" as="script">'.
Cette balise contient 3 informations :
Ainsi, lorsque l'asset est demandé, le navigateur a déjà anticipé son téléchargement, et l'interprétation du fichier se lance directement.
À noter qu'il existe d'autres directives que preload (parmi elles : "preconnect", "dns-prefetch").
Pour plus d'informations sur les directives de préchargements : https://developer.mozilla.org/en-US/docs/Web/HTML/Link_types/preconnect
<head>
<link rel="preload" href="style.css" as="style">
<link rel="preload" href="main.js" as="script">
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- Contenu -->
<script src="main.js" defer></script>
</body>
Objectif : faire en sorte que le First Paint arrive le plus tôt possible.
La solution : extraire les ressources non-bloquantes du chemin de rendu critique, et alléger les ressources bloquantes.
Afin d'extraire les ressources non bloquantes, une solution consiste à indiquer au navigateur qu'il en n'aura pas besoin pour effectuer le premier rendu de la page.
Pour cela, on utilise le mot clé "async" comme attribut dans les balises qui demandent un fichier.
Il est courant de voir ce mot clé accompagné de "defer", qui permet de retarder l'exécution de l'asset à la fin du chargement de la page.
On obtient ainsi une balise telle que "<script src="/app.js" defer async></script>".
Alléger les ressources bloquantes constituent le gros du travail :
Les outils :
Ressource : https://webpack.js.org/concepts/entry-points
Objectif : ne pas faire de requête si on n’en a pas besoin !
Une bonne configuration des caches HTTP permet aux navigateurs de minimiser le nombre de requêtes, et donc les temps de chargement.
De plus, il est possible dans le code front-end, d'implémenter une logique qui permet de stocker des données externes selon la logique métier.
Ceci peut être fait, par exemple, en utilisant la nouvelle API JS des Services Workers.
Les outils :
Objectif: réduire le poids et le nombre de ressources critiques en les traitant de manière asynchrone, après le premier rendu et chargement.
Pour répondre à cet objectif, une méthode courante pour réduire les nombre de ressources critiques est de charger les médias qui sont en dessous de la ligne de flottaison lorsque la page est rendue.
Par exemple, pour les images, on affiche un placeholder (un carré monochrome, une version floutée de l'image...) pendant le temps du chargement, pour ensuite afficher l'image originale lorsqu'elle est prête.
Cette technique peut même être utilisée sur les scripts JS. Par exemple, avec Webpack :
import(`./locale/${language}.json`).then(module => {
// do something with the translations
});
Les outils :
Il existe plein de bibliothèques (open-sources) de lazyloading. En voici une liste non-exhaustive :
J'espère que cet article vous aidera à améliorer vos performances web, vous pouvez également utiliser les techniques de mise en cache, packing et minification et/ou attendre notre prochain article qui clôturera la thématique, dans lequel nous parlerons d'HTTP/2...