Требуются установленный git и Node.js (LTS) не ниже 16 версии
- Открыть терминал, попасть в папку проектов, клонировать этот репозиторий (дополнительные настройки для VS Code на Windows смотрите ниже).
- Перейти в папку нового проекта (пример —
cd my-new-project
). - Удалить историю разработки:
rm -rf .git
- Установить зависимости проекта:
npm i
.
В редакторе кода или IDE установить (если не установлены) и включить плагины EsLint, Stylelint, EditorConfig и Prettier.
- Настройки Git:
git config --global core.autocrlf input
- Склонировать репозиторий
- Настройки VS Code:
Files: EOL
—\n
,Editor: Default Formatter
—Prettier — Code formatter
- Настройки плагина Prettier:
Prettier: End of Line
—lf
,Prettier: Config Path
—.prettierrc.json
- Настройки плагина EditorConfig:
Generate Auto
—false
Автоформатирование доступно по сочетанию клавиш — 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:
- Очищается папка сборки (
build/
). - Записывается файл
src/pug/mixins.pug
с includ-ами pug-файлов всех блоков (pug версия). - Компилируются файлы страниц (из
src/pages/**/*.[pug | html | hbs]
вbuild/*.html
). - Из скомпилированных html-файлов извлекаются все классы уровня БЭМ-блока. На основании этого списка будут построены диспетчер подключения стилей и список всех js-файлов проекта.
- Генерируется json файл для сборки html-страниц
- Генерируется svg-спрайт, в папку сборки копируются картинки блоков и доп. файлы из секции
addAdditions
файлаconfig.js
. - Записывается диспетчер подключения стилей
src/scss/style.scss
, в котором:
- Импорты файлов из секции
addStyleBefore
файлаconfig.js
. По умолчанию — SCSS-переменные и примеси. - Импорты файлов БЭМ-блоков, упомянутых в секции
alwaysAddBlocks
файлаconfig.js
. Таким образом, можно взять в сборку любой блок, даже если его css-класс не упоминается в разметке страниц. - Импорты файлов БЭМ-блоков, использующихся в разметке.
- Импорты файлов из секции
addStyleAfter
файлаconfig.js
.
- Записывается входная точка обработки скриптов
src/js/entry.js
, в которой:
require
файлов из секцииaddJsBefore
файлаconfig.js
.require
файлов БЭМ-блоков, использующихся в разметке.require
файлов БЭМ-блоков, упомянутых в секцииalwaysAddBlocks
файлаconfig.js
.require
файлов из секцииaddJsAfter
файлаconfig.js
.
- Компилируется диспетчер подключения стилей (
src/scss/style.scss
). Результат обрабатывается плагинами PostCSS. - Обрабатывается входная точка Javascript (
src/js/entry.js
). Используется Webpack. - Запускается локальный сервер и слежение за файлами для пересборки.
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 i package-name
) нужно:
- Прописать
require
в js-файле проектного блока (там же писать всё, что касается работы с этим модулем). Если сторонний модуль нужен без привязки к какому-либо проектному блоку, прописатьrequire
вsrc/js/script.js
(см. пример в файле). - Если нужно брать в сборку стилевые файлы модуля, прописать их в секции
addStyleBefore
файлаconfig.js
(пример в файле). - Если нужно брать в сборку дополнительные файлы модуля, прописать их в
addAssets
файлаconfig.js
с указанием в какую папку их копировать (пример в файле).
Pug версия
Все страницы (см. src/pages/index.pug
) являются расширениями шаблонов из src/templates
(см. наследование шаблонов), в страницах описывается только содержимое контентной области (см. блоки).
Каждый блок (в src/blocks/
) может (не обязан) содержать одноимённый pug-файл с одноименной примесью, который при старте сервера разработки будет взят includ-ом в файл src/pug/mixins.pug
.
Все страницы (см. 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-файл будет взят в сборку стилей.
Используемый постпроцессинг:
postcss-pxtorem
— генерирует rem-единицы из пикселей для ['font', 'font-size', 'line-height', 'letter-spacing'], настроить список css-свойств можно в gulpfile.js
Автопроверка с stylelint и плагинами. См. .stylelintrc
.
- БЭМ-именование:
__
— разделитель элемента,--
— разделитель модификатора. - Один Блок = один стилевой файл.
- Очередность селекторов:
- Инклуды примесей
- Стилевые правила сущности
- Медиаусловия
- Модификаторы блока
- Псевдоселекторы и псевдоэлементы
- Сторонние вложенные селекторы
- Элементы блока
Точка входа (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% высоты вьюпорта (значение пересчитывается при изменении размеров).
Собирает все pug-примеси и генерирует src/pug/mixins.pug
Компилирует pug из src/pages/**/*.pug
в html-страницы в build/**/*.html
, при компиляции страниц могут использоваться данные из src/json/data.json
То же самое, что и compilePug
, но учитывает изменения файлов после последнего запуска
Компилирует html из src/pages/**/*.html
в html-страницы в build/**/*.html
Компилирует html из src/pages/**/*.hbs
в html-страницы в build/**/*.html
, при компиляции страниц могут использоваться данные из src/json/data.json
Копирует все файлы из src/assets/**/*.*
в build/assets/**/*.*
Копирует все файлы из src/blocks/**/img/*.[png,jpg,jpeg,svg,gif]
в build/img/**/*.png,jpg,jpeg,svg,gif
Копирует все файлы из src/img/**/*.*
в build/img/**/*.*
, а также файлы src/favicon/*.*
в build/img/favicon
В файле ./config.js
можно настроить объекты копирования, их исходное и целевое расположения
Копирует файлы шрифтов из src/fonts/**/*.*
в build/fonts/**/*.*
Генерирует общий svg-спрайт из svg-файлов находящихся в src/symbols
и src/blocks/**/symbols/**/*.svg
в build/img/svgSprite.svg
Собирает все sass-импорты и генерирует src/scss/style.scss
Компилирует scss из src/scss/style.scss
в css в build/css/style.css
Собирает все js-зависимости и генерирует src/js/entry.js
Компилирует общий js файл build/js/bundle.js
, используется при default задаче
То же что и compileJs, за исключением, что итоговый файл сжимается, используется при build задаче
Генерирует общий json-файл из src/data/**/*.json
в src/json/data.json
Очищает папку build/
Отправляет содержимого папки сборки на gh-pages (нужен репозиторий на github.com)
Build-сборка проекта со сжатием скриптов
Dev-сборка проекта с live-сервером
- Fluid function — scss-функция, которая позволяет гибко изменять числовое значение свойства от
min
доmax
в заданном диапазоне ширины экрана - Flexbox
- Hide-text
- List-reset
- button
- input
- textarea
- select
- checkbox
- radio
- field
- form
- tabs