Denn in Ihrem Beispiel würde der Webserver immer CSS und Bilder senden, unabhängig davon, ob der Client bereits über diese verfügt. Dadurch würde Bandbreite stark verschwendet (und die Verbindung wird langsamer anstatt schneller, da die Latenz verringert wird, was vermutlich Ihre Absicht war). Beachten Sie, dass CSS-, JavaScript- und Bilddateien in der Regel aus genau diesem Grund mit sehr langen Ablaufzeiten gesendet werden (wenn Sie sie ändern müssen, ändern Sie einfach den Dateinamen, um eine neue Kopie zu erzwingen, die erneut für lange Zeit zwischengespeichert wird).
Jetzt können Sie versuchen, diese Bandbreitenverschwendung zu umgehen, indem Sie " OK " sagen. Der Client kann jedoch angeben, dass einige dieser Ressourcen bereits vorhanden sind, sodass der Server sie nicht erneut sendet. " So etwas wie:
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"
Und dann werden nur die Dateien, die sich nicht geändert haben, über eine TCP-Verbindung gesendet (mithilfe von HTTP-Pipelining über eine dauerhafte Verbindung). Und rate was? So funktioniert es bereits (Sie können auch If-Modified-Since anstelle von If-None-Match verwenden ).
Wenn Sie jedoch die Latenz reduzieren möchten, indem Sie viel Bandbreite verschwenden (wie in Ihrer ursprünglichen Anfrage), können Sie dies heute mit Standard-HTTP / 1.1 bei der Gestaltung Ihrer Website tun. Der Grund, warum die meisten Leute es nicht tun, ist, dass sie es nicht für wert halten.
Um dies zu tun, müssen Sie kein CSS oder JavaScript in einer separaten Datei haben. Sie können diese in die Haupt-HTML-Datei einbinden, indem Sie <style>
und <script>
-Tags verwenden (Sie müssen es wahrscheinlich nicht einmal manuell tun, Ihre Template-Engine kann es wahrscheinlich automatisch tun). . Sie können sogar Bilder in die HTML-Datei einbinden , indem Sie den Daten-URI wie folgt verwenden:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
Natürlich erhöht die Base64-Codierung die Bandbreitennutzung geringfügig, aber wenn Sie sich nicht für verschwendete Bandbreite interessieren, sollte dies kein Problem sein.
Wenn es Sie wirklich interessiert, können Sie Ihre Web-Skripte sogar so intelligent gestalten, dass Sie das Beste aus beiden Welten herausholen: Senden Sie auf erste Anfrage (Benutzer hat kein Cookie) alles (CSS, JavaScript, Bilder), das in einem einzigen HTML-Code eingebettet ist Datei wie oben beschrieben, fügen Sie einen Link rel = "Prefetch" -Tags für externe Kopien der Dateien hinzu und fügen Sie ein Cookie hinzu. Hat der Benutzer bereits ein Cookie (zB das er schon einmal besucht hat), dann schicke ihm einfach ein normales HTML mit <img src="example.jpg">
, <link rel="stylesheet" type="text/css" href="style.css">
etc.
Beim ersten Besuch des Browsers wird also nur eine einzige HTML-Datei angefordert und alles abgerufen und angezeigt. Dann würde es (im Leerlauf) angegebenes externes CSS, JS, Images vorladen. Beim nächsten Besuch des Benutzers würde der Browser nur geänderte Ressourcen anfordern und abrufen (wahrscheinlich nur neues HTML).
Die zusätzlichen CSS + JS + -Bilddaten werden immer nur zweimal gesendet, selbst wenn Sie hunderte Male auf der Website geklickt haben. Viel besser als hunderte Male, wie von Ihrer vorgeschlagenen Lösung vorgeschlagen. Und es würde niemals (weder beim ersten noch beim nächsten Mal) mehr als eine latenzerhöhende Hin- und Rückfahrt verwenden.
Wenn das nach zu viel Arbeit klingt und Sie nicht mit einem anderen Protokoll wie SPDY arbeiten möchten , gibt es bereits Module wie mod_pagespeed für Apache, die einen Teil dieser Arbeit automatisch für Sie erledigen können (Zusammenführen mehrerer CSS / JS-Dateien) Sie können kleine CSS-Dateien automatisch in eine Zeile einfügen und diese verkleinern, kleine Bilder mit Platzhaltern in die Zeile einfügen, während Sie darauf warten, dass Originale geladen werden, Bilder verzögert geladen werden usw.), ohne dass Sie eine einzelne Zeile Ihrer Webseite ändern müssen.