Como, no seu exemplo, o servidor da Web sempre enviava CSS e imagens, independentemente de o cliente já as ter, desperdiçando muito a largura de banda (e, assim, tornando a conexão mais lenta , em vez de mais rápida, reduzindo a latência, que era provavelmente sua intenção). Observe que os arquivos CSS, JavaScript e de imagem geralmente são enviados com tempos de expiração muito longos exatamente por esse motivo (como quando você precisa alterá-los, basta alterar o nome do arquivo para forçar uma nova cópia, que será novamente armazenada em cache por um longo tempo).
Agora, você pode tentar solucionar esse desperdício de largura de banda dizendo " OK, mas o cliente pode indicar que ele já possui alguns desses recursos, para que o servidor não o envie novamente ". 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"
E, em seguida, apenas os arquivos que não foram alterados são enviados por uma conexão TCP (usando pipelining HTTP por conexão persistente). E adivinha? É assim que ele já funciona (você também pode usar If-Modified-Since em vez de If-None-Match ).
Mas se você realmente deseja reduzir a latência, desperdiçando muita largura de banda (como em sua solicitação original), pode fazer isso hoje usando o HTTP / 1.1 padrão ao criar seu site. A razão pela qual a maioria das pessoas não faz isso é porque não acha que vale a pena.
Para fazer isso, você não precisa ter CSS ou JavaScript em um arquivo separado, pode incluí-los no arquivo HTML principal usando tags <style>
e <script>
(você provavelmente nem precisa fazê-lo manualmente, o mecanismo de modelos provavelmente o faz automaticamente) . Você pode até incluir imagens no arquivo HTML usando o URI de dados , assim:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
Obviamente, a codificação base64 aumenta um pouco o uso da largura de banda, mas se você não se importa com a largura de banda desperdiçada, isso não deve ser um problema.
Agora, se você realmente se importa, pode até criar scripts da web inteligentes o suficiente para obter o melhor dos dois mundos: na primeira solicitação (o usuário não possui um cookie), envie tudo (CSS, JavaScript, imagens) incorporados em apenas um único HTML como descrito acima, adicione um link rel = "prefetch" para cópias externas dos arquivos e adicione um cookie. Se o usuário já tem um cookie (ex. Que visitou antes), em seguida, enviar-lhe apenas um HTML normal com <img src="example.jpg">
, <link rel="stylesheet" type="text/css" href="style.css">
etc.
Portanto, na primeira visita, o navegador solicita apenas um único arquivo HTML e obtém e mostra tudo. Em seguida, ele (quando ocioso) pré-carregava imagens CSS, JS externas especificadas. Na próxima vez que o usuário visitar, o navegador solicitará e obterá apenas recursos alterados (provavelmente apenas um novo HTML).
Os dados extras das imagens CSS + JS + seriam enviados apenas duas vezes, mesmo se você clicar centenas de vezes no site. Muito melhor do que centenas de vezes, conforme sugerido pela solução proposta. E nunca (nem na primeira vez nem nas próximas) usaria mais de uma viagem de ida e volta com aumento de latência.
Agora, se isso parecer muito trabalhoso, e você não quiser seguir outro protocolo como o SPDY , já existem módulos como mod_pagespeed para Apache, que podem fazer parte desse trabalho automaticamente para você (mesclando vários arquivos CSS / JS em um, autoinlinando CSS pequeno e minimizando-o, crie pequenas imagens embutidas de espaço reservado enquanto aguarda o carregamento de originais, carregamento lento de imagens etc.) sem exigir que você modifique uma única linha da sua página da web.