Потому что, в вашем примере, веб-сервер будет всегда отправлять CSS и изображения независимо от того, есть ли их у клиента, что приводит к значительному снижению пропускной способности (и, следовательно, замедлению соединения , а не ускорению за счет уменьшения задержки, что, по-видимому, было вашим намерением). Обратите внимание, что файлы CSS, JavaScript и изображения обычно отправляются с очень большим временем истечения именно по этой причине (например, когда вам нужно изменить их, вы просто изменяете имя файла, чтобы принудительно создать новую копию, которая снова будет кэшироваться в течение длительного времени).
Теперь вы можете попытаться обойти эту потерю пропускной способности, сказав: « ОК, но клиент может указать, что у него уже есть некоторые из этих ресурсов, поэтому сервер не будет отправлять его снова ». Что-то вроде:
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"
И затем получают только те файлы, которые не изменились, и отправляются через одно TCP-соединение (с использованием HTTP-конвейеризации через постоянное соединение). И угадайте, что? Это то, как это уже работает (вы можете также использовать If-Modified-Since вместо If-None-Match ).
Но если вы действительно хотите уменьшить задержку, тратя много трафика (как в исходном запросе), вы можете сделать это сегодня, используя стандартный HTTP / 1.1 при разработке вашего сайта. Причина, по которой большинство людей этого не делают, заключается в том, что они не думают, что это того стоит.
Чтобы сделать это, вам не нужно иметь CSS или в JavaScript в отдельном файле, вы можете включить их в основной HTML файл с помощью <style>
и <script>
тегов (вы , вероятно , даже не нужно делать это вручную, ваш шаблон двигатель , вероятно , может сделать это автоматически) , Вы даже можете включить изображения в файл HTML, используя URI данных , например так:
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
Конечно, кодирование base64 немного увеличивает использование полосы пропускания, но если вы не заботитесь о потраченной пропускной способности, это не должно быть проблемой.
Теперь, если вы действительно заботитесь, вы можете даже сделать свои веб-скрипты достаточно умными, чтобы получить лучшее из обоих миров: по первому запросу (у пользователя нет cookie), отправляйте все (CSS, JavaScript, изображения), встроенные только в один HTML файл, как описано выше, добавьте ссылку rel = "prefetch" теги для внешних копий файлов и добавьте cookie. Если пользователь уже имеет печенье (например, он посетил ранее), а затем отправить его просто обычный HTML с <img src="example.jpg">
, и <link rel="stylesheet" type="text/css" href="style.css">
т.д.
Поэтому при первом посещении браузер запрашивает только один HTML-файл и получает и показывает все. Затем он будет (при простое) предварительно загружать указанные внешние CSS, JS, изображения. При следующем посещении пользователя браузер будет запрашивать и получать только измененные ресурсы (возможно, просто новый HTML).
Дополнительные данные изображений CSS + JS + будут отправлены только дважды, даже если вы кликнули сотни раз на веб-сайте. Намного лучше, чем сотни раз, как предложено вами. И он никогда (ни в первый раз, ни в следующий раз) не будет использовать более одного увеличения времени ожидания.
Теперь, если это звучит как слишком много работы, и вы не хотите использовать другой протокол, такой как SPDY , уже есть модули, такие как mod_pagespeed для Apache, которые могут автоматически выполнять часть этой работы за вас (объединяя несколько файлов CSS / JS). в один, автоматически вставляя небольшой CSS и минимизируя их, создавайте небольшие встроенные изображения-заполнители, ожидая загрузки оригиналов, ленивой загрузки изображений и т. д.), не требуя изменения одной строки веб-страницы.