J'optimisais le temps de chargement d'un site Web. L'un des moyens consistait à combiner plusieurs requêtes HTTP pour CSS en une requête HTTP combinée. Mais l'un des relecteurs a posé une question intéressante: la parallélisation du téléchargement de plusieurs fichiers CSS ne réduirait-elle pas le temps de chargement des pages?
Je n'ai jamais envisagé cette option, car la seule chose que j'ai lue sur Internet est que la réduction du nombre de requêtes HTTP (bloquantes) est la clé d'une page Web plus rapide (bien que Google Pagespeed Insights ne semble pas l'indiquer clairement 1 ).
Je vois quelques raisons pour lesquelles la parallellisation n’améliorerait pas les performances, ou n’aurait que peu d’importance (compensée par l’avantage d’utiliser moins de requêtes HTTP):
Alors, y a-t-il un avantage à paralléliser les requêtes HTTP pour les fichiers CSS?
Note/mise à jour: tous les fichiers CSS bloquent le rendu. Les fichiers CSS qui n'ont pas déjà été déplacés en dehors du chemin critique.
Les fichiers CSS liés à partir de documents HTML sont ajoutés à la file d'attente de téléchargement parallèle à mesure que le code HTML est analysé. L'essentiel est que les liens JavaScript non asynchrones bloquent l'analyseur HTML, empêchant l'ajout de balises ultérieures à la file d'attente de téléchargement jusqu'à ce que JavaScript soit téléchargé, analysé et exécuté.[1]
Voici un exemple qui oblige le navigateur à télécharger trois des quatre fichiers de manière séquentielle (au moins trois allers-retours):
<head>
<script src="js/fizz.js"></script>
<link rel="stylesheet" href="css/foo.css"/>
<script src="js/buzz.js"></script>
<link rel="stylesheet" href="css/bar.css"/>
</head>
Voici l'exemple retravaillé pour que les 4 fichiers soient téléchargés en parallèle (au moins un aller-retour):
<head>
<link rel="stylesheet" href="css/foo.css"/>
<link rel="stylesheet" href="css/bar.css"/>
<script async src="js/fizz.js"></script>
<script src="js/buzz.js"></script>
</head>
Autre remarque: les fichiers CSS bloquent le rendu, pas l’analyseur; la page continuera à être analysée et le DOM construit, mais le rendu ne commencera pas tant que le CSSOM ne sera pas construit.
La principale raison de la scission de vos CSS est d'obtenir le minimum de règles nécessaires pour rendre le contenu au-dessus du pli au client, puis analysé le plus rapidement possible. Le reste des règles, pour les éléments qui ne sont pas immédiatement visibles, peut être marqué comme ne bloquant pas nécessairement le rendu avec les requêtes media
dans la balise link, ou ajouté à la page par du code JavaScript chargé de manière asynchrone.
Il n’ya donc aucun avantage clair à paralléliser vos téléchargements CSS uniquement pour vous-même. Mais comme toujours, mesurez et testez!
Pour en savoir plus, je vous recommande les articles suivants sur Google: "Principes fondamentaux du Web: optimiser les performances": https://developers.google.com/web/fundamentals/performance/
[1]: Ceci ignore la fonctionnalité d'analyse spéculative de certains navigateurs:
https://developer.mozilla.org/en-US/docs/Web/HTML/Optimizing_your_pages_for_speculative_parsing