Тому що у вашому прикладі веб-сервер завжди надсилатиме 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 і мінімізуючи їх, зробіть маленькі зображення, заповнені заповнювачем, під час очікування завантаження оригіналів, ледачих завантажень зображень тощо), не вимагаючи зміни одного рядка веб-сторінки.