Зачем нужна минимизация js и css файлов?
Прежде всего минимизированные css и js будут иметь меньше размер чем исходники, таким образом уменьшиться время загрузки страницы. Когда проект небольшой, то улучшение после минимизации Вы не заметите. Но если Вы работаете с большим проектом, то минимизация даст значительное уменьшение времени загрузки страницы.
Что же из себя представляет минимизация?
Из кода удаляются комментарии, код пишется в одну строку (удаляются переносы строк и лишние пробелы).
Существует множество онлайн и офлайн сервисов которые могут из Вашего js или css файла сделать минимизированный файл. Однако в данной статье рассмотрим расширение для Yii, которое будет минимизировать и соединять в один файл js скрипты (только JavaScript) и css в другой (только CSS). Это расширение создаст минимизированный файл для js и css (один файл для js, один файл для css) при первой загрузке страницы и разместит его в папке assets
. После чего будет использовать эти файлы до тех пор пока Вы не внесете изменение в любой из подключаемых js или css (или не очистите папку assets
). После внесения изменений процедура повторяется (проверка изменений осуществляется по времени модификации файла). Таким образом Вам не нужно после каждого изменения в исходниках делать минимизацию вручную, js и css остаются в читабельном виде, а на сайте уже работают их минимизированные копии.
Внимание! Хочу заметить что это не единственное расширение для минимизации css и js. Все расширения Вы можете посмотреть на официальном сайте Yii, в разделе расширения.
И так приступим к внедрению расширения минимизации наших js и css файлов.
Расширение Вы можете скачать официального сайта Yii, раздел расширения:
http://www.yiiframework.com/extension/eclientscript/
С GitHub репозитория разработчика:
https://github.com/muayyad-alsadi/yii-EClientScript
Или по прямой ссылки с сайта кодер.укр:
Распаковываем архив и копируем папку yii-EClientScript
в папку /protected/vendors
Теперь нам необходимо подключить расширение к проекту, открываем файл конфигураций /protected/config/main.php
и в components
добавляем подключение и настройку расширения:
<?php return array( //... 'components' => array( //... 'clientScript' => array( 'class' => 'application.vendors.yii-EClientScript.EClientScript', //все параметры принимают значение true или false 'combineScriptFiles' => !YII_DEBUG, //объединение js в один файл 'combineCssFiles' => !YII_DEBUG, //объединение css в один файл 'optimizeScriptFiles' => !YII_DEBUG, //оптимизация js 'optimizeCssFiles' => !YII_DEBUG, //оптимизация css 'optimizeInlineScript' => !YII_DEBUG, //оптимизация js в одну строку 'optimizeInlineCss' => !YII_DEBUG, //оптимизация css в одну строку ), //... ), //... );
Файлы js и css необходимо подключать следующим образом (неважно где Вы будете подключать js и css во вью или контроллере):
<?php //... $cs = Yii::app()->clientScript; $cs->registerCssFile(Yii::app()->theme->baseUrl . '/css/style.css'); $cs->registerScriptFile(Yii::app()->theme->baseUrl . '/js/script.js'); $cs->coreScriptPosition = CClientScript::POS_END; //...
Открываем сайт и смотрим исходный код страницы. До внедрения расширения минимизации js и css, подключение css имело вид:
До внедрения расширения минимизации js и css, подключение js имело вид:
После внедрения расширения минимизации js и css, подключение css имеет вид:
После внедрения расширения минимизации js и css, подключение js имеет вид:
Если Вы откроете оптимизированный js или css файл, то увидите что он стал в одну строку (без форматирования кода). Так же Вы можете настроить расширение под свои нужды, например не объединять css или js и т.д.. При изменение настроек не забудьте очистить папку asstes
.
Так же при необходимости Вы можете отключить любые действия расширения в нужном контроллере или модуле. Пример отключения в модуле:
<?php class ModuleNameModule extends CWebModule { public function init() { //... Yii::app()->setComponents( //... 'clientScript' => array( 'class' => 'application.vendors.yii-EClientScript.EClientScript', 'combineScriptFiles' => false, 'combineCssFiles' => false, 'optimizeScriptFiles' => false, 'optimizeCssFiles' => false, 'optimizeInlineScript' => false, 'optimizeInlineCss' => false, ), //... ), //... ); //... } }
Комментарии
Спасибо, возьму на вооружение. Приятно читать толковые украинские ресурсы! ;)
ОтветитьИ Вам спасибо за оценку)
ОтветитьХотел написать в форме обратной связи но по какой-то причине не пропускает капча - раз 10 пробовал - проверьте. Напишу сюда, потом можете потереть коммент. "Одно предложение к юзабилити сайтом - список записей блога довольно плотный и сложно визуально разлечить где кончается одна новость и начинается другая. Я бы добавил хоть 1-2em margin-top-а к каждой из записи, например - кажется, выглядело бы более читабельно. Вижу, вы любитель Yii. Также перешел на него 2 года назад. Пришлось попробовать что-то новое и сделал на нем сайт нашого универа (http://www.uzhnu.edu.ua/) :) Больше никогда не буду писать на чистом ПХП )"
ОтветитьСпасибо за Ваш комментарий.
ОтветитьЮзабилити сайта. Сейчас экспериментируем, в ближайшее время выложим немного переделанный внешний вид.
Капча. Обязательно проверим и исправим в ближайшее время.
Yii. Удачи Вам в использовании этого фрейморка, надеюсь наш сайт сможет Вам помочь в решении Ваших задач.
Если у Вас есть(будут) еще предложения или замечания по работе сайта пишите нам на на e-mail: info@кодер.укр, мы с радостью Вам ответим.
А які подібні розширення є для Yii2?
ОтветитьДо Yii2 поки ще не дісталися
ОтветитьПопробуйте это:
Ответитьhttps://github.com/rmrevin/yii2-minify-view
На локальном сервере оно работает?
ОтветитьДа, а что возникли проблемы?
ОтветитьДа, не работает
ОтветитьОшибки есть? Можно пример подключения компонента?
ОтветитьПопробуйте заменить:
Ответитьreturn array(
'components' => array(
'clientScript' => array(
'class' => 'application.vendors.yii-EClientScript.EClientScript',
//все параметры принимают значение true или false
'combineScriptFiles' => !YII_DEBUG, //объединение js в один файл
'combineCssFiles' => !YII_DEBUG, //объединение css в один файл
'optimizeScriptFiles' => !YII_DEBUG, //оптимизация js
'optimizeCssFiles' => !YII_DEBUG, //оптимизация css
'optimizeInlineScript' => !YII_DEBUG, //оптимизация js в одну строку
'optimizeInlineCss' => !YII_DEBUG, //оптимизация css в одну строку
),
),
);
на
return array(
'components' => array(
'clientScript' => array(
'class' => 'application.vendors.yii-EClientScript.EClientScript',
//все параметры принимают значение true или false
'combineScriptFiles' => true, //объединение js в один файл
'combineCssFiles' => true, //объединение css в один файл
'optimizeScriptFiles' => true, //оптимизация js
'optimizeCssFiles' => true, //оптимизация css
'optimizeInlineScript' => true, //оптимизация js в одну строку
'optimizeInlineCss' => true, //оптимизация css в одну строку
),
),
);
так как
YII_DEBUG
на локальном сервере принимает значениеtrue
, a!YII_DEBUG == false
. Соответственно все настройки вfalse
Все работает замечательно пока не подключишь хитрые (возможно глючные) сторонние компоненты. Так, например в админке TinyMCE подгружается в iframe и он почему-то ни в какую не хочет корректно склеивать js - пытается найти родные его скрипты в assets\76dfdf (и типа того) а не в одном общем файле (( Кто-то сталкивался?
ОтветитьДа у меня тоже такое дело с TinyMCE. Я просто в админке отключил сжатие js и css. Как описано выше
Ответить<?php
class AdminModule extends CWebModule {
public function init() {
Yii::app()->theme = Yii::app()->params['adminTheme'];
//...
Yii::app()->setComponents(
array('errorHandler' => array('errorAction' => '/admin/adminError/error'),
'clientScript' => array(
'class' => 'application.vendors.yii-EClientScript.EClientScript',
'combineScriptFiles' => false,
'combineCssFiles' => false,
'optimizeScriptFiles' => false,
'optimizeCssFiles' => false,
'optimizeInlineScript' => false,
'optimizeInlineCss' => false,
),
),
);
//...
}
}
Думаю для админки отключенное сжатие будет не критично)
ОтветитьХм... спасибо, интересное решение - переопределить параметры компонента. Правда у меня редактирование страниц не в отдельном модуле и теме - а прямо на странице (типа "на лету" если есть права) но идея понятна!
ОтветитьТак же если Вы будете подключать js так:
Ответить<script type="text/javascript" src="..."></script>
то компонент не будет ничего делать с таким файлом.
Компонент выполняет операции только со скриптами, которые подключены с помощью clientScript
Сделайте что-то со вставкой кода в комментарий. Что бы красиво было)
ОтветитьХорошо, что-нибудь придумаем
ОтветитьСпасибо, очень полезно. Внедрил на сайт, понравилось)
ОтветитьСкажите пожалуйста, почему минификация не работает, если отключить комбинирование? Мне просто нужно автоматически минифицировать js и css, комбинирование не нужно вовсе (по определенным причинам).
ОтветитьК сожалению без комбинирование работать не будет. Воспользуйтесь другим расширением для минимизации
ОтветитьНе подскажите какие еще есть для Yii 1?
ОтветитьПопробуйте это: http://www.yiiframework.com/extension/extendedclientscript
ОтветитьСам его не использовал. А чем комбинирование мешает?
Система "нафаршированная", скрипты подгружаются в зависимости от модуля и его шаблонов, склеивает он их так, что вылетают ошибки. А выполнение всего скрипта в таком случае прерывается полностью.Попробую этот экстеншн, спасибо.
ОтветитьПопробовал это расширение. То же самое, компрессия не работает без комбинирования :(
ОтветитьТогда остается один вариант, делайте минимизацию скриптов вручную (при помощи онлайн сервисов или программ для ПК) и подключайте их на сервере при релизе
ОтветитьДа можно средствами пхп что-то придумать, но не хотелось, когда видел, что есть готовые решения
ОтветитьМожно также написать свое расширение. Которое будет работать без комбинирования)
Ответить