Perché, nel tuo esempio, il server web invierebbe sempre CSS e immagini indipendentemente dal fatto che il client li abbia già, sprecando notevolmente la larghezza di banda (e rendendo così la connessione più lenta , anziché più veloce riducendo la latenza, che era presumibilmente la tua intenzione). Si noti che i file CSS, JavaScript e di immagine vengono generalmente inviati con tempi di scadenza molto lunghi proprio per questo motivo (come quando è necessario modificarli, è sufficiente modificare il nome del file per forzare la nuova copia che verrà nuovamente memorizzata nella cache per molto tempo).
Ora, puoi provare a aggirare lo spreco di larghezza di banda dicendo " OK, ma il client potrebbe indicare che ha già alcune di quelle risorse, quindi il server non lo invierà di nuovo ". Qualcosa di simile a:
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 quindi ottenere solo i file che non sono stati modificati vengono inviati su una connessione TCP (utilizzando pipeline HTTP su connessione permanente). E indovina cosa? Funziona già così (potresti anche usare If-Modified-Since invece di If-None-Match ).
Ma se vuoi davvero ridurre la latenza sprecando molta larghezza di banda (come nella tua richiesta originale), puoi farlo oggi usando HTTP / 1.1 standard durante la progettazione del tuo sito web. Il motivo per cui molte persone non lo fanno è perché non pensano che ne valga la pena.
Per farlo, non è necessario disporre di CSS o JavaScript in un file separato, è possibile includerli nel file HTML principale utilizzando <style>
e <script>
tag (probabilmente non è nemmeno necessario farlo manualmente, il motore del modello può probabilmente farlo automaticamente) . Puoi anche includere immagini nel file HTML usando l'URI dei dati , in questo modo:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
Naturalmente, la codifica base64 aumenta leggermente l'utilizzo della larghezza di banda, ma se non ti interessa perdere la larghezza di banda, questo non dovrebbe essere un problema.
Ora, se ti interessa davvero, potresti persino rendere i tuoi script web abbastanza intelligenti da ottenere il meglio da entrambi i mondi: alla prima richiesta (l'utente non ha un cookie), invia tutto (CSS, JavaScript, immagini) incorporato in un unico HTML file come descritto sopra, aggiungere un collegamento rel = "prefetch" tag per copie esterne dei file e aggiungere un cookie. Se l'utente ha già un cookie (ad es. Ha già visitato in precedenza), inviagli solo un normale HTML con <img src="example.jpg">
, <link rel="stylesheet" type="text/css" href="style.css">
ecc.
Quindi alla prima visita il browser richiederebbe solo un singolo file HTML e ottenere e mostrare tutto. Quindi (quando inattivo) precaricherebbe CSS, JS, immagini esterne specificate. La volta successiva che l'utente visita, il browser richiede e ottiene solo le risorse modificate (probabilmente solo un nuovo HTML).
I dati extra di immagini CSS + JS + verrebbero inviati solo due volte, anche se si fa clic su centinaia di volte sul sito Web. Molto meglio di centinaia di volte come suggerito dalla soluzione proposta. E non avrebbe mai (né la prima volta né le volte successive) più di un viaggio di andata e ritorno che aumenta la latenza.
Ora, se sembra troppo lavoro e non vuoi andare con un altro protocollo come SPDY , ci sono già moduli come mod_pagespeed per Apache, che possono fare automaticamente un po 'di quel lavoro per te (unendo più file CSS / JS in uno, auto-inclinando piccoli CSS e minimizzandoli, crea piccole immagini con segnaposto in attesa di caricamento degli originali, caricamento pigro di immagini, ecc.) senza richiedere la modifica di una sola riga della tua pagina web.