Перейти к главному содержимому

Django, webpack, bower и gulp

В наше время сборка фронтенда становится актуальным и всё более интересным вопросом. Если раньше собирать особо ничего и не требовалось, так как проекты состояли лишь из набора стилей и скриптов, то сейчас, с развитием javascript, появляется всё больше возможностей и интересных технологий.

Фронтенд меняется, а вместе с ним должны меняться и мы.

В качестве демонстрационного проекта буду рассматривать мой шаблон проекта для Django.

Итак, у нас в проекте используются технологии:

  • стили в scss, с трансляцией в css
  • скрипты на javascript (ES2015, ES7, JSX), с трансляцией в ES5
  • для сборки скриптов (и стилей) в бандл используется webpack
  • для установки зависимостей для сборки проекта используется npm
  • для установки библиотек от вендоров (статика) — bower
  • для задач по сборке фронтенда используется gulp
  • gulpfile использует синтаксис ES2015 и требует Node 6.

Полезные ссылки

Привожу все ссылки на исходники вначале статьи, так как дальше кода не будет, а будет общее описание подхода.

Структура директорий

Приведу частичную структуру директорий, касающуюся только фронтенда.

.
├── assets
│   ├── js
│   │   └── index.js
│   └── sass
│       └── index.scss
├── .bowerrc
├── bower.json
├── gulpfile.js
├── package.json
├── src
│   ├── manage.py
│   ├── project_name
│   │   ├── __init__.py
│   │   ├── static
│   │   │   ├── build
│   │   │   ├── css
│   │   │   ├── vendor
│   │   │   ├── img
│   │   │   └── js
│   │   ├── templates
│   │   ├── urls.py
│   │   └── views.py
└── webpack.config.js

Итак, как видно у нас две основные директории — src с исходниками приложения (бэкенда) и assets с исходниками графического интерфейса (фронтенд).

Преобразованные исходные файлы собираются в бандлы и кладутся в директорию проекта project_name/static/build, откуда и подключаются. Таким образом сборка прозрачно интегрируется с подсистемой статических файлов Django (django.contrib.staticfiles).

Зависимости проекта

Все зависимости для сборки проекта описаны в файле package.json. При развёртывании они устанавливаются с помощью команды npm install.

Также используется bower для управления статикой, а конкретно для удобной установки и обновления библиотек. Все либы ставятся в project_name/static/vendor/ и коммитятся в репозиторий.

Стили

Стили лежат в директории assets/scss и импортируются в файл index.scss. Сборка происходит с помощью тасков в gulp: sass:dev и sass:prod. В область видимости sass добавлена директория node_modules, так что исходники их сторонних пакетов можно импортировать прямо оттуда.

Пример подключения bootstrap-sass:

$ cat assets/sass/index.scss

@import "bootstrap-sass/assets/stylesheets/bootstrap";

Для дополнительного удобства разработки, в gulp подключен Browsersync, так что менять стилевое оформление можно прямо «на ходу». Разумеется, всё запускается автоматически, одной командой, но об этом позже.

Скрипты

Скрипты лежат соответственно в assets/js и подключаются в index.js. Сборка происходит с помощью webpack. Кстати сборщик умеет автоматически подключать нужные стили прямо в runtime (аттачит их в head страницы).

Поддерживается синтаксис ES2015 с фичами из ES7, а также JSX. За транспайлинг отвечает babel.

Задачи для сборки проекта

Для сборки проекта используется два типа задач — сборка в продакшн и девелопмент-сборка. Отличие сборок заключается в том, что для боевой сборки мы используем минификацию и прочие оптимизации, а для локальной — нет. На скорости это тоже отражается, так как пересборка изменений происходит на лету, при изменении исходных файлов — за этим следит gulp.

Вот список наших задач: - js:dev и js:prod — сборка яваскрипта - sass:dev и sass:prod — сборка стилей - django-runserver — запуск сервера django - browser-sync — запуск сервера browsersync - watch — слежение за изменёнными исходниками и запуск пересборки. Отслеживаются только стили, так как javascript сжимается вебпаком, который работает в режиме наблюдения (watch). Такое разделение обусловлено тем, что вебпак знает как эффективнее пересобрать изменившийся файл. - default — запуск сборки стилей, скриптов, сервера django, browsersync и слежения за изменениями. Команды запускаются для сборки разрабатываемой версии. - deploy — сборка стилей и скриптов в режиме для продакшена.

Интеграция django и gulp

Ребята из CaktusGroup в своём блоге описали опыт по интеграции сборки ассетов в Django−проекте. Вместо того, чтобы привязываться к конкретным инструментам Django (pipeline или compressor), они решили инвертировать процесс — и научили gulp запускать Django-проект (runserver) вместе с другими задачами.

Этот подход реализован и у нас, и, должен сказать — работает превосходно. Для того, чтобы приступить к полноценной разработке, достаточно одной команды — gulp. Всё запустится автоматически и будет готово к работе через несколько секунд. А благодаря Browsersync ещё и вкладка с сайтом откроется в браузере автоматически :)

Единственный нюанс в том, чтобы настроить работу Browsersync на порту 8000, а Django запускать на другом, например, 3000 и проксировать запросы от первого ко второму. Тогда для разработчика вообще всё будет прозрачно.

Итого

Данный подход позволяет нам ускорить процесс разработки и сделать его более удобным. Отсутствие ограничений в выборе используемых технологий и настройке сборки позволяет максимально гибко подстраиваться под меняющиеся реалии веб-разработки.

Одно могу сказать точно — пока в Django не появится крутой asset pipeline, мы будем использовать описанный в статье подход к разработке фронтенда.

Комментарии

Comments powered by Disqus