Как мы кешируем HTML-фрагменты? - PullRequest
5 голосов
/ 14 сентября 2011

У меня есть страница, которая выглядит так:

<!doctype html>
<head></head>
<body>
    <div>Content 1000 chars</div>
    <div>Content 1000 chars</div>
    <div>Content 1000 chars</div>
</body>
</html>

Когда клиент загружает страницу, в основном он загружает 3100 символов. Если он снова заходит на страницу и содержимое первого div изменяется, ему придется заново загрузить всю страницу (3100 символов).

Теперь мне было интересно, можем ли мы кэшировать фрагменты HTML так же, как мы делаем с изображениями?

Итак, я подумал, есть ли где-нибудь, чтобы получить этот эффект:

 <!doctype html>
<head></head>
<body>
    <div src="page1.html"></div>
    <div src="page2.html"></div>
    <div src="page3.html"></div>
</body>
</html>

Так что, если бы я изменил содержимое page1.html, браузер смог бы узнать, что с момента последнего посещения был изменен только page1.html, и загрузить 1000 символов вместо всей страницы (3100) символов. По сути, это поведение идентично тому, что происходит сейчас с изображениями:

 <!doctype html>
<head></head>
<body>
    <img src="img1.gif">
    <img src="img2.gif">
    <img src="img3.gif">
</body>
</html>

, при этом изменение img1.gif вызывает браузер для повторной загрузки только img1.gif (при условии, что все остальные файлы не были отредактированы)

Чтобы было ясно, я не ищу решение AJAX. Мне нужно решение, которое работает без JavaScript (как со всеми приведенными выше примерами). Я также не особо поддерживаю решение кадров, однако я бы принял это как ответ, если просто нет других альтернатив / причуда / хаки

Ответы [ 4 ]

4 голосов
/ 14 сентября 2011

Думали ли вы об IFrames?

Однако я думаю, что это такая микрооптимизация, что у нее не было бы никаких преимуществ (кроме кеширования внутри серверных приложений, что совершенно другое'черви).

(или вы говорите о way более 3000 символов здесь.)

Edit: There is другое решение, но оно не поддерживается в любом браузере для документов HTML без использования AJAX и только в некоторых серверных сценариях: HTTP Range запросов .Вы можете указать серверу с дополнительным заголовком, чтобы он возвращал только определенный диапазон документа:

GET /large-document.html HTTP/1.1
Accept-Range: bytes
Range: bytes=0-500

Ответ будет содержать только первые 500 байтов. Этот метод используется для возобновления прерванногозагрузки, например.

Но, как я уже сказал, это не поможет вам в вашем сценарии.С одной стороны, ни один браузер не поддерживает это без AJAX (или без менеджера загрузки).И, во-вторых, клиент не знает, какой диапазон запрашивать, и где поместить его в уже извлеченный документ для замены старой части.

Если вам действительно нужна поддержкаустаревшие браузеры вплоть до IE3 и Netscape 2 и даже старые текстовые браузеры, такие как устаревшие версии Lynx, используют классический <frameset>, а не <iframe>.Он поддерживается практически во всем с древних времен Мозаики и был специально разработан для этой задачи.(Тогда это был инструмент выбора, когда вышли браузеры, которые вы пытаетесь поддерживать.)

1 голос
/ 14 сентября 2011

Современные версии Firefox и Chrome делают это изначально - они кэшируют изображения и код всякий раз, когда могут.Фактически, единственный способ получить перезагрузку - это очистить кеш на уровне браузера.

Возможно, вы также захотите изучить кеширование с обратным прокси-сервером, которое, по сути, делает то, что вы делаете на уровне сайта, дляизбегать трафика БД. Varnish - хороший вариант для кэширования страниц, который можно настраивать.

1 голос
/ 14 сентября 2011

Единственный способ достичь желаемого без JavaScript - это использование frames .Однако у есть ряд недостатков для фреймов , о которых вы должны знать, прежде чем использовать их на своем сайте.

0 голосов
/ 14 сентября 2011

Я не знаю, разумно ли проводить такую ​​оптимизацию.Современные браузеры допускают сжатие данных (и современные серверы делают это), и текст сжимается очень хорошо.Вы должны использовать буферизацию вывода (например, см. ob_start в PHP ), чтобы страница не отправлялась сервером по кусочкам в крошечных порциях, но некоторое время она будет ждать, пока выходные данные будут готовы, затем сожмите его и отправьте клиенту, а клиент распакует его.

В настоящее время использование фреймов в качестве метода компоновки крайне не рекомендуется (возможно, iframes иногда являются хорошим решением, но это зависит).

...