Читаем Журнал «Компьютерра» № 20 от 30 мая 2006 года полностью

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

Этих проблем можно избежать, сжимая код с помощью Dojo Compressor (alex.dojotoolkit.org/shrinksafe), использующий Rhino (мозилловский JavaScript-движок, написанный на Java) для построения дерева, которое оптимизируется перед работой с файлами. С работой Dojo Compressor справляется неплохо, ресурсов отнимает немного. Расширив наш процесс сборки билда с помощью этого инструмента, мы можем забыть об экономии, писать пространные комментарии, вставлять сколько угодно пробелов и т. д. На рабочем коде это нисколько не отразится.

По сравнению с JavaScript CSS упаковывать легко. Поскольку в стилях практически не используются закавыченные строки (как правило, это пути или названия шрифтов), мы можем справиться с пробелами с помощью регулярных выражений. Если же у нас закавыченные строчки все же есть, мы почти всегда можем свести последовательности пробелов к одному пробелу (маловероятно, что последовательности, состоящие из нескольких пробелов, встретятся нам в указаниях путей или названиях шрифтов). Для этого нам вполне хватит простенького скрипта на Perl:


#!/usr/bin/perl

my $data = ‘’;

open F, $ARGV[0] or die «Can’t open source file: $!»;

$data .= $_ while ;

$data =~ s!/*(.*?)*/!!g; # remove comments

$data =~ s!s+! !g; # collapse space

$data =~ s!} !}n!g; # add line breaks

$data =~ s!n$!!; # remove last break

$data =~ s! { ! {!g; # trim inside brackets

$data =~ s!; }!}!g; # trim inside brackets

print $data;

«Скормим» этому скрипту все имеющиеся у нас CSS по очереди:


perl compress.pl site.source.css > site.compress.css

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

Твой друг кэш

Когда пользовательский агент запрашивает данные с сервера первый раз, он кэширует ответ, чтобы избегать повторных запросов в будущем. Как долго будет храниться этот кэш, зависит от двух факторов — настроек агента и соответствующих заголовков с сервера. Опции настройки агентов имеют незначительные различия, однако большинство из них сохраняет кэш по меньшей мере до окончания сессии, если им прямо не указано обратное.

Вы посылаете заголовки, запрещающие кэширование динамических страниц, чтобы не позволить браузеру кэшировать страницы, которые постоянно изменяются. В PHP это делается с помощью одной строчки:


header(«Cache-Control: private»);

Слишком просто, чтобы быть правдой? Ну, в общем-то, да — некоторые агенты порой игнорируют этот заголовок. Чтобы по-настоящему запретить браузеру кэшировать документ, следует быть немного более убедительным:


# ‘Expires’ in the past

header(«Expires: Mon, 26 Jul 1997 05:00:00 GMT»);

# Always modified

header(«Last-Modified: „.gmdate(„D, d M Y H:i:s“).“ GMT»);

# HTTP/1.1

header(«Cache-Control: no-store, no-cache, must-revalidate»);

header(«Cache-Control: post-check=0, pre-check=0», false);

# HTTP/1.0

header(«Pragma: no-cache»);

Это годится для контента, который мы не хотим кэшировать, но если контент не меняется при каждом запросе, нам нужно добиться от браузера обратного поведения. Для этого в заголовке запроса используется конструкция If-Modified-Since. Получив такой запрос, Apache (или любой другой веб-сервер) может выдать код 304 (Not Modified), тем самым сообщая браузеру, что у того в кэше уже находится актуальная версия документа. Благодаря этому механизму, нам не приходится пересылать файл заново, однако лишний запрос обрабатывать все же пришлось. Гм.

Использование entity tags похоже на работу с конструкцией if-modified-since. Apache на запрос к статическому ресурсу может отдавать заголовок Etag, содержащий контрольную сумму, сгенерированную из размера файла, времени последнего изменения и номера индексного дескриптора. Браузер может запросить заголовок файла, чтобы проверить e-tag документа перед загрузкой. Очевидно, что использование e-tag сопряжено с теми же накладными расходами, что и механизм if-modified-since, — клиент все еще вынужден делать лишний HTTP-запрос, чтобы определить валидность локальной копии.

Перейти на страницу:

Все книги серии Компьютерра

Похожие книги

«Если», 2002 № 04
«Если», 2002 № 04

ФАНТАСТИКАЕжемесячный журналСодержание:Майк Резник. СЕКРЕТНАЯ ФЕРМА, рассказСтивен Бернс. НАДО ЖЕ, ЛЕТИТ! рассказДжеймс Ван Пелт. ИНФОМАН, рассказЖан-Клод Диньак. ОРХИДЕИ В НОЧИ, рассказБрайан Олдисс. ЗАМЕЧАТЕЛЬНЫЕ ИГРУШКИ НА ВСЁ ПРОШЛОЕ ЛЕТО, рассказВидеодром*Тема--- Андрей Вяткин. «СНОВА ЧЕРНЫЕ СИЛЫ РОЮТ МИРУ МОГИЛУ» (статья)*За кадром--- Дмитрий Байкалов. ТРИНАДЦАТЬ ЛЕТ СПУСТЯ (статья)*Рецензии*Интервью--- Владимир Хотиненко «Я БЕЗУСЛОВНО ДОВЕРЯЮ СУДЬБЕ»Леонид Кудрявцев. КУКУШОНОК, рассказДалия Трускиновская. МАРШРУТ ОККАМА, повестьЕвгений Харитонов. АТАМАНША (статья)ФактыКейдж Бейкер. СОРТИРОВКА, рассказОлег Овчинников. ПОШИВ ШУБЫ ИЗ ВАШЕГО МУТОНА, ИЛИ ТЕХНИКИ МАЛЕНЬКОЙ УФЫ (эссе)РецензииДмитрий Байкалов, Андрей Синицын. ИГРЫ БОЛЬШИХ ДЕТЕЙ (статья)Конкурс Банк идей--- Сергей Лукьяненко. ЕСЛИ ВЫ СВЯЖЕТЕСЬ ПРЯМО СЕЙЧАС…, рассказГеннадий Прашкевич. МАЛЫЙ БЕДЕКЕР ПО НФ, ИЛИ КНИГА О МНОГИХ ПРЕВОСХОДНЫХ ВЕЩАХ (продолжение эссе)КурсорPersonaliaОбложка Игоря Тарачкова к повести Далии Трускиновской «Маршрут Оккама»Иллюстрации: В. Овчинников, С. Голосов, А. Балдин, Т. Филиппова, А. Филиппов, И. Тарачков, С. Шехов

Андрей Вяткин , Брайан Олдисс , Владимир Хотиненко , Далия Трускиновская , Кейдж Бейкер

Фантастика / Научная Фантастика / Фэнтези / Ужасы и мистика / Журналы, газеты