© 2021 WebHive

Сайт на БЭМ - готовим правильно!

По ходу изучения БЭМ методологии лично у меня возник целый ряд непонятных и даже на первый взгляд нелогичных моментов. Однако проявив терпение и изрядно покопавшись в форумах и разного обсуждениях я нашёл ответ на свои вопросы, что и хочу изложить в данной статье, чтобы не наступать лишний раз на грабли.

Как ни парадоксально, но основной источник проблем с пониманием БЭМ методологии это собственно документация к проекту, а так-же большинство туториалов и гайдов. Все эти материалы по моему мнению неверно расставляют акценты на различных аспектах методологии, что в конечном итоге приводит к в корне неверному пониманию работы этого стека технологий.

Не буду лишний раз рассказывать, что такое БЭМ — на эту тему достаточно материалов в сети. Речь пойдёт прежде всего о БЭМ как полном стэке технологий.

Что-же не так с этим БЭМ-ом?

Большинство гайдов как например небезызвестная статья Сайт с нуля на полном стеке БЭМ-технологий, да и многие другие материалы демонстрируют нам как ловко добавляя в bemjson блоки мы получаем требуемый результат. Действительно верстать блоками, вместо HTML тэгов гораздо продуктивнее. Но рано или поздно возникает ряд вопросов.

Почему JSON?

Начиная создавать структуру сайта в bemjson скоро становится понятно, что развесистое json-дерево крайне неудобно воспринимать визуально из-за обилия запятых и скобочек и ещё менее удобно перемещать блоки опять-же из-за тех самых скобочек и запятых. Одна запятая не в том месте и получаем ошибку и надо как-то найти где в этой каше находится тот самый неверный блок. Масла в огонь подливает бесполезность сообщений об ошибках БЭМ-а, в которых отсутствует информация где хотя бы приблизительно искать проблему.

Ну и естественно возникает вопрос — почему был выбран именно JSON? И неужели в Яндэксе принято так страдать? JSON хорош как формат данных для JS кода, но отнюдь не для ручного редактирования. Опять же непонятно зачем в bemjson-е добавлять элементы (БЭМ элементы)  — они-же вроде как являются внутренностями блока, но не добавив их в bemjson как тогда матчить на них bemhtml?

Почему bemjson только для бандлов?

Ещё одним моментом вызывавшим недоумение было отсутствие поддержки блоками bemjson`. Казалось бы логично было бы если бы блоки можно было описывать через bemjson. Но почему-то bemjson`` используется только для описания структуры бандла.

Как избежать повторения кода?

Вторая проблема с которой я столкнулся это невозможность избежать повторения кода. Практически все руководства, что я видел работаю в контексте одного бандла, поэтому такой проблемы не возникает. Но закончив одну страницу я решил сделать следующую и вполне логично, что это должен быть другой бандл. А новый бандл это новый bemjson. А так как большинство страниц имеют большое количество повторяющегося кода (шапка, сайдбар, футер и т. п.) то получается, что в каждом bemjson-е мы должны повторять эту структуру.

Отсюда следует, что если в проекте у нас десяток бандлов (разных типов страниц), то соответственно столько-же и bemjson-ов, которые на ¾ одинаковые. И если что-то надо поменять в общей структуре то придётся вручную перелопатить каждый bemjson-файл. В чём же тогда выгода о БЭМ, который как известно славится тем, что переопределить можно всё и везде? Получается, что и не всё и не везде, а в одном месте гибко и удобно, а в другом криво и через задницу.

Логичным выходом их этой ситуации было бы вынести весь код в bemhtml, но развивая эту идею мы получим, что bemjson вырождается в один единственный блок. Но это идёт в разрез со всеми обучающими материалами, в которых используется именно bemjson.

Да лааадно чувак — ты просто протупил

Как бы ни так. Судя по форуму БЭМ, гитхабу и гуглению/яндэксению такие вопорсы и непонятки возникают у многих (как минимум вот полный боли крик души ещё одного не осилившего). Более того люди выдумываю какие-то свои парсеры и генераторы, чтобы упростить/автоматизировать формирование bemjson-а. А всё потому, что второстепенная вещь которой является bemjson выставляется как first-class citizen, что выворачивает всю технологию наизнанку.

Что делать?

Как оказалось последнее предположение как раз и верное, но не совсем. Самое обидное, что вся информация есть в документации. Но всё так запутано и акценты расставлены так, что понять это крайне сложно. Впечатление создаётся именно, что bemjson и есть основной файл с которым мы работаем.

Однако это не так!!! Самое важное правило бойцовского клуба БЭМ разработчика — никогда не пиши bemjson руками. В этом нехитром правиле глубинный смысл БЭМ-а. Если хочешь постигнуть БЭМ-дзэн — просто следуй этому правилу.

Стоп-стоп — как-же без bemjson-а?

Казалось бы если нет bemjson-а — куда тогда матчить bemhtml шаблоны? А вся штука в том, что bemjson это внутренний формат БЭМ стэка для хранения структуры страницы. И он генерируется с помошью технологии bemtree. Ключевое слово генерируется. Ещё раз повторюсь — не надо заморачиваться с этим bemjson-ом. И лучше про него позабыть и рассматривать дерево блоков как абстрактное дерево без привязки к физической структуре.

Просто для аналогии — нам же не важно как физически хранятся данные в нашей любимой СУБД. Мы просто знаем синтаксис SQL и этого достаточно — мы оперируем данными без привязки к физической схеме их хранения.

Критикуешь — предлагай

Собственно разработчика вообще не должно касаться, что там за формат внутри — я просто должен пихать блоки в некое дерево, а как оно там внутри хранится в json-е, xml-е или в каком-то бинарном формате меня не касается.

Как уже выше писал — полная аналогия с базами данных. Я должен знать SQL, а не формат файла хранения даных на диске или формат обмена клиент-сервер.

Так же и с БЭМ — я должен знать как работать с абстрактным деревом блоков. Знать некий API для этого, а не внутренний промежуточный формат хранения этих данных. Это (API вместо bemjson-а) кстати позволило бы легче портировать БЭМ стэк на другие языки (но это уже так — фантазии на тему).

Это мне кажется так же упростило бы понимание БЭМ как технологии. Мы просто матчимся на дерево — без привязки к bemjson. Во это неявное присутствие bemjson в документации и гайдах оно на самом деле отвлекает от сути. Постоянно пытаешься мыслить в контексте этого json файла, а не дерева.

Ну и как тогда пользоваться этим вашим БЭМ-ом?

На самом деле вся суть изложена тут Трехзвенная архитектура в БЭМ. Но почему-то она подана как некий level up, как какой-то расширенный вариант для продвинутых. На мой взгляд то, что описано в этой статье это единственно правильный и возможный вариант использования БЭМ стэка.

Сначала с помощью BEMTREE мы генерируем дерево блоков (можно на основе данных, а можно и без). Именно тут у нас внутри появляется тот самый bemjson. Затем из этого дерева мы с помощью BEMHTML генерируем HTML и всё остальное (CSS, JS, документацию и пр.)

Заключение

Вышло несколько сумбурно. Хочется рассказать более понятно и полно. В формат одной статьи уложиться не получится. Тема довольно обширная. Поэтому планирую выпустить ряд уроков где на примере реального проекта попробую показать по шагам как всё сделать правильно.

Источники

Комментарии