Добрый вечер!
Я занимаюсь веб-разработкой на ASP.NET MVC и хотел бы применить методологию БЭМ с этой платформой. Думаю, моих знаний по .NET будет достаточно для написания инструментов, помогающих использовать этот подход, но остались некоторые вопросы, связанные с БЭМ. Буду рад, если кто-то из вас сможет мне помочь.
Итак...
1. Правильно ли я понимаю жизненный цикл запроса к серверу?
- запрос, в зависимости от адреса, приходит в какой-то обработчик;
- выполняется какая-то бизнес-логика (например, достаются данные из БД и как-то обрабатываются);
- строится БЭМ-дерево, содержащее информацию о структуре блоков, из которых состоит страница и данные для блоков;
- по БЭМ-дереву рендерится страница: для нужных блоков подтягиваются соответствующие шаблоны, все js-скрипты для всех блоков подключаются одним общим файлом, одним общим файлом подключаются все стили и это отправляется на клиент;
2. Правильно ли я понимаю, что блок ничего не знает о вложенных блоках и их состав задается БЭМ-деревом? Т.е. механизм сборки страницы тупо проходит по дереву и подставляет нужные шаблоны.
3. Где хранится информация о том, какие элементы находятся внутри блока? Как код, создающий БЭМ-дерево, узнает что, например, в блок поисковой формы нужно добавить 2 ээлмента дерева: поле ввода и кнопку? Что приозойдет при сборке страницы, если в БЭМ-дереве не окажется какого-то элемента, нужного для блока?
4. Как передаются данные для формирования контента блока? Описана ли где-то ли модель данных? Передаются данные, которые будут непосредственно отображаться, или в блоке может быть логика по их подготовке для отображения?
5. Имеют ли элементы собственные шаблоны, или "элемент" - это только какой-то конкретный тэг конкретного блока?
6. Правильно ли я понимаю, что, если блок содержит таблицу, то каждая ее строка и каждая ячейка - это отдельный элемент, который должен быть помечен отдельным классом (например, "b-block-name__table-cell")?
Буду благодарен, если кто-нибудь ответит хотябы на часть вопросов.
Привет!
1. БЭМ методология не очень распространяется на жизненный цикл, поэтому всё на вашей совести.
Если хочется какие-то данные (не важно откуда они: бд, файлы и т.д.) превратить в страницу, то нужно как-то построить БЭМ-дерево (обычно это bemjson), отдать его на расстерзание шаблоизаторам и получить html.
bemjson можно просто написать и откомпилить БЭМ-тулзами, можно строить динамически и отдавать шаблонизаторам.
Если написать bemjson и отдать БЭМ-тулзам, то они посмотрят из каких блоков он состоит, и попытаются сами написать декларацию, на основе которой будут подтягивать стили/js/шаблоны и все остальные реализации блоков, а потом по этой декларации будут собирать солянки файлов по каждой из технологий (напр. index.html, _index.css, _index.js и тд). Но это чаще, если надо просто сверстать страницы.
Если же надо динамически их генерировать, то обычно пишутся декларации для бандлов (обычно bemdecl.js), по которым БЭМ-тулзы налепят нужные вам слепки блоков по технологиям (т.е. бандлы).
Бандл - это просто некоторая смысловая сборка, самый частый её пример - это страница. Но может быть что-то меньше страницы, или несколько страниц, или любые другие варианты, это решать вам, для ваших задач.
2.
- У блока может быть шаблон, каторый включает или использует другие блоки.
- Блок может узнать о других блоках, элементах и т.д. на клиенте с помощью i-bem.js.
3. У блока может быть шаблон, который скажет, что нужно добавить 2 элемента. Ещё блок может иметь клиентский-js, который будет искать где-то свои элементы.
Кровь, кишки, распидорасило... Как-то отработает без этого элемента: тут важно понимать о какой технологии идёт речь, и что подразумевается под не окажется.
4. Есть технологии и библиотеки которые из данных делают bemjson:
- bemtree
- bem-json
- priv.js
- чистый javascript
- ваше решение
Если любишь MVC-паттерн, то есть библиотека bem-mvc
5. Элементы могут иметь собственные шаблоны, могут быть представлены в клиентской js реализации как отдельные сущности, вообщем при желании могут быть довольно обособленными.
Ни блоки не элементы напрямую не привязаны к тегам. Много блоков/элементов может находиться на одной дом-ноде, и один блок/элемент может находиться на нескольких дом-узлах.
6. Всё зависит от задач, можно представить и так, можно как-то иначе.
Т.е. у блока не просто список вложенных блоков, а несколько мест, куда можно вставить другие блоки. Если они переданы в БЭМ-дереве, то они попадают на страницу, так?
Т.е. правильно ли я понял, что модель либо зашита в коде, который генерирует БЭМ-дерево, либо данные о ней содержатся в некоторых файлах настроек, по которым потом происходит мэппинг?
Да, это совсем не список, это полноценный шаблон, в котором можно творить чудеса
Если у блока есть шаблон, использующий другие блоки, то чтобы они попали в итоговый результат они должны попасть в декларацию (bemdecl.js).
В декларацию можно попасть, если есть в bemjson.js, если описаны ручками в bemdecl.js, или если записаны в зависимостях у блока (deps.js)
Если элемент может иметь собственый шаблон и может быть всавлен в любой блок (путем формирования соответствующего БЭМ-дерева), чем он тогда принципиально отличается от блока?
вопрос про bem-mvc?
Ну, я имел в виду, что если блок знает о своих элементах, то зачем передавать их в БЭМ-дереве?
Нет, вопрос общий. Про bem-mvc пока ничего не знаю (но скоро узнаю
У элемента есть честный наймспейс в лице своего блока, и элементы к блокам "ближе" чем другие блоки.
А вот технически они ничем не урезаны.
в bemjson можно и не передавать Шаблон может сделать эту грязную работу сам.
С БЭМ, как бы это... свобода!
Сам БЭМ ничего не говорит о моделях, это опять же кому как нравится, можно, ведь, и без моделей всё делать.
Спасибо большое! После Ваших ответов все стало значиельно понянее!