UglifyJS - инструмент для объединения, сжатия (компрессии) JavaScript файлов. Он может быть использован для объединения и сжатия JavaScript файлов, что уменьшает размер HTTP ответов сервера и делает сайт более быстрым. UglifyCSS - похожий инструмент, но для CSS файлов.
Установка UglifyJS
UglifyJS представляет собой модуль Node.js. Поэтому вначале необходимо установить Node.js.
Пример установки для Ubuntu:
$ sudo apt-get install npm nodejs $ sudo ln -s /usr/bin/nodejs /usr/bin/node
UglifyJS можно установить локально или глобально.
Глобальная установка
Глобальная установка позволяет всем Вашим проектам использовать одну версию UglifyJS, что упрощает его обслуживание. Установка производится следующей командой:
$ sudo npm install -g uglify-js
Теперь можно выполнять комнаду uglifyjs из любого места в системе.
$ uglifyjs --help
Локальная установка
При использовании специфической версии UglifyJS, Вы можете установить UglifyJS внутри проекта. Для этого нужно указать путь установки и не указывать команду -g.
$ cd /path/to/your/symfony/project $ npm install uglify-js --prefix app/Resources
Рекомендуется устанавливать UglifyJS в папку app/Resources и добавить каталог node_modules в систему контроля версий.
После этого можно запустить uglifyjs команду из каталога node_modules:
$ "./app/Resources/node_modules/.bin/uglifyjs" --help
Конфигурация uglifyjs2 фильтра
Для использования сжатия JavaScripts внутри Symfony проекта необходимо настроить uglifyjs2 фильтр
YAML
# app/config/config.yml
assetic:
filters:
uglifyjs2:
# the path to the uglifyjs executable
bin: /usr/local/bin/uglifyjsXML
<!-- app/config/config.xml -->
<assetic:config>
<!-- bin: the path to the uglifyjs executable -->
<assetic:filter
name="uglifyjs2"
bin="/usr/local/bin/uglifyjs" />
</assetic:config>PHP
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'uglifyjs2' => array(
// the path to the uglifyjs executable
'bin' => '/usr/local/bin/uglifyjs',
),
),
));Путь расположения UglifyJS в разных системах может отличаться. Для того, чтобы узнать где npm хранит bin каталог, выполните команду:
$ npm bin -g
Команда выведет каталог в Вашей системе, где можно найти исполнимый файл UglifyJS.
При локальной установке UglifyJS, Вы можете найти bin каталог внутри node_modules. В этом случае он будет называться .bin.
Теперь у Вас есть доступ к фильтру uglifyjs2 в Вашем проекте.
Конфигурация расположения Nodejs
Assetic пытается найти node автоматически. Вы также можете указать путь к node:
YAML
# app/config/config.yml
assetic:
# the path to the node executable
node: /usr/bin/nodejs
filters:
uglifyjs2:
# the path to the uglifyjs executable
bin: /usr/local/bin/uglifyjsXML
<!-- app/config/config.xml -->
<assetic:config
node="/usr/bin/nodejs" >
<assetic:filter
name="uglifyjs2"
bin="/usr/local/bin/uglifyjs" />
</assetic:config>PHP
// app/config/config.php
$container->loadFromExtension('assetic', array(
'node' => '/usr/bin/nodejs',
'uglifyjs2' => array(
// the path to the uglifyjs executable
'bin' => '/usr/local/bin/uglifyjs',
),
));Применение фильтра для сжатия файлов
Если вы используете UglifyJS, добавьте параметр filter в asset тег Вашего шаблона. Таким образом вы укажете Assetic использовать uglifyjs2 фильтр:
Twig
{% javascripts '@AppBundle/Resources/public/js/*' filter='uglifyjs2' %}
<script src="{{ asset_url }}"></script>
{% endjavascripts %}PHP
<?php foreach ($view['assetic']->javascripts(
array('@AppBundle/Resources/public/js/*'),
array('uglifyj2s')
) as $url): ?>
<script src=" <?php echo $view->escape($url) ?>"></script>
<?php endforeach ?>Оба примера подразумевают, что у Вас есть бандл AppBundle и JavaScript файлы находятся в директории Resources/public/js Вашего бандла. В любом случае, Вы можете подключать файлы из разных мест.
С применением фильтра uglifyjs2 к asset тегам, Вы увидите сжатые JavaScripts файлы, которые будут загружаться значительно быстрее.
Выключение сжатия в режиме отладки
Сжатые JavaScripts файлы очень тяжело читать при отладке. Поэтому Assetic позволяет отключать фильтр в режиме отладки (использование app_dev.php). Вы можете включить отладку путем добавления вопросительного знака (?) перед именем фильтра. Это сообщит Assetic, что нужно включать сжатие, когда режим отладки выключен (используется app.php):
Twig
{% javascripts '@AppBundle/Resources/public/js/*' filter='?uglifyjs2' %}
<script src="{{ asset_url }}"></script>
{% endjavascripts %}PHP
<?php foreach ($view['assetic']->javascripts(
<array('@AppBundle/Resources/public/js/*'),
<array('?uglifyjs2')
) as $url): ?>
<script src="<?php echo $view->escape($url) ?>"></script>
<?php endforeach ?>Попробовать сжатие можно, перевключившись в prod окружение. Но прежде не забудьте очистить кеш и сделать дамп файлов:
$ php app/console cache:clear --env=prod --no-debug
$ php app/console assetic:dump --env=prod --no-debug
Установка, настройка и использование UglifyCSS
Использование UglifyCSS полностью такое же, как и UglifyJS. Вначале проверте, что пакет node установлен:
# global installation $ sudo npm install -g uglifycss # local installation $ cd /path/to/your/symfony/project $ npm install uglifycss --prefix app/Resources
После этого добавьте конфигурацию:
YAML
# app/config/config.yml
assetic:
filters:
uglifycss:
bin: /usr/local/bin/uglifycssXML
<!-- app/config/config.xml -->
<assetic:config>
<assetic:filter
name="uglifycss"
bin="/usr/local/bin/uglifycss" />
</assetic:config>PHP
// app/config/config.php
$container->loadFromExtension('assetic', array(
'filters' => array(
'uglifycss' => array(
'bin' => '/usr/local/bin/uglifycss',
),
),
));Для сжатия CSS файлов добавьте Assetic stylesheets помощник:
Twig
{% stylesheets 'bundles/App/css/*' filter='uglifycss' filter='cssrewrite' %}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}PHP
<?php foreach ($view['assetic']->stylesheets(
array('bundles/App/css/*'),
array('uglifycss'),
array('cssrewrite')
) as $url): ?>
<link rel="stylesheet" href="<?php echo $view->escape($url) ?>" />
<?php endforeach ?>Как и в случае с uglifyjs2 фильтром, если поставить вопросительный знак ? (т.е. ?uglifycss), сжатие будет только при выключенном режиме отладки.
Не забудьте о сжатии изображений и проверке кода.