Parce que, dans votre exemple, le serveur Web envoie toujours les fichiers CSS et les images, que le client les possède déjà, gaspillant ainsi beaucoup de bande passante (et ralentissant ainsi la connexion au lieu de la rendre plus rapide en réduisant la latence, ce qui était sans doute votre intention). Notez que les fichiers CSS, JavaScript et les fichiers image sont généralement envoyés avec des délais d'expiration très longs pour cette raison (par exemple, lorsque vous devez les modifier, il vous suffit de modifier le nom du fichier pour forcer la nouvelle copie, qui sera à nouveau mise en cache pendant une longue période).
Maintenant, vous pouvez essayer de contourner ce gaspillage de bande passante en disant " OK, mais le client pourrait indiquer qu'il dispose déjà de certaines de ces ressources, afin que le serveur ne l'envoie pas à nouveau ". Quelque chose comme:
GET /index.html HTTP/1.1
Host: www.example.com
If-None-Match: "686897696a7c876b7e"
Connection: Keep-Alive
GET /style.css HTTP/1.1
Host: www.example.com
If-None-Match: "70b26618ce2c246c71"
GET /image.png HTTP/1.1
Host: www.example.com
If-None-Match: "16d5b7c2e50e571a46"
Et ensuite, seuls les fichiers qui n'ont pas été modifiés sont envoyés via une seule connexion TCP (à l'aide du traitement en pipeline HTTP via une connexion persistante). Et devine quoi? C'est comme ça que ça fonctionne déjà (vous pouvez aussi utiliser If-Modified-Since au lieu de If-None-Match ).
Mais si vous voulez vraiment réduire le temps de latence en gaspillant beaucoup de bande passante (comme dans votre demande initiale), vous pouvez le faire aujourd'hui en utilisant la norme HTTP / 1.1 lors de la conception de votre site Web. La plupart des gens ne le font pas parce qu'ils ne pensent pas que cela en vaut la peine.
Pour ce faire, vous n'avez pas besoin d'avoir CSS ou JavaScript dans un fichier séparé, vous pouvez les inclure dans le fichier HTML principal en utilisant <style>
et <script>
tags (vous n'avez probablement même pas besoin de le faire manuellement, votre moteur de template peut probablement le faire automatiquement) . Vous pouvez même inclure des images dans le fichier HTML à l'aide de l'URI des données , comme ceci:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
Bien sûr, l’encodage en base64 augmente légèrement l’utilisation de la bande passante, mais si vous ne vous souciez pas de la bande passante gaspillée, cela ne devrait pas poser de problème.
Maintenant, si cela vous intéresse, vous pouvez même créer des scripts Web assez intelligents pour tirer le meilleur parti des deux mondes: à la première demande (l'utilisateur ne dispose pas de cookie), envoyez tout ce qu'il contient (CSS, JavaScript, images) au sein d'un seul code HTML. comme décrit ci-dessus, ajoutez un lien rel = "prefetch" pour les copies externes des fichiers et ajoutez un cookie. Si l'utilisateur a déjà un cookie (par exemple, il l'a déjà visité auparavant), envoyez-lui simplement un code HTML normal avec <img src="example.jpg">
, <link rel="stylesheet" type="text/css" href="style.css">
etc.
Ainsi, lors de la première visite, le navigateur demande un seul fichier HTML et affiche et affiche tout. Ensuite, il précèderait (lorsqu'il était inactif) les images CSS, JS et externes externes spécifiées. Lors de la prochaine visite de l'utilisateur, le navigateur demandera et obtiendra uniquement les ressources modifiées (probablement uniquement du nouveau HTML).
Les données d'images supplémentaires CSS + JS + ne seront envoyées que deux fois, même si vous avez cliqué des centaines de fois sur le site Web. Beaucoup mieux que des centaines de fois comme suggéré par votre solution proposée. Et il n’utilisera jamais (ni la première fois ni les suivantes) plus d’ un aller-retour augmentant le temps de latence.
Maintenant, si cela semble trop demander et que vous ne voulez pas utiliser un autre protocole tel que SPDY , il existe déjà des modules tels que mod_pagespeed pour Apache, qui peuvent automatiquement effectuer une partie de ce travail pour vous (fusion de plusieurs fichiers CSS / JS). en une seule, auto-alignant les petites CSS et les minimisant, créant de petites images en attente en attendant le chargement des originaux, un chargement paresseux des images, etc.) sans exiger que vous modifiiez une seule ligne de votre page Web.