Porque, en su ejemplo, el servidor web siempre enviaría CSS e imágenes independientemente de si el cliente ya las tiene, lo que desperdiciará mucho el ancho de banda (y por lo tanto la conexión será más lenta , en lugar de hacerlo más rápido, reduciendo la latencia, que presumiblemente era su intención). Tenga en cuenta que los archivos CSS, JavaScript e imágenes generalmente se envían con tiempos de caducidad muy largos por exactamente ese motivo (ya que cuando necesita cambiarlos, simplemente cambia el nombre del archivo para forzar una nueva copia que nuevamente se almacenará en caché durante mucho tiempo).
Ahora, puede intentar evitar ese desperdicio de ancho de banda diciendo " OK, pero el cliente podría indicar que ya tiene algunos de esos recursos, por lo que el servidor no lo volvería a enviar ". Algo como:
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"
Y luego, solo los archivos que no han cambiado se envían a través de una conexión TCP (usando la canalización HTTP a través de una conexión persistente). ¿Y adivina qué? Es la forma en que ya funciona (también se puede utilizar If-Modified-Since en lugar de Si-None-Match ).
Pero si realmente desea reducir la latencia desperdiciando mucho ancho de banda (como en su solicitud original), puede hacerlo hoy usando HTTP / 1.1 estándar al diseñar su sitio web. La razón por la que la mayoría de las personas no lo hacen es porque no creen que valga la pena.
Para hacerlo, no necesita tener CSS o JavaScript en un archivo separado, puede incluirlos en el archivo HTML principal mediante el uso de <style>
y <script>
etiquetas (probablemente ni siquiera necesite hacerlo manualmente, su motor de plantillas probablemente pueda hacerlo automáticamente) . Incluso puede incluir imágenes en el archivo HTML utilizando URI de datos , como este:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
Por supuesto, la codificación base64 aumenta ligeramente el uso del ancho de banda, pero si no le importa el ancho de banda desperdiciado, eso no debería ser un problema.
Ahora, si realmente le importaba, incluso podría hacer que sus scripts web fueran lo suficientemente inteligentes como para obtener lo mejor de ambos mundos: a primera solicitud (el usuario no tiene una cookie), envíe todo (CSS, JavaScript, imágenes) incrustado solo en un solo HTML archivo como se describió anteriormente, agregue un enlace rel = "prefetch" para copias externas de los archivos y agregue una cookie. Si el usuario ya tiene una cookie (por ejemplo, la ha visitado antes), envíele un HTML normal con <img src="example.jpg">
, <link rel="stylesheet" type="text/css" href="style.css">
etc.
Entonces, en la primera visita, el navegador solicitará solo un archivo HTML y obtendrá y mostrará todo. Entonces (cuando está inactivo) precargaría CSS, JS, imágenes externas especificadas. La próxima vez que el usuario visite, el navegador solicitará y solo obtendrá recursos modificados (probablemente solo HTML nuevo).
Los datos adicionales de las imágenes CSS + JS + solo se enviarían dos veces, incluso si hace clic cientos de veces en el sitio web. Mucho mejor que cientos de veces como sugirió su solución propuesta. Y nunca (ni la primera vez ni las próximas veces) usaría más de un viaje de ida y vuelta que aumenta la latencia.
Ahora, si eso suena como demasiado trabajo, y no desea usar otro protocolo como SPDY , ya hay módulos como mod_pagespeed para Apache, que pueden hacer automáticamente algo de ese trabajo por usted (fusionando múltiples archivos CSS / JS en uno, alineando automáticamente un CSS pequeño y minimizándolos, haga pequeñas imágenes en línea de marcador de posición mientras espera que se carguen los originales, cargue imágenes diferidas, etc.) sin requerir que modifique una sola línea de su página web.