Çünkü, örneğinizde, web sunucusu , müşterinin zaten elinde olup olmadığına bakılmaksızın , her zaman CSS ve görüntüler gönderir, böylece bant genişliğini büyük oranda boşa harcarsınız (ve böylece amacınızı yerine getirmek için gecikmeyi azaltmak yerine , bağlantıyı daha yavaş hale getirir ). CSS, JavaScript ve resim dosyalarının genellikle tam da bu nedenle çok uzun zaman aşımına uğrayan zamanlarla gönderildiğini unutmayın (bunları değiştirmeniz gerektiğinde olduğu gibi, tekrar uzun süre önbelleğe alınacak yeni kopyaya zorlamak için sadece dosya adını değiştirirsiniz).
Şimdi, " Tamam, ancak müşteri zaten bu kaynakların bir kısmına sahip olduğunu gösterebildiğinden, sunucunun tekrar göndermeyeceğini " söyleyerek bu bant genişliği israfına çalışmayı deneyebilirsiniz . Gibi bir şey:
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"
Ardından, yalnızca değişmemiş dosyaların bir TCP bağlantısı üzerinden gönderilmesini sağlayın (kalıcı bağlantı üzerinden HTTP boru hattını kullanarak). Ve tahmin et ne oldu? O nasıl zaten (ayrıca kullanabilirsiniz çalışır If-Modified-Since yerine If-None-Match ).
Ancak, çok fazla bant genişliği boşa harcayarak gecikmeyi azaltmak istiyorsanız (orijinal isteğinizde olduğu gibi), bugün web sitenizi tasarlarken standart HTTP / 1.1 kullanarak bunu yapabilirsiniz. Çoğu insanın bunu yapmamasının nedeni, buna değmeyeceğini düşünmeleridir.
Bunu yapmak için, CSS veya JavaScript’lerin ayrı bir dosyaya sahip olmanıza gerek yoktur, bunları <style>
ve <script>
etiketlerini kullanarak ana HTML dosyasına ekleyebilirsiniz (muhtemelen elle bile yapmanız gerekmez, şablon motorunuz muhtemelen otomatik olarak yapabilir) . URI'yi kullanarak veri dosyasını HTML dosyasına da dahil edebilirsiniz :
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
Tabi ki, base64 kodlaması, bant genişliği kullanımını biraz arttırır, ancak israf edilen bant genişliğini umursamıyorsanız, bu bir sorun olmamalıdır.
Şimdi, gerçekten önemsiyorsanız, web komut dosyalarını her iki dünyanın da en iyisini elde etmek için yeterince akıllı hale getirebilirsiniz: ilk istek üzerine (kullanıcının çerezleri yoktur), yalnızca tek bir HTML'ye gömülü her şeyi (CSS, JavaScript, resimler) gönderin Yukarıda açıklandığı gibi dosya, dosyaların harici kopyaları için bir link rel = "prefetch" etiketleri ekleyin ve bir çerez ekleyin. Kullanıcı zaten (örn. Daha önce ziyaret ettiği) bir çerez varsa, o zaman ona sadece normal bir HTML göndermek <img src="example.jpg">
, <link rel="stylesheet" type="text/css" href="style.css">
vb
Böylece ilk ziyaretinizde tarayıcı sadece tek bir HTML dosyası ister ve her şeyi alır ve gösterirdi. Sonra (boştayken) belirtilen harici CSS, JS, resimleri önceden yüklerdi. Kullanıcı bir dahaki sefere ziyaret ettiğinde, tarayıcı yalnızca değiştirilmiş kaynakları talep eder ve alır (muhtemelen sadece yeni HTML).
Ekstra CSS + JS + görüntü verileri, web sitesinde yüzlerce kez tıklasanız bile, yalnızca iki kez gönderilir. Önerdiğiniz çözümün önerdiği gibi yüzlerce kez çok daha iyi. Ve asla (değil ilk kez, ne de sonraki günler) birden kullanmak bir gecikme artan gidiş-dönüş.
Şimdi, eğer kulağa çok iş gibi geliyorsa ve SPDY gibi başka bir protokolle gitmek istemiyorsanız , Apache için mod_pagespeed gibi modüller var, bu çalışmaların bir kısmını sizin için otomatik olarak yapabilir (birden fazla CSS / JS dosyasını birleştirerek) Birine, küçük CSS'leri otomatik olarak yerleştirme ve küçük resim yapma, orijinallerin yüklenmesini, tembel yükleme görüntülerini vb. bekletmeden web sayfanızın tek bir satırını değiştirmenize gerek kalmadan küçük yer tutucuya çizili görüntüler yapın.