Ponieważ w twoim przykładzie serwer WWW zawsze wysyła CSS i obrazy, niezależnie od tego, czy klient już je ma, co znacznie marnuje przepustowość (a tym samym spowalnia połączenie , zamiast zmniejszać opóźnienie, co prawdopodobnie było twoim zamiarem). Pamiętaj, że właśnie z tego powodu pliki CSS, JavaScript i pliki graficzne są wysyłane z bardzo długim czasem wygaśnięcia (tak jak wtedy, gdy trzeba je zmienić, wystarczy zmienić nazwę pliku, aby wymusić nową kopię, która będzie ponownie buforowana przez długi czas).
Teraz możesz spróbować obejść problem marnowania przepustowości, mówiąc „ OK, ale klient może wskazać, że ma już niektóre z tych zasobów, więc serwer nie wyśle go ponownie ”. Coś jak:
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"
A następnie otrzymuj tylko te pliki, które nie uległy zmianie, wysyłane przez jedno połączenie TCP (przy użyciu potokowania HTTP zamiast trwałego połączenia). I zgadnij co? Tak to już działa (możesz także użyć If-Modified-Since zamiast If-None-Match ).
Ale jeśli naprawdę chcesz zmniejszyć opóźnienia, marnując dużo pasma (jak w pierwotnym żądaniu), możesz to zrobić dzisiaj, używając standardowego protokołu HTTP / 1.1 podczas projektowania witryny. Większość ludzi tego nie robi, ponieważ nie uważa, że warto.
Aby to zrobić, nie musisz mieć CSS lub JavaScript w osobnym pliku, możesz dołączyć je do głównego pliku HTML za pomocą tagów <style>
i <script>
(prawdopodobnie nie musisz nawet robić tego ręcznie, silnik szablonów prawdopodobnie zrobi to automatycznie) . Możesz nawet dołączyć obrazy do pliku HTML za pomocą URI danych , w następujący sposób:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
Oczywiście kodowanie base64 nieznacznie zwiększa wykorzystanie przepustowości, ale jeśli nie zależy ci na marnowanej przepustowości, nie powinno to stanowić problemu.
Teraz, jeśli naprawdę Ci na tym zależy, możesz nawet sprawić, że twoje skrypty internetowe będą wystarczająco inteligentne, aby uzyskać jak najlepszy efekt z obu światów: na pierwsze żądanie (użytkownik nie ma pliku cookie), wyślij wszystko (CSS, JavaScript, obrazy) osadzone tylko w jednym HTML plik jak opisano powyżej, dodaj link rel = "prefetch" tagi dla zewnętrznych kopii plików i dodaj plik cookie. Jeśli użytkownik ma już cookie (np. On odwiedził wcześniej), a następnie wysłać go po prostu normalnym HTML z <img src="example.jpg">
, <link rel="stylesheet" type="text/css" href="style.css">
etc.
Tak więc przy pierwszej wizycie przeglądarka zażąda tylko jednego pliku HTML i pobierze i pokaże wszystko. Następnie (w stanie bezczynności) wstępnie ładuje określone zewnętrzne CSS, JS, obrazy. Następnym razem, gdy użytkownik odwiedzi stronę, przeglądarka zażąda i pobierze tylko zmienione zasoby (prawdopodobnie tylko nowy HTML).
Dodatkowe dane obrazów CSS + JS + byłyby wysyłane tylko dwukrotnie, nawet jeśli klikniesz setki razy na stronie. Znacznie lepiej niż setki razy, jak sugeruje proponowane rozwiązanie. I nigdy nie użyłby (nie za pierwszym razem, ani następnym razem) więcej niż jednej podróży w obie strony zwiększającej opóźnienia.
Teraz, jeśli to brzmi jak zbyt dużo pracy, a nie chcesz korzystać z innego protokołu, takiego jak SPDY , istnieją już moduły, takie jak mod_pagespeed dla Apache, które mogą automatycznie wykonać dla ciebie część tej pracy (scalenie wielu plików CSS / JS w jednym, automatycznie wstawiając mały CSS i minimalizując je, twórz małe zastępcze wstawiane obrazy podczas oczekiwania na załadowanie oryginałów, leniwe ładowanie obrazów itp.) bez konieczności modyfikowania pojedynczego wiersza strony.