Skip to content

motosasha/project-builder

Repository files navigation

Сборщик для проектов (pug, html, hbs)

Установка

Требуются установленный git и Node.js (LTS) не ниже 16 версии

  1. Открыть терминал, попасть в папку проектов, клонировать этот репозиторий (дополнительные настройки для VS Code на Windows смотрите ниже).
  2. Перейти в папку нового проекта (пример — cd my-new-project).
  3. Удалить историю разработки: rm -rf .git
  4. Установить зависимости проекта: npm i.

В редакторе кода или IDE установить (если не установлены) и включить плагины EsLint, Stylelint, EditorConfig и Prettier.

Настройка для VS Code на Windows:

  1. Настройки Git: git config --global core.autocrlf input
  2. Склонировать репозиторий
  3. Настройки VS Code:
  • Files: EOL\n,
  • Editor: Default FormatterPrettier — Code formatter
  1. Настройки плагина Prettier:
  • Prettier: End of Linelf,
  • Prettier: Config Path.prettierrc.json
  1. Настройки плагина EditorConfig: Generate Autofalse

Автоформатирование доступно по сочетанию клавиш — Shift + Alt + F (можно настроить форматирование при сохранении файла).

Команды

npm run start         # запуск сервера разработки
npm run deploy        # отправка содержимого папки сборки на gh-pages (нужен репозиторий на github.com)
npm run build         # сборка без запуска сервера разработки
npm run test          # проверка всех [pug- | html-], scss- и js-файлов на соответствие правилам (см. [.pug-lintrc | html-linter.json], .stylelintrc и eslintrc соответственно)
npm run test:pug      # проверить только pug-файлы (pug версия сборщика)
npm run test:html     # проверить только html-файлы (html версия сборщика)
npm run test:style    # проверить только scss-файлы
npm run test:js       # проверить только js-файлы
npx fix:style         # исправить только scss-файлы
npx fix:js            # исправить только js-файлы
npx prettier:js       # проверить только js-файлы через Prettier
npx prettier-fix:js   # исправить только js-файлы через Prettier

Парадигма

  • Именование классов по БЭМ, разметка в pug или в html, или hbs, стилизация Sass. См. как работать с CSS-препроцессорами и БЭМ.
  • Каждый БЭМ-блок находится в своей папке внутри src/blocks/. Имена файлов в папке должны совпадать с именем блока. См. ниже про Блоки.
  • Есть файл конфигурации, определяющий попадание в сборку дополнительных файлов и неиспользованных в разметке блоков. Смотри config.js.
  • Можно использовать глобальные файлы:
    • src/js/script.js — общий js, берётся в сборку по умолчанию
  • Список pug-примесей src/pug/mixins.pug генерируется автоматически (pug версия сборщика) и содержит include существующих pug-файлов всех блоков.
  • Диспетчер подключения стилей src/scss/style.scss генерируется автоматически и содержит импорты стилевых файлов использованных в разметке блоков и импорты доп. файлов, указанных в config.js.
  • Входная точка обработки js (src/js/entry.js) генерируется автоматически и содержит require js-файлов использованных в разметке блоков и доп. файлов, указанных в config.js.
  • Используется кодгайд (относительно жёсткий), его проверка делается перед коммитом или вручную (npm run test), ошибки выводятся в терминал.
  • Есть механизм быстрого создания нового блока: node new.js new-block (создаёт папки и scss-файл). После имени нового блока можно дописать нужные расширения.

Структура

build/       # Папка сборки (результат работы над проектом)
src/         # Исходники
  assets/    # Файлы контента (то, что загружается пользователем)
  blocks/    # Блоки (подпапки с блоками)
  data       # Папка с базой данных json
  favicon/   # Фавиконки (копирование прописать в config.js)
  fonts/     # Шрифты (копирование прописать в config.js, подключение в src/blocks/page/page.scss)
  img/       # Общие изображения
  js/        # Общие js-файлы, в т.ч. точка сборки для webpack и общие модули
  json/      # Служебная папка для сборки страниц с json
  pages/     # Страницы проекта (при компиляции: src/pages/index.[pug | html | hbs] → build/index.html)
  templates/ # Служебные [pug- | html- | hbs-] файлы (шаблоны страниц, примеси)
  scss/      # Служебные стилевые файлы (диспетчер подключений, переменные, примеси)
  symbols/   # Иконки для svg-спрайта

Как это работает

При npm start запускается дефолтная задача gulp:

  1. Очищается папка сборки (build/).
  2. Записывается файл src/pug/mixins.pug с includ-ами pug-файлов всех блоков (pug версия).
  3. Компилируются файлы страниц (из src/pages/**/*.[pug | html | hbs] в build/*.html).
  4. Из скомпилированных html-файлов извлекаются все классы уровня БЭМ-блока. На основании этого списка будут построены диспетчер подключения стилей и список всех js-файлов проекта.
  5. Генерируется json файл для сборки html-страниц
  6. Генерируется svg-спрайт, в папку сборки копируются картинки блоков и доп. файлы из секции addAdditions файла config.js.
  7. Записывается диспетчер подключения стилей src/scss/style.scss, в котором:
  • Импорты файлов из секции addStyleBefore файла config.js. По умолчанию — SCSS-переменные и примеси.
  • Импорты файлов БЭМ-блоков, упомянутых в секции alwaysAddBlocks файла config.js. Таким образом, можно взять в сборку любой блок, даже если его css-класс не упоминается в разметке страниц.
  • Импорты файлов БЭМ-блоков, использующихся в разметке.
  • Импорты файлов из секции addStyleAfter файла config.js.
  1. Записывается входная точка обработки скриптов src/js/entry.js, в которой:
  • require файлов из секции addJsBefore файла config.js.
  • require файлов БЭМ-блоков, использующихся в разметке.
  • require файлов БЭМ-блоков, упомянутых в секции alwaysAddBlocks файла config.js.
  • require файлов из секции addJsAfter файла config.js.
  1. Компилируется диспетчер подключения стилей (src/scss/style.scss). Результат обрабатывается плагинами PostCSS.
  2. Обрабатывается входная точка Javascript (src/js/entry.js). Используется Webpack.
  3. Запускается локальный сервер и слежение за файлами для пересборки.

Динамические пути

config.js содержит в себе настройки для сборки проекта. Изменения в этом файле не отслеживаются, поэтому после внесения изменений следует перезапустить сборку.

Объект sources содержит в себе пути для размещения собранных файлов. Изменение путей (при указании путей через переменные) приведёт к изменению путей в итоговых html и css файлах, а также соберёт по этим адресам файлы. В объекте sources лежат пути для:

  • "js": "/js/",
  • "css": "/css/",
  • "img": "/img/",
  • "icon": "/img/svgSprite.svg#" (путь зависимый от img),
  • "fonts": "/fonts/",
  • "pages": "/",
  • "assets": "/assets/",

Объект paths содержит в себе пути для исходных файлов. В объекте paths лежат пути для:

  • "js": "js/",
  • "css": "css/",
  • "img": "./img/",
  • "icon": ./img/svgSprite.svg#" (путь зависимый от img),
  • "fonts": "fonts/",
  • "pages": "/",
  • "assets": "./assets/",

Разметка

Для разметки можно обратиться к объекту src (пример: href= src.icon + 'icon__default' будет заменен на href='/img/svgSprite.svg#icon__default')

Стили

Используйте /{{ ... }}/ для автоматической замены части пути (пример: ../{{img}}/filename.jpg будет заменен на ../img/filename.jpg), если в переменной img лежит /img/.

Блоки

Каждый блок лежит в src/blocks/ в своей папке.

Возможное содержимое блока:

demo-block/                       # Папка блока.
  img/                            # Изображения, используемые этим блоком (копируются в папку сборки).
  symbols/                        # Иконки, используемые этим блоком (попадают в общий спрайт).
  demo-block.[pug | html | hbs]   # Разметка (pug-примесь, отдающая разметку этого блока, описание API примеси).
  demo-block.scss                 # Стилевой файл этого блока (без стилей других блоков).
  demo-block.js                   # js-файл блока (без скриптов других блоков).
  readme.md                       # Описание для документации, подсказки.

Создание нового блока

# формат: node new.js ИМЯБЛОКА [доп. расширения через пробел]
node new.js demo-block        # создаст папку блока, demo-block.scss
node new.js demo-block pug js # создаст папку блока, demo-block.scss, demo-block.pug, demo-block.js

Доступные опции при создании блока:

img       # создаёт подпапку img/ для этого блока
symbols   # создаёт подпапку symbols/ для этого блока
pug       # создаёт pug-файл (pug версия)
html      # создаёт html-файл (html версия)
hbs       # создаёт hbs-файл (hbs версия)
js        # создаёт js-файл
md        # создаёт md-файл

Если блок уже существует, файлы не будут затёрты, но создадутся те файлы, которые ещё не существуют.

Сторонние npm-модули

Если нужно взять в сборку сторонний модуль, то после его установки (к примеру — npm i package-name) нужно:

  1. Прописать require в js-файле проектного блока (там же писать всё, что касается работы с этим модулем). Если сторонний модуль нужен без привязки к какому-либо проектному блоку, прописать require в src/js/script.js (см. пример в файле).
  2. Если нужно брать в сборку стилевые файлы модуля, прописать их в секции addStyleBefore файла config.js (пример в файле).
  3. Если нужно брать в сборку дополнительные файлы модуля, прописать их в addAssets файла config.js с указанием в какую папку их копировать (пример в файле).

Разметка

Pug версия

Все страницы (см. src/pages/index.pug) являются расширениями шаблонов из src/templates (см. наследование шаблонов), в страницах описывается только содержимое контентной области (см. блоки).

Каждый блок (в src/blocks/) может (не обязан) содержать одноимённый pug-файл с одноименной примесью, который при старте сервера разработки будет взят includ-ом в файл src/pug/mixins.pug.

HTML версия

Все страницы (см. src/pages/index.html) используют включения из src/templates и блоков src/blocks/. Для внедрения используется gulp-file-include.

Каждый блок (в src/blocks/) может (не обязан) содержать одноимённый html-файл, который нужно будет упомянуть на странице.

Hbs версия

Все страницы (см. src/pages/index.hbs) являются расширениями шаблонов из src/templates, в страницах описывается только содержимое контентной области.

Каждый блок (в src/blocks/) может (не обязан) содержать одноимённый hbs-файл, который нужно будет упомянуть на странице.

Стили

Диспетчер подключений (src/scss/style.scss) формируется автоматически при старте сервера разработки.

Каждый блок (в src/blocks/) может содержать одноимённый scss-файл со стилями этого блока. Если блок используется в разметке (или упомянут в config.js#alwaysAddBlocks), его scss-файл будет взят в сборку стилей.

Используемый постпроцессинг:

  1. autoprefixer
  2. css-mqpacker
  3. postcss-import
  4. postcss-pxtorem

postcss-pxtorem — генерирует rem-единицы из пикселей для ['font', 'font-size', 'line-height', 'letter-spacing'], настроить список css-свойств можно в gulpfile.js

Стилевой код-гайд

Автопроверка с stylelint и плагинами. См. .stylelintrc.

  1. БЭМ-именование: __ — разделитель элемента, -- — разделитель модификатора.
  2. Один Блок = один стилевой файл.
  3. Очередность селекторов:
  • Инклуды примесей
  • Стилевые правила сущности
  • Медиаусловия
  • Модификаторы блока
  • Псевдоселекторы и псевдоэлементы
  • Сторонние вложенные селекторы
  • Элементы блока

Скрипты

Точка входа (src/js/entry.js) формируется автоматически при старте сервера разработки. Точка входа обрабатывается webpack-ом (с babel-loader).

Для глобальных действий предусмотрен src/js/script.js (см. config.js#addJsAfter и config.js#addJsBefore).

Каждый блок (в src/blocks/) может (не обязан) содержать одноимённый js-файл. Если блок используется в разметке (или упомянут в config.js#alwaysAddBlocks), его js-файл будет взят в сборку стилей.

Инлайн-скрипт

По умолчанию в шаблоне (src/pug/layout.pug) прописана вставка в <head> скрипта src/js/head-script.js, в котором для узла <html> указано:

  • Убрать класс no-js и добавить класс js.
  • Добавить класс с указанием названия браузера и ОС.
  • Добавить класс touch или no-touch, в зависимости от типа интерфейса.
  • Добавить кастомное свойство --vh со значением в 1% высоты вьюпорта (значение пересчитывается при изменении размеров).

Задачи сборщика

writePugMixinsFile (pug версия)

Собирает все pug-примеси и генерирует src/pug/mixins.pug

compilePug (pug версия)

Компилирует pug из src/pages/**/*.pug в html-страницы в build/**/*.html, при компиляции страниц могут использоваться данные из src/json/data.json

compilePugFast (pug версия)

То же самое, что и compilePug, но учитывает изменения файлов после последнего запуска

htmlBuild (html версия)

Компилирует html из src/pages/**/*.html в html-страницы в build/**/*.html

compileHbs (hbs версия)

Компилирует html из src/pages/**/*.hbs в html-страницы в build/**/*.html, при компиляции страниц могут использоваться данные из src/json/data.json

copyAssets

Копирует все файлы из src/assets/**/*.* в build/assets/**/*.*

copyBlockImg

Копирует все файлы из src/blocks/**/img/*.[png,jpg,jpeg,svg,gif] в build/img/**/*.png,jpg,jpeg,svg,gif

copyAdditions

Копирует все файлы из src/img/**/*.* в build/img/**/*.*, а также файлы src/favicon/*.* в build/img/favicon

В файле ./config.js можно настроить объекты копирования, их исходное и целевое расположения

copyFonts

Копирует файлы шрифтов из src/fonts/**/*.* в build/fonts/**/*.*

generateSvgSprite

Генерирует общий svg-спрайт из svg-файлов находящихся в src/symbols и src/blocks/**/symbols/**/*.svg в build/img/svgSprite.svg

writeSassImportsFile

Собирает все sass-импорты и генерирует src/scss/style.scss

compileSass

Компилирует scss из src/scss/style.scss в css в build/css/style.css

writeJsRequiresFile

Собирает все js-зависимости и генерирует src/js/entry.js

compileJs

Компилирует общий js файл build/js/bundle.js, используется при default задаче

buildJs

То же что и compileJs, за исключением, что итоговый файл сжимается, используется при build задаче

buildJson

Генерирует общий json-файл из src/data/**/*.json в src/json/data.json

clearBuildDir

Очищает папку build/

deploy

Отправляет содержимого папки сборки на gh-pages (нужен репозиторий на github.com)

build

Build-сборка проекта со сжатием скриптов

default

Dev-сборка проекта с live-сервером

Переиспользуемые scss-миксины

  1. Fluid function — scss-функция, которая позволяет гибко изменять числовое значение свойства от min до max в заданном диапазоне ширины экрана
  2. Flexbox
  3. Hide-text
  4. List-reset

Библиотека готовых блоков

  1. button
  2. input
  3. textarea
  4. select
  5. checkbox
  6. radio
  7. field
  8. form
  9. tabs

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published