В предыдущей статье Использование Component в Symfony2 мы рассматривали как использовать Component для менеджера зависимостей. Есть несколько недостатков, которые не позволяют нам всегда его использовать. Рассмотрим вариант использования composer для управления зависимостями библиотек из bower и npm.
В большинстве случаев css/js библиотеки используют bower как менеджер пакетов. Поэтому если использовать composer+robloach/component-installer эти пакеты приходится регистрировать в composer.json
как package
. И получается внушительный список.
Использование asset плагина
Установим его командой $ composer require fxp/composer-asset-plugin
Bower библиотеки мы будем устанавливать в папку web/components
поэтому в composer.json
добавим
"extra": { "asset-installer-paths": { "bower-asset-library": "web/components" } }
Библиотеку мы устанавливам командой composer require bower-asset/jquery
. Плагин удалит все файлы которые были в bower.json
в ignore
.
На данном этапе все готово, мы можем использовать нашу библиотеку, так как нам удобно. В целях более грамотного структурирования кода я использую requirejs. Давайте рассмотрим как его подключить. Если при использовании Component плагин сам делал для нас файл настроек, то в данном моменте нам необходимо все будет сделать самим.
Установка requirejs
Данную библиотеку можно установить с помощью менеджера пакетов npm. Поэтому, для того чтобы наша библиотека была в папке web/components
в composer.json
добавим
"extra": { "asset-installer-paths": { "npm-asset-library": "web/components" } }
После установим командой composer require npm-asset/requirejs
Настройка requirejs
Создадим файл для конфигурации установленых библиотек src/AppBundle/Resources/public/js/require.config.js
, путь может быть любой, главное чтобы он был доступен браузеру, с таким содержимым.
requirejs.config({ "shim": {"materialize": {"deps": ["jquery", "jquery-hammerjs"]}}, "paths": { "hammerjs": '/components/hammerjs/hammer.min', "jquery-hammerjs": ['/components/jquery-hammerjs/jquery.hammer'], "materialize": ['//cdnjs.cloudflare.com/ajax/libs/materialize/0.97.1/js/materialize.min', '/components/materialize/dist/js/materialize'], "code-prettify": ['//cdn.rawgit.com/google/code-prettify/master/loader/run_prettify', '/components/google-code-prettify/src/run_prettify'], "jquery": ['//code.jquery.com/jquery-2.1.4.min', '/components/jquery/dist/jquery.min'] } });
В данной конфигурации у нас установлено несколько библиотек, установка ни чем не отличается от установки jquery и устанавливаются командой composer require bower-asset/{имя пакета}
где {имя пакета}
соответсвенно имя пакета в bower. В разделе paths
указываем путь к нашей библиотеке. При указании массива второй файл загружается только при недоступности первого. Раздел shim
предназначен для указания зависимостей, в данном примере при использовании materialize загрузятся jquery и jquery-hammerjs.
Для использования добавим в наш html
<script type="text/javascript" src=“/components/requirejs/require.js"></script> <script type="text/javascript" src="{{ asset(bundles/app/js/require.config.js) }}"></script>
В случае, если вы не используете Symfony просто укажите путь к вашему файлу require.config.js
.
Использование requirejs
Наши js файлы будут выглядеть примерно так.
requirejs(['jquery'], function ($) { 'use strict'; $(".button-collapse").each(function () { // делаем что-то полезное }); });
Для каждого раздела сайта создаем необходимые js файлы и не забываем их подключать. Если нам необходимо создать библиотеку, то в проекте в папке src/AppBundle/Resources/public/js/app/
создаем файл с именем библиотеки debug.js
и содержимым.
define(['jquery'], function ($) { 'use strict'; return { error: function (data) { console.log(data); } }; });
Возвращаем мы объект, который будем использовать в других файлах или библиотеках.
Добавляем в require.config.js
нашу папку для библиотек
{ "paths": { "app": "/bundles/app/js/app" } }
Использовать нашу библиотеку можно указав в зависимостях
requirejs(['app/debug'], function (debug) { 'use strict'; $(".button-collapse").each(function () { // делаем что-то полезное debug.error('some error'); }); });
Выводы
Данный способ позволяет устанавливать js/css библиотеки без настройки дополнительных репозиториев в вашем файле composer.json
. Для использования нам пришлось дополнительно устанавливать и настраивать requirejs, но в данном случае мы можем использовать библиотеки даже не установлены через менеджер пакетов. Еще один недостаток использования Component это то что библиотека считается устаревшей, и не будет больше поддерживаться, конечно плагин(robloach/component-installer) будет работать, но не будут добавлять новые библиотеки.