Затем в комментариях предложили другой способ. Он сканирует указанные директории на предмет наличия там скриптов и стилей, и пережимает. Только, CSS отчего то не жмет, и нет возможности указать конкретные файлы для обработки.
Да и в пакет не собрано — неудобно будет на другие сайты ставить. В общем, пришлось и от него отказаться.
По старой доброй традиции клонировал исходники MinifyX и принялся за работу. В исходниках, кстати, половины файлов нет — брал из пакета. Видимо репозиторий существет для галочки.
Сжатие
Первым делом выяснил, что в порче css виноват какой то матерый минификатор. В код не глядел, но судя по результатам работы — он анализиарует селекторы из css файлов и вырезает лишние, по его мнению. Конечно, размер файла становится меньше, но и сайт в итоге выглядет совершенно иначе.Заменил его на библиотеку из проекта Minify, сразу стало хорошо. И минифицирует, и ничего не ломает.
В оригинальном MinifyX javascript вообще не сжимался. Ну то есть, вырезались переносы строк и все. Добавил обработку через JsMin.
Теперь, все сжимается просто прекрасно, никаких глюков не замечено. В этим покончили, надо переделать кэш.
Кэширование
В оригинальном пакете высчитывался хэш из параметров вызова, потом оно чистилось плагином и еще какие-то сложности. В общем, кэш там был странный.Я решил поступить творчески — выкинул нафиг плагин и сделал нормальные имена у файлов, добавив к ним Unix timestamp параметром.
Если сниппет выполняется не кэшированным — timestamp всегда разный, и вы каждый раз грузите css и js заново. Хорошо для отладки.
Если же сниппет кэшированный — то ссылки на файлы выдаются со старым timestamp, и браузер берет файл из своего кэша.
При очистке кэша сайта чистится и кэш сниппета — а при первой загрузке страницы он выдаст новый timestamp, и вы загрузите новые css и js. Просто и красиво.
Но я пошел дальше. Если сниппет вызывается некэшированным, но файлы-исходники не менялись — то нет смысла их каждый раз обрабатывать, так? Тем более, там зверские регулярные выражения, что очень не быстро.
Поэтому, теперь при склейке файлов проверяется время изменения итогового файла и исходников. Если хоть один из исходных файлов (отдельно для css и jss) изменен — то склеиваем заново. Если нет — ничего не делаем.
Класс, все работает! Но есть проблема — а если юзер раньше не использовал сжатие, а теперь начал, или наоборот? Надо же перегенерировать файлы, но как об этом узнать? Да все просто — делаем сохранение минифицированных версий с суффиксом min.
Теперь, в зависимости от параметров запуска, проверяются те, или иные итоговые файлы, а на выходе мы получаем понятные названия, по которым сразу видно — минифицирован файл или нет.
Да, по поводу имен — добавлено 2 новых параметра:
- &jsFilename — базовое имя файла, без расширения. По умолчанию — sсripts
- &jcssFilename — базовое имя файла, без расширения. По умолчанию — styles
/inc/min/styles.min.css?1347183340 /inc/min/scripts.min.js?1347183340В общем, кэширование работает без всяких плагинов, просто, прозрачно и красиво, как я люблю.
По мелочи
В итоге, переписал практически все, добавил сниппету параметры (чтобы в админке было видно, какие есть), отправил изменения автору, упаковал в пакет и выложил в репозиторий — можно качать.Настройке те же (плюс 2 новые), только теперь оно действительно работает! Например, на этом сайте — загляните в исходный код.

- Пакет в репозитории MODX
- Страница компонента на RTFM
- Исходный код новой версии на Github
[[MinifyX? &minifyCss=`1` &minifyJs=`1` &cacheFolder=`/inc/min/` &jsSources=` /inc/js/jquery-1.8.1.min.js ,/inc/js/jquery-ui-1.8.23.custom.js ,/inc/js/jquery.cookie.min.js ,/inc/js/jquery.fancybox.min.js ,/inc/js/jquery.mousewheel.min.js ,/inc/js/bootstrap.min.js ,/inc/js/prettify/prettify.js ,/inc/js/main.js ` &cssSources=` /inc/css/bootstrap.min.css ,/inc/css/bootstrap-responsive.css ,/inc/css/reboot-landing.css ,/inc/css/reboot-landing-responsive.css ,/inc/css/jqueryui/jquery-ui-1.8.16.custom.css ,/inc/css/font-awesome.css ,/inc/css/fancybox/jquery.fancybox.css ,/inc/js/prettify/prettify.css ,/inc/css/main.css ` ]] [[+MinifyX.css]] [[+MinifyX.javascript]]Javascript советуют переносить в подвал, чтобы резче грузилось.
Как обычно, прошу сообщать о найденных глюках и проблемах.
Важный update
Как оказалось, браузеры не кэшируют скрипты стили, если у них есть параметры в url, типа scripts.min.js?1234567890. А вот изображения с параметрами, почему то, прекрасно кэшируются.В общем, пришлось переписать генерацию файлов так, чтобы timestamp был в имени — scripts_1234567890.min.js.
Крайне рекомендую обновиться на версию 1.1.2, ваш сайт забегает еще быстрее.
← Следующая заметка
Форкнул BannerX под именем BannerY, 1.0.0
Форкнул BannerX под именем BannerY, 1.0.0
Предыдущая заметка →
Сниппет Jevix
Сниппет Jevix
А как насет плагина для сжатия html кодаа страницы?
Экономия в 5-10 килобайт и лишняя обработка каждой страницы после очистки кэша.
Лучше настроить nginx, чтобы отдавал весь контент в gzip — выхлопа гораздо больше.
Если вы приведете ошибки — будет проще понять, что у вас не так с денвером.
core\components\minifyx\model\minifyx\minifyx.class.php on line 94
Я думаю, что не правильно сделала вызов.
Во втором случае на строке 94 объявляется метод, там вообще нечему ошибаться.
ссылается на /denwer/errors/phperror_js.php
На windows пути к файлам другие, думаю в этом проблема.
1. У такого файла не измерить filemtime — и будет непонятно, изменен он, или нет.
2. Файл может оказаться недоступен и загрузка страницы подвиснет. Чтобы отваливаться по таймауту, можно, конечно, написать запрос через CURL, но он не у всех есть.
Поэтому, файлы работают только локальные.
/assets/templates/bs/js/libs/jquery-1.7.2.min.js ,/assets/templates/bs/js/libs/bootstrap/bootstrap.min.js
,/assets/templates/bs/js/libs/jquery-ui-1.8.23.custom.min.js
,/assets/templates/bs/js/libs/jquery.form.js
,/assets/templates/bs/js/libs/jquery.colorbox-min.js
,/assets/components/msearch/js/mfilter.js
,/assets/components/likedislike/js/web/likedislike.js
,/assets/templates/bs/js/script.js
Подключайте по одному скрипту и выясняйте, кто виноват.
У меня сегодня на одном сайте была проблема с jquery.form. Перекачал его с родного сайта, несжатый — заработало.
Обновил colorbox на полную версию, jquery form, bootstrap не минифицированный указал, ошибка пропала)
Выходит, переминифицировать минифицированные скрипты нежелательно =)
Скачайте все несжатые, от производителя.
Запустил PageSpeed от гугла, говорит, что css и js файлы hypercomments можно ужать более чем на 70% если включить gzip или deflate, но как его включить для внешних ресурсов?
Параметр deflate, думаю, можно указать, а вот gzip зависит от сервера. Попробуйте сохранить у себя и грузить локально.
В дальнейшем следует указать для следующих ресурсов срок действия не менее недели:
../scripts_1347387573.min.js (не указан срок истечения действия)
../styles.min.css (не указан срок истечения действия)
До этого кешировалось все нормально)
Срок действия выдает веб-сервер, заголовками. Протестируйте этот сайт и посмотрите, что покажет.
# serve static files directly
location ~* ^.+\.(jpg|jpeg|gif|css|png|js|ico|bmp|woff)$ {
access_log off;
expires 10d;
break;
}
/inc/min/styles.min.css?1347183340
/inc/min/scripts.min.js?1347183340»
Наткнулся на момент:
Если папка "/inc/min" не существует, то автоматически она не создается и MinifyX не создает файлы.
В логах ошибка есть:
[2012-10-02 10:49:46] (ERROR @ /index.php) [MinifyX] Could not write JS cache file!
[2012-10-02 10:49:46] (ERROR @ /index.php) [MinifyX] Could not write CSS cache file!
Предлагаю создавать папку автоматически.
Меняете умолчание — создайте и директорию. Совсем уже разленились, блин.
Вопрос не в лени, вопрос в поиске ошибки, когда «все не работает»
Could not write JS cache file! — не информационно
Если бы в логах было «path „/inc/min“ for write JS cache file not found» было бы проще найти в чем косяк. А если компонента сама создаст нужную ей папку, то программисту будет житься проще.
Чем сложнее ошибку найти, тем выше порог вхождения в технологию.
Мне кажется MODX заслуживает гораздо более широкого распространения, чем сейчас. И Вы своими работами можете поспособствовать распространению MODX, а можете и не способствовать.
Цель моего поста отнюдь не «Безумкин, ты офигел так фигово писать»
Его смысл «Давайте сделаем сделаем MODX доступнее.»
Ваши знания на сегодняшний день весьма превышают мои в этом вопросе, Но я хотел помочь. Если мое участие впредь не требуется, дайте, пожалуйста, об этом знать прямо. Спасибо.
Я потенциальный пользователь ваших разработок, а не соразработчик. Увы.
В тему ускорения работы сайтов
Наткнулся на весьма интересную вещь — для меня было в новинку.
Использование в CSS вместо ссылок на изображение непосредственно base64 кода самого изображения.
Вот статья на хабре, там есть скриптик который конвертирует CSS можно прикрутить к minify если заинтересует.
Из любопытства конвертировал картинку размером 270кб, текстовый файл с кодом 64 1кб.
Не относитесь критично… просто решил поделится мало ли.)
Можно, в принципе, всякие логотипы так сконвертить на досуге.
Только вот никак не могу найти настройки, те что указаны на скриншоте.
В настройках системы у меня их нет, все на несколько раз обыскал:
Подскажите, пожалуйста, где находятся настройки?
Хороший получился компонент, возможно будет интересно с чем столкнулся в процессе использования MinifyX при адаптации купленного html шаблона.
Есть скрипты которые подключаются в шапке и подвале сайта, снипет в таком случае выдает один и тотже результат, приходится делать «копию» снипета и менять все примерно в таком ключе:
<?php
$minifyX1 = $modx->getService('minifyx1','MinifyX', MODX_CORE_PATH.'components/minifyx/model/minifyx/',$scriptProperties);
if (!($minifyX1 instanceof MinifyX)) return '';
$minifyX1->minify();
return '';
Тогда вызов работает. Собственно очень интересно узнать следующее:
1) Возможно ли сделать вызов одного и тоже снипета (без копирования и дописывания) но с разными параметрами (списками фалов, папкой кэша, наименованием файла скриптов и стилей)?
2) Возможно ли доработать на раздельные методы, которые бы просто возвращал значение имени «склеенного» js файла и css файла?
Как дойдут руки — буду делать.
Такая вот ошибка.
ERROR @ public_html/core/components/minifyx/model/minifyx/minifyx.class.php: 151) PHP warning: Invalid argument supplied for foreach()
В сущности у афтора есть и плагин для минификации.
при минификации превращается в:
тут сократился пробел между +, что приводит к ошибке в минифициорованном коде.
есть ли какое-то решение? если не для плагина, то может этот код можно поправить?
Ну а вообще, в планах есть обновление и переделка пакета, может и эта проблема исчезнет.
Если кому понадобится, можно просто код поменять:
Но к переписыванию готовлюсь =)
Тут кстати автор порекомендовал на какие минификаторы лучше перейти:
https://github.com/rgrove/jsmin-php/
может что-то приглянется
Я вот сюда поглядывал, вроде перспективная библиотека.
Как побороть сей досадный баг?
rtfm.modx.com/extras/revo/minifyx
А так в любом месте. При парсинге все подставится куда нужно.
Чем больше пишу и рассказываю, тем более странные вопросы задают. Скоро будет «а как зайти в админку?», «а что такое логин и пароль?».
Чем больше ты рассказываешь, тем человеку интереснее, тем больше он задумывается и больше у него возникает вопросов. :)
А можно и не там. ;)
PHP warning: mkdir() [function.mkdir]: Invalid argument
PHP warning: mkdir() [function.mkdir]: Invalid argument
PHP warning: mkdir() [function.mkdir]: Invalid argument
PHP warning: mkdir() [function.mkdir]: Invalid argument
PHP warning: mkdir() [function.mkdir]: Invalid argument
MODX Revolution 2.2.13-pl (traditional)
MinifyX 1.3.0 beta установлена из официального репозитория
Это у меня что не так или устарело где?
Т.е. ссылки в head на файлы вставляются, файлы доступны, но они пусты: и js, и css
Можете подсказать куда смотреть? Спасибо.
На счёт пустых файлов прошу прощения — моя ошибка. Ошибся в путях — снипет не находил файлы для сжатия.
А сообщение при очистке кеша ещё есть.
mkdir($dir, 0777, true)
mkdir($this->cacheDir, 0755, true)
Fatal error: Uncaught exception 'RuntimeException' with message 'Unclosed string. in /core/components/minifyx/munee/tedivm/jshrink/src/JShrink/Minifier.php:409
112 строчка: $Request = new \Munee\Request($options);