npm install && bower install
Дев-сервер
npm start
Страницы отвечают по запросу localhost:8080/dist/{page}.html
. Первый запрос обрабатывается долго — идет сборка, на последующие запросы блоки, которые не менялись кешируются, перебилдивается только то, что изменилось.
Версия для прода
npm run build
Список страниц в pages.json
. Все страницы собираются из одного и того же bemdecl-файла:
module.exports = [{ block: "root" }];
Это означает, что у всех страниц один и тот же итоговый набор зависимостей. Это удобно, потому что в результате сборки статики нужно получить всего два файла:
parket.min.css
parket.min.js
Которые браузер получил на первый запрос любой страницы и закешируется.
Библиотеки:
- libs/bem-core
- libs/bem-components
Проектные блоки:
- common.blocks
- pages.blocks
В common
находятся:
- доопределения библиотечных блоков: тема
parket
для bem-components - предметнонезависимые блоки: ссылка, карта, ...
- общие для страниц блоки: шапка, футер, ...
В pages
находятся:
- большие, специфичные блоки страниц из которых и строится конечный интерфейс
Конечная bemjson-декларация страницы формируется с помощью bemtree
блоков уровня pages
: каждый блок умеет построить себя по данным.
Статика собирается в папке dist
. Кроме автоматически генерируемых файлов, там есть:
dummy
: папка с картинками, которые в реальной верстке будут другими — картинки товаров и т.д.i
: картинки, которые нужны для верстки
По большей части, все картинки в продовской версии css заинлайнены через base64
Это статичная верстка — бекенда нет, поэтому исходные данные захардкожены в bemtree
блоков.
Если html должен генерироваться в рантайме, то имеет смысл ввести еще один уровень абстракции для работы с данными — модели, которые будут использоваться на сервере.
Примерная схема такая:
- каждый блок умеет построить себя по данным с помощью bemtree
- все данные, которые нужны всем страницам разбиты на модельки: товар, коллекция товаров, адрес и т.д.
- каждый блок может обратиться к различным моделям, чтобы получить необходимые для своей отрисовки данные
- модель не обязательно соответствует одной http-ручке бекенда, но в большинстве случаев это так