Ресурсы в архиве или как уменьшить количество подгружаемых файлов

Ранним жарким утром спросонья пришла в голову идея. Подозреваю, что у этой идеи есть минусы либо ее уже реализовали куда более годным способом — но, авось да пригодится кому-нибудь.Очень часто веб-разработчики сталкиваются с проблемой большого количества мелких файлов. Картинки, скрипты, css — неудобно, все дела. Нужно как-то бороться с этим. import, спрайты, блаблабла — это хорошо, но можно попробовать и иначе. Мой вариант — упаковка всех необходимых ресурсов в архив на стороне сервера (реализация — на php), получение данных на клиенте, установка ресурсов в нужных местах.

Проблемы на данный момент: не придумал толком, как кешировать полученный архив, таким способом не стоит паковать динамический контент или большие файлы.Для распаковки архива на клиенте использована библиотека JSZip, для удобства — jQuery.

Итак, посмотрим на код.

ziplogic.php:

class ZipLogic extends ZipArchive{ public $filename; public function __construct () { $filename = «current/latest.zip»; $this→filename = $filename; if (file_exists ($filename)) unlink ($filename); if ($this→open ($filename, ZIPARCHIVE: CREATE)!==TRUE) { $error = error_get_last (); echo $error[«message»]; return null; } } public function pack ($url){ $this→addFile ($url); } } Этот класс наследуется от ZipArchive и нужен только для чуть более удобной работы с архивом.

Теперь — код для упаковки нужных ресурсов:

index.php:

include «ziplogic.php»; $zpack = new ZipLogic (); if ($zpack==null) { echo 'wrong data'; return; } $zpack→pack ('img/screen.png'); $zpack→pack ('img/screen_1.png'); $zpack→pack ('img/screen_2.png'); $zpack→pack ('css/alotofstyles.css'); $zpack→pack ('js/cooljs.js'); $zpack→close (); include 'content.html'; Тут, собственно, тоже нет ничего особо интересного: создаем объект ZipLogic, перечисляем все ссылки на ресурсы, которые нужно упаковать, закрываем объект, подключаем конечную html’ку. В результате в папке current создается архив latest.zip, который содержит в себе все нужные ресурсы (см. ziplogic.php).По хорошему, использовать его нужно перед публикацией страницы, каждый раз генерировать нет смысла.

Ну и на закуску — сама html’ка. Верстку не критиковать, пожалуйста — ее здесь нет.

content.html:

Тут стоит описать чуть подробнее.Функция getBinary, если не ошибаюсь, честно сперта со stackoverflow. Скачивает архив и передает полученный массив байт в callback.Функция unpackResources, собственно, и делает основную часть работы: обрабатывает содержимое архива, вытаскивает пути, находит все элементы, ресурсы в которых помечены через zpack, создает соотв. blob и подгружает его в нужный элемент.Пока все это добро не подгрузится, висит загрузчик.

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

Спасибо за внимание, комментарии и идеи крайне приветствуются, критика без использования слов «идиот» и «криворукий ламер» — тоже.

© Habrahabr.ru