# Стартовый проект с gulp  [](https://david-dm.org/nicothin/NTH-start-project?type=dev) [](https://david-dm.org/nicothin/NTH-start-project)
# Стартовый проект с gulp  [](https://david-dm.org/nicothin/NTH-start-project?type=dev) [](https://david-dm.org/nicothin/NTH-start-project)
## НОВОЕ (как должно работать)
## Сборка разметки из pug
Директории, содержащие какие-либо файлы с разметкой:
```bash
./src/
blocks/ # Блоки
some-block/ # Директория блока (все технологии блока, в т.ч. и pug)
some-block.pug # Разметка блока (pug-примесь!)
pages/ # Страницы проекта
index.pug # Главная страница
pug/ # Служебные файлы (шаблоны, примеси)
layout.pug # Шаблон всех страниц
mixins.pug # Примеси (создаётся автоматически, инклудит ВСЕ блоки (из ./src/blocks/), имеющие одноимённый блоку pug-файл)
```
### Как собирается pug
При `npm start`:
1. Создаётся файл `./src/pug/mixins.pug`, содержащий инклуды всех pug-файлов блоков, независимо от использования на проекте. Инклуд добавляется только если в папке блока есть одноимённый блоку pug-файл.
2. Компилируются в html и пишутся в `./build/` все pug-файлы из `./src/pages/`.
3. Запускает сервер автообновления и слежения:
- если изменился pug-файл из `./src/pages/`, заново компилируется только изменённый файл,
- если изменился pug-файл блока или файл из `./src/pug/`, заново компилируются все файлы из `./src/pages/`.
### Полная сборка
- Определяются переменные, в т.ч. `config` из `./config.js` (все настройки).
- Из pug собирается html.
- Получившийся HTML анализируется, из атрибутов `class` формируется массив `blocksList` (файлы, перечисленные в `config.notGetBlocks` игнорируются; блоки, перечисленные в `config.ignoredBlocks` игнорируются).
- Формируется список использованных сейчас на проекте блоков:
- Из массива `config.blocks` убираются не использующиеся сейчас в разметке блоки.
- В массив `config.blocks` добавляются блоки, которые используются, но отсутствовали в нём (добавляются в конец).
- Если изменился список блоков, формируется контент `./config.js` и файл записывается на диск.
- Формируем список картинок: дополнительные из конфига, картинки блоков. Копируем картинки.
- Копируем доп. файлы: дополнительные из конфига, доп. файлы блоков.
- Копируем шрифты.
- Копируем стилевые и js-файлы, указанные как копируемые в конфиге.
- Обновляем страницу
### Изменение любого файла разметки
- Из pug собирается html.
- Получившийся HTML анализируется, из атрибутов `class` формируется массив `blocksListNew`.
- Из `blocksListNew` исключаются игнорируемые блоки, упомянутые в массиве `config.ignoredBlocks`.
- Сравниваются `blocksListNew` и `blocksList`:
- Если отличий нет, просто обновляется браузер.
- Если отличия есть:
-`configOld = config`
-ПОВТОР Формируем актуальный конфиг `config`:
- Добавляем не касающиеся блоков разделы из `configOld`.
- Обходим `blocksList` и проверяем для каждого блока существование стилевого файла, JS-файла, папки картинок. Записываем данные, идентичные старому конфигу по структуре.
- Записываем актуальный конфиг в файл `config.json`.