Всем привет :)
Я вот не совсем понимаю назначение bemtree... Для меня он выглядит некой лишней прослойкой (возможно я его не до конца понимаю).
BEM дерево у нас ведь могут генерировать и BH и BEMHTML. Зачем использовать для этого ещё и bemtree? Или его можно не использовать?
П.Н. Я где-то встречал уже подобный вопрос, но пробежав по тегам на форуме - ничего не нашёл...
bemtree генерирует входные данные для bemhtml. данные от вашего сервера попадают в bemtree, на выходе получается bemjson bemjson попадает в bemhtml, на выходе получается html Есть альтернативные технологии, например, sbmaxx/bem-priv
1) Без bemtree не будет возможности автогенерации bemjson в синтаксисе bemhtml, а значит придется собирать его руками; 2) Либо же, если перенести логику bemtree на уровень bh/bemhtml — deps будет разрастаться, и потеряется гибкость шаблонов блоков.
Основная мысль в том, что bemjson нужен как есть, он максимально логично и полно отражает структуру страницы в БЭМ-терминах, а значит вариант (2) не возможен, а вариант (1) руками делать не хочется => нужен bemtree или аналог. Как аналог был priv.js — можно поискать причины его появления. Для bh сейчас есть идея использовать processBemJson как вариант bemtree, с отдельным набором матчеров — оно получится немного беднее, но главное, что будет возможность на выходе иметь bemjson, и значит иметь т.н. poor-man аналог bemtree, но на чистом js без необходимости сборки (bemtree/bemhtml требуют компиляции xjst).
Надеюсь, общий смысл ясен ;-)
По сути bemtree - это нормализация данных? Его синтаксис очень похож на bemhtml, что вызывает некую непонятность.
Без bemtree вообще можно обойтись?
@zxqfox bemtree/bemhtml не требуют никакой компиляции в dev режиме
@belozyorcev Наоборот, bemtree и аналоги - это денормализация данных.
Можно обойтись без bemtree, собирая bemjson из входных данных любым другим способом.
@belozyorcev Смотря что вкладывать в процесс нормализации. На мой взгляд этот термин не полно отражает смысл, скорее это сборка bemjson из сырых данных.
Это так задумано ;-)
Можно, конечно, но в любом случае bemjson собирать нужно, и в этом случае будет изобретаться свой велописед. bemtree не идеален, но ничего лучше я пока не видел ;-) И если бы оно появилось в открытом доступе — здесь про это бы говорили.
@apsavin dev режим до сих пор unstable, не считается ;-)
@zxqfox
да. Именно это и хотел сказать :)
@zxqfox не замечаю никакой нестабильности. На аналог bemtree я выше дал ссылку. Это уже к "здесь про это бы говорили"
@apsavin Есть некоторые несовместимости при использовании упрощенного синтаксиса, из-за которой одни и те же шаблоны в dev режиме просто не работали. Я давно туда не лез, так что возможно уже либо запретили, либо исправили. Не уверен. Но в продакшн режиме bemxjst явно стабильнее.
@zxqfox были проблемы раньше, да, сейчас синтаксис стал более строгим.
@zxqfox А как ты генерируешь bemjson для bh.php?
@kompolom Ну пока руками. В самом большом проекте мы используем смарти, и только пытаемся съехать на bh.php.
Сейчас генерируем (либо модифицием) входное из админки дерево руками в «модулях», которые отрабатывают для разных типов страниц. Типы страниц (условно
p-*
) имеют свои шаблоны, и свой пхп код. Сейчас они лежат отдельно от блоков, и хотим усовершенствовать этот процесс.Можно, например, запускать в контексте объекта класса
BlocksLayout
(или типа того), условно, файлm-layout.bemphp
(в блоке m-layout, где layout — тип лайаута страницы):Дальше отрабатывает такой же файл для каждого из
content
(в данном случае блокаp-something
) и идем глубже, по аналогии с bemtree.Мы не хотим разбрасываться такими вещами, потому что их сложно кешировать тонко, и эти
bemphp
вp-*
часто будут содержать что-то типа$this->layout->getContent()
, который генерируется полуавтоматически в админке.Что будет дальше — возможно, вместо таких файлов сделаем что-то вроде
prebh.php
, в котором напишем матчеров дляbh.php
, и будем запускатьprocessBemJson
с сырыми данными. Но тут надо и прибраться в блоках проекта, и желательно, чтобы не уходить далеко в сторону, реализовать это вbh.js
.А bemjson у вас настоящий (js), или создаете аналогичную структуру на php массивах?
@kompolom На пхп. У нас это, т.н. BEMContent, у которого есть
->traverse
и->map
, позволяющие бегать по нему и модифицировать. ;-) Но мы от этого хотим уйти, потому что не очень быстро. И очень громоскоЯ вот тоже задался вопросом. При изучении BEM-стека я предпочёл использовать
BH
. Начал эксперементировать и даже делать компоненты. Один сейчас на ревью в конкурсе от Яндекса. Сейчас есть возможность внедрить такой подход к созданию компонентов на уровне компании. И вот пока я не зашёл слишком далеко (у меня в разработке ещё 2-3 аналогичных компонента), хочу посоветоваться с вами. Дело в том, что мои компоненты, в отличие отbem-components
, на вход ожидают данные в нормализованном виде. У меня возник страх, что я могу получить определённую долю гемороя из-за того, что я все преобразованияdata-bemjson-html
по сути выполняю в одном набореbh
шаблонов.Чем мне это грозит? Должен ли я срочно перейти на связку
bemhtml
+bemtree
?@Guria "срочно" ничего делать не нужно) Переходите или на bemhtml + bemtree, или на bh + priv.js Реализация priv.js может быть очень разной, если не хотите пилить сами - выше ссылка на готовую. Сложнее переиспользовать блоки, если формат данных, который ним приходит, зашит прямо в шаблоны.
@Guria, вот то-то и у меня
Посмотрим что ещё скажет @tadatuta после ревью :)
@Guria, а ты все вложенные блоки подключаешь через deps.js ? Используя такой подход.
Кто-то уже подключал bempriv.js ? Можете подсказать, что для этого нужно?