Минимизация CSS- и JS-файлов и HTML-кода на сайте

Одним из пунктов оптимизации сайта является минимизация кода, который передается браузеру посетителя в момент открытия сайта. Сюда относится как содержимое CSS-файлов и JS-файлов, так и HTML-код страниц. Данные меры позволяют заметно сократить размер итогового кода и немного ускорить загрузку сайта.

Минимизация происходит за счет удаления лишних пробелов, табуляции и пустых строк. Расскажу, каким образом я делаю это на своих сайтах.

Минимизация HTML-кода

Загляните в исходный код этого блога, чтобы посмотреть, как это будет выглядеть в результате. Как видите, почти весь код страницы не отформатирован и “собран в кучу” (о том, почему “почти”, будет сказано ниже).

Реализуется это с помощью двух небольших вставок PHP-кода, в котором используются регулярные выражения.

Первую часть необходимо вставить в самое начало исходного кода вашего сайта (т.е. прямо перед <!DOCTYPE ...>):

<?php
/*
* HTML-минимизация
*/
ob_start();
?>

А вторую часть, напротив, необходимо вставить в самый конец исходного кода сайта, т.е. после тега </html>:

<?php
/*
* HTML-минимизация
*/
$out = ob_get_clean();
$out = preg_replace('/(?![^<]*<\/pre>)[\n\r\t]+/', "\n", $out);
$out = preg_replace('/ {2,}/', ' ', $out);
$out = preg_replace('/>[\n]+/', '>', $out);
echo $out;
?>

При этом содержимое тега pre добавлено в исключение, т.е. не минимизируется, это необходимо для правильного отображения примеров кода.

К сожалению, я далеко не специалист в регулярных выражениях, поэтому в данном моем решении присутствует недостаток – JS-код и CSS-код, который вставлен соответственно в тегах <script></script> и <style></style>, остается не минимизированным (можете увидеть это в исходнике страниц блога). Кроме того, касательно минимизации такого JS-кода есть свои особенности, поэтому я не стал рисковать.

Буду рад, если кто-то в комментариях подскажет, как грамотно устранить данный недостаток, не ломая при этом работоспособность скриптов.

Минимизация CSS-файлов и JS-файлов

Для этого я использую замечательный бесплатный инструмент Minify. Это PHP-приложение, которое кладется в отдельную папочку на сайте и через которое пропускаются все необходимые файлы.

Можно минимизировать как отдельные файлы, так и сгруппировать несколько файлов в один, тем самым сократив количество запросов к серверу.

Подключается он просто:

  1. Копируем папку /min/ в корень своего сайта.
  2. Открываем файл /min/config.php в текстовом редакторе и в строке $min_enableBuilder = false; меняем false на true.
  3. Заходим по адресу http://ваш_сайт/min/builder/ и вводим логин и пароль admin. Откроется инструмент для получения ссылок на файлы, пропущенные через минимизатор.
  4. Указываем относительные пути до нужных файлов, нажимаем “Update” и получаем ссылки на минимизированные версии.
  5. После того, как получили все необходимые ссылки, лучше закрыть доступ к билдеру. Для этого в config.php обратно меняем true на false в строке $min_enableBuilder = true;.

Если у вас несколько файлов одного типа, то рекомендую воспользоваться группировкой (для этого редактируется файл /min/groupsConfig.php). В билдере, да и в самом этом файле показаны примеры, как объединить несколько CSS- или JS-файлов.

Кстати, даже если у вас всего один файл, и вы хотите при минимизации сократить путь до него, тогда тоже можно использовать группировку.

К примеру, на этом блоге я сделал так:

  • Исходный файл – http://dimox.name/wp-content/themes/dimox.name/style.css
  • Группировка в groupsConfig.php:

    return array(
    	'style.css' => array('//wp-content/themes/dimox.name/style.css'),
    );
    
  • Результат – http://dimox.name/min/g=style.css

Есть еще одна особенность Minify, которая кому-то может понадобиться. На некоторых серверах для корректной работы минимизатора необходимо в файле .htaccess (который в папке /min/) убрать знак # в строке #RewriteBase /min. Я однажды столкнулся с этим при переносе сайта на другой хостинг, и данная правка мне помогла.

На этом все, спасибо за внимание. Надеюсь, эта информация окажется для вас полезной.

Комментарии (19)

  1. 20 мая 2014 г. в 18:08

    Отличная тема с Minify, никак руки не доходили разобраться с ним… Он кеширует минимизированные файлы или каждый раз заново чистит?

    1. Да, он их кэширует.

  2. 21 мая 2014 г. в 23:20

    Остановился на плагине WP Minify Fix. Также есть хороший плагин Autoptimize, но в кеш maxcache оптимизированные страницы не попадают, пришлось отказаться от него (.

  3. 24 мая 2014 г. в 19:16

    Когда-то с интересом следил за развитием сервиса webo.in где тогда тестировалась работа его скриптов. Там тогда разбирались что облегчать )) пробелы, лишние теги, создание спрайтов для вёрстки. С вводом платной версии стало неинтересно ))
    Любопытное решение в плане отстранённости от движка.
    Что-то подобное как раз просится для реализации на getsimple

  4. 2 июня 2014 г. в 07:36

    По-моему, это экономия на спичках. Ну удалишь ты все пробелы и т.п., так это всего на несколько килобайт уменьшит страницу, а не в 2-3-5 раз, что не скажется критично на скорости загрузки даже на диалапе, которого ни у кого уже практически нет давно.

    1. Diman
      20 июня 2014 г. в 15:45 / ответ на коммент DimaX

      Сжатие яваскприта часто в разы уменьшает вес файла, посмотрите на примере jquery, например: скриншот
      А обычно разных скриптов подключается по несколько штук..

  5. Вадим
    22 июня 2014 г. в 13:48

    я особо бы ob_start() не увлекался, сайт в таком режиме ест раза в 2 больше памяти сервера, для какой-то мелочи еще можно, но не на весь сайт

  6. Mark
    10 июля 2014 г. в 20:22

    Крутяк, спасибо за статью!)

  7. Evgeniy
    6 августа 2014 г. в 13:38

    Здравствуйте. На ГитХабе обнаружил ссылку http://wordpress.org/plugins/bwp-minify/ Надо полагать автор библиотеки реализовал ее в виде плагина для ВордПресс? Кто нибудь применял?

    1. 6 августа 2014 г. в 14:31 / ответ на коммент Evgeniy

      По сути этот то же самое, только больше автоматизации. Я пока не юзал.

    2. 15 октября 2014 г. в 11:33 / ответ на коммент Evgeniy

      Плагин очень хороший – рекомендую!

  8. maryanin
    20 ноября 2014 г. в 14:58

    Спасибо за наводку на minify, действительно все предельно просто и главное работает

  9. 22 марта 2015 г. в 16:20

    Одно слово grunt

    1. 2 февраля 2016 г. в 13:45 / ответ на коммент gunlinux

      Gulp теперь в тренде и больше возможностей у него. Ну и коммьюнити больше тоже.

  10. 8 сентября 2015 г. в 11:53

    Вот как раз сейчас занимаюсь оптимизацией сайта – статья оказалась очень полезной! спасибо!

  11. Иван
    30 октября 2015 г. в 10:13

    Скачал последнюю версию Minify с сайта, распаковал в папку на сервере, но при заходе по ссылке со сжатой версией файла вылазит ошибка, а скрипт не загружается.

  12. grantorin
    8 сентября 2016 г. в 15:21

    А W3 Total Cache почему не использовать?

  13. 6 ноября 2017 г. в 16:38

    Я один раз воспользовался Minify на одном из своих первых сайтов. Не знаю, может что-то не так сделал, но сайт у меня слег полностью. Вроде все делал по инструкции. Пришлось восстанавливать через резервную копию(((

  14. 4 июня 2020 г. в 13:35

    Интересно, но сложно. А грузить сервер дополнительными скриптами совсем негоже… Есть вариант сжатия файла на локальном компьютере с последующей закачкой на сервер. Конечно, надо иметь у себя его нормальную копию (процесс сжатия необратим).
    Делается это данной программой: https://erichware.com/inform/txt2lin.htm

Ваш комментарий

Жирный текст

Ссылка

Цитата

Внутристрочный код

CSS-код

HTML-код

JavaScript-код

PHP-код