Немного ранее я писала статью по настройке окружения для начала разработки на Angular JS.
Сейчас предлагаю немного подробнее разобраться с такой штукой, как Grunt. Сам по себе он ничего практически не умеет. Он умеет делать только одно — запускать таски.
Навигация
Структура проекта
Итак, у нас есть такая структура проекта:
|  | 
| Структура проекта | 
Описание каталогов:
- app: исходные файлы проекта — скрипты, стили, вёрстка
- dist: собранный проект, который можно уже использовать на production — используется минификация, обфускация и подобное
- server: проект, который собран частично — из этого каталога запускается develop server
- tmp: тут по названию понятно
Установка Grunt
Как я упоминала ранее, Grunt сам по себе ничего не делает, а просто запускает задачи, прописанные и настроенные в
Gruntfile.js. Предположим, что Node.js у вас уже установлен. Если нет — то можете посмотреть в этой статье (шаг первый).В систему нужно установить сам Grunt, вернее инструменты командной строки для него. Это делается только один раз на систему.
npm install -g grunt-clinpm install grunt --save-devnpm install.В первую очередь устанавливаем task loader. Это специальный модуль, который позволяет импортировать в Grunt все нужные модули тасков в одну строчку. Подробнее можно посмотреть тут
npm install load-grunt-tasks --save-devGruntfile.js. Для начала зарегистрируем свою задачу и назовём её server. В итоге наш файл будет выглядеть следующим образом:Теперь можно даже запустить нашу таску, которая ничего не делает ) Из каталога, где находится наш
Gruntfile.js открываем консоль и пишем:grunt serverПервый вид — это задачи, которые выполняются сторонними плагинами, например, минификация скриптов. Основная часть написания конфигурации Grunt — это настройка подобных задач.
Второй тип тасков — это те, которые прописываются непосредственно пользователем (т.е. нами с вами). По большей части эти задачи состоят из списка других задач, которые надо запускать. Таким образом получается, что целый список задач можно запускать одной командой.
Запуск сервера и Live Reload
Теперь создадим 2 таски. Первая запускает сервер (называется
connect), а вторая отслеживает изменения в файлах проекта и автоматически перезагружает страницу в браузере (работает по сокету, называется watch).npm install grunt-contrib-connect serve-static --save-dev
npm install grunt-contrib-watch --save-devGruntfile.js.Наш супер проект доступен по адресу http://localhost:9000
В данном случае используется
grunt-contrib-connect версии 0.11.x. Для его работы нужен serve-static. Объясню подробнее про строки 32 и 33.serveStatic('app')указывает, с какого каталога нужно смотреть файлы (относительно base, по умолчанию он смотрит на тот каталог, в котором находится
Gruntfile.js). Так что когда запустите http://localhost:9000, то отобразится ./server/index.html.connect().use('/bower_components', serveStatic('./bower_components'))тут немногосложнее. Каталог
bower_components находится в том же каталоге, что и Gruntfile.js, так что по хорошему к нему надо обращаться как ../bower_components. Но это не получится, т.к. мы попадаем на путь выше базового. Но достучаться до него нам надо (о самом bower будет чуть позже). Так что тут получается такой «маппинг», спрашиваем путь ./bower_components, а получаем содержимое ../bower_components.Узнать про настройки можно в описании в репозитории проектов:
https://github.com/gruntjs/grunt-contrib-connecthttps://github.com/gruntjs/grunt-contrib-watchТаски для dev
Copy
Чем отличается dev от production? В production обычно необходимо сделать минификацию и обфускацию скриптов и css. В то же время для разработки нам это не надо, т.к. нужно всё это дебажить. Поэтому мы сделаем 2 основные таски:
- server для dev
- build для production
index.html (об этом будет чуть позже), то для dev server и production build нам понадобятся несколько дополнительных каталогов в проекте. Они были описаны выше. А сейчас добавим настройки в Gruntfile.js, чтобы он знал про них. Добавим такую штуку:Не забывайте, что это всё обычный JavaScript, который выполняется в среде Node.js. Итак. Теперь нам нужно скопировать рабочие файлы из нашего проекта в каталог
server. Пока что будем копировать как есть. Для этого есть таска grunt-contrib-copy. Устанавливаем и настраиваем:npm install grunt-contrib-copy --save-devТеперь немного пройдёмся по настройкам.
cwd: '<%= config.app %>' // откуда копируем'<%= config.app %>'. Если посмотрите на строку 17, то увидите, что мы создали ссылку на наш список каталогов (config). Таким образом наша строка зарезолвится в значение, которое указано в config.app (т.е. в 'app'). Аналогично можно ссылаться на значения, которые указаны в конфигурациях тасков ('<%= connect.options.port %>' например).dest: '<%= config.server %>/' // куда копируемsrc: ['**', '!**/*.less'] // что копируем'.less' и не важно, в каком каталоге они находятся». Для указания паттернов путей или файлов используется такая штука как node-glob.Clean
Любому опытному разработчику ясно, что все эти папочки с билдами, временными файлами нужно очищать. Сейчас мы такую штуку сделаем. Устанавливаем и настраиваем, как всегда.
npm install grunt-contrib-clean --save-devЯ уже не добавляла сюда весь файл, а только изменения. Теперь каждый раз при запуске сервера, наш каталог будет очищаться и туда скопируются файлы с нуля. Это очень полезно, чтобы не оставались устаревшие файлы, из-за которых потом могут быть проблемы (вы внесли нужные изменения, а оно не работает оО).
Wiredep
Вот это будет очень интересная таска. При разработке UI части проекта, могут использоваться различные сторонние js-библиотеки или темы со стилями. Ручками их скачивать и добавлять в проект слишком муторно (все программисты ленивые же).
Wiredep аботает вместе с bower. Bower — система для управления зависимостями в js-проектах (например, стили bootstrap или библиотека jquery).
npm install grunt-wiredep --save-devДля того, чтобы посмотреть, как это работает, добавим jquery и bootstrap с помощью bower. Про установку и инициализацию bower в проекте смотрите тут.
bower install jquery --save
bower install bootstrap --saveWiredep для включения зависимостей в html-файл использует специальные комментарии. Выше в настройке самой таски указан файл, который надо обработать (
src: ['<%= config.server %>/index.html']). Вот таким образом он будет сейчас выглядеть:Запускаем сервер
grunt serverСмотрим в
server/index.html:Упс… Скрипты есть, а куда же подевались стили? Вообще да, bootstrap немного странно работает с bower. И тут надо кое-что подправить. Wiredep в процессе работы смотрит в файл
bower.json. Вот его то мы и подправим.Перезапускаем наш сервер, и теперь
server/index.html выглядит так:Что мы тут сделали? Обычно bower зависимости поставляются не только в виде готового для употребления js- или css-файла, но и с исходниками или другими сопутствующими файлами (например, шрифтами). Естественно из всего этого добра нам в html-файл нужно включить только часть. Вот именно эту информацию для wiredep’а мы и подправили. Кстати, теперь у нас не включился bootstrap’овский js-файл (будет вам небольшое домашнее задание исправить это ;)
Вообще это не всё. Даже для dev ещё много чего есть. Об этом я буду писать позже. А потом ещё и для production. Так что не расслабляйтесь (а точнее мне надо не лениться и писать дальше).

Комментариев нет:
Отправить комментарий