bem-site / bem-forum-content-ru

Content BEM forum for Russian speak users
MIT License
56 stars 6 forks source link

Есть ли смысл в bemtree, когда есть bh (bemhtml)? #282

Open belozer opened 9 years ago

belozer commented 9 years ago

Всем привет :)

Я вот не совсем понимаю назначение bemtree... Для меня он выглядит некой лишней прослойкой (возможно я его не до конца понимаю).

BEM дерево у нас ведь могут генерировать и BH и BEMHTML. Зачем использовать для этого ещё и bemtree? Или его можно не использовать?

П.Н. Я где-то встречал уже подобный вопрос, но пробежав по тегам на форуме - ничего не нашёл...

apsavin commented 9 years ago

bemtree генерирует входные данные для bemhtml. данные от вашего сервера попадают в bemtree, на выходе получается bemjson bemjson попадает в bemhtml, на выходе получается html Есть альтернативные технологии, например, sbmaxx/bem-priv

qfox commented 9 years ago

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).

Надеюсь, общий смысл ясен ;-)

belozer commented 9 years ago

По сути bemtree - это нормализация данных? Его синтаксис очень похож на bemhtml, что вызывает некую непонятность.

Без bemtree вообще можно обойтись?

apsavin commented 9 years ago

@zxqfox bemtree/bemhtml не требуют никакой компиляции в dev режиме

@belozyorcev Наоборот, bemtree и аналоги - это денормализация данных.

Можно обойтись без bemtree, собирая bemjson из входных данных любым другим способом.

qfox commented 9 years ago

По сути bemtree - это нормализация данных?

@belozyorcev Смотря что вкладывать в процесс нормализации. На мой взгляд этот термин не полно отражает смысл, скорее это сборка bemjson из сырых данных.

Его синтаксис очень похож на bemhtml, что вызывает некую непонятность.

Это так задумано ;-)

Без bemtree вообще можно обойтись?

Можно, конечно, но в любом случае bemjson собирать нужно, и в этом случае будет изобретаться свой велописед. bemtree не идеален, но ничего лучше я пока не видел ;-) И если бы оно появилось в открытом доступе — здесь про это бы говорили.

qfox commented 9 years ago

@apsavin dev режим до сих пор unstable, не считается ;-)

belozer commented 9 years ago

@zxqfox

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

да. Именно это и хотел сказать :)

apsavin commented 9 years ago

@zxqfox не замечаю никакой нестабильности. На аналог bemtree я выше дал ссылку. Это уже к "здесь про это бы говорили"

qfox commented 9 years ago

@apsavin Есть некоторые несовместимости при использовании упрощенного синтаксиса, из-за которой одни и те же шаблоны в dev режиме просто не работали. Я давно туда не лез, так что возможно уже либо запретили, либо исправили. Не уверен. Но в продакшн режиме bemxjst явно стабильнее.

apsavin commented 9 years ago

@zxqfox были проблемы раньше, да, сейчас синтаксис стал более строгим.

kompolom commented 9 years ago

@zxqfox А как ты генерируешь bemjson для bh.php?

qfox commented 9 years ago

@kompolom Ну пока руками. В самом большом проекте мы используем смарти, и только пытаемся съехать на bh.php.

Сейчас генерируем (либо модифицием) входное из админки дерево руками в «модулях», которые отрабатывают для разных типов страниц. Типы страниц (условно p-*) имеют свои шаблоны, и свой пхп код. Сейчас они лежат отдельно от блоков, и хотим усовершенствовать этот процесс.

Можно, например, запускать в контексте объекта класса BlocksLayout (или типа того), условно, файл m-layout.bemphp (в блоке m-layout, где layout — тип лайаута страницы):

<?php
return [
  'block' => 'page',
  'styles' => '{{assets:styles}}', // стили и скрипты собираются в рантайме
  'javascripts' => ...,
  'content' => [
    // передаем во внутрениий блок, где something — тип страницы,
    // и p-something — его блок
    'block' => 'p-something',
  ]
];

Дальше отрабатывает такой же файл для каждого из content (в данном случае блока p-something) и идем глубже, по аналогии с bemtree.

Мы не хотим разбрасываться такими вещами, потому что их сложно кешировать тонко, и эти bemphp в p-* часто будут содержать что-то типа $this->layout->getContent(), который генерируется полуавтоматически в админке.

Что будет дальше — возможно, вместо таких файлов сделаем что-то вроде prebh.php, в котором напишем матчеров для bh.php, и будем запускать processBemJson с сырыми данными. Но тут надо и прибраться в блоках проекта, и желательно, чтобы не уходить далеко в сторону, реализовать это в bh.js.

kompolom commented 9 years ago

А bemjson у вас настоящий (js), или создаете аналогичную структуру на php массивах?

qfox commented 9 years ago

@kompolom На пхп. У нас это, т.н. BEMContent, у которого есть ->traverse и ->map, позволяющие бегать по нему и модифицировать. ;-) Но мы от этого хотим уйти, потому что не очень быстро. И очень громоско

Guria commented 9 years ago

Я вот тоже задался вопросом. При изучении BEM-стека я предпочёл использовать BH. Начал эксперементировать и даже делать компоненты. Один сейчас на ревью в конкурсе от Яндекса. Сейчас есть возможность внедрить такой подход к созданию компонентов на уровне компании. И вот пока я не зашёл слишком далеко (у меня в разработке ещё 2-3 аналогичных компонента), хочу посоветоваться с вами. Дело в том, что мои компоненты, в отличие от bem-components, на вход ожидают данные в нормализованном виде. У меня возник страх, что я могу получить определённую долю гемороя из-за того, что я все преобразования data-bemjson-html по сути выполняю в одном наборе bh шаблонов.

Чем мне это грозит? Должен ли я срочно перейти на связку bemhtml+bemtree?

apsavin commented 9 years ago

@Guria "срочно" ничего делать не нужно) Переходите или на bemhtml + bemtree, или на bh + priv.js Реализация priv.js может быть очень разной, если не хотите пилить сами - выше ссылка на готовую. Сложнее переиспользовать блоки, если формат данных, который ним приходит, зашит прямо в шаблоны.

belozer commented 9 years ago

@Guria, вот то-то и у меня

Guria commented 9 years ago

Посмотрим что ещё скажет @tadatuta после ревью :)

belozer commented 9 years ago

@Guria, а ты все вложенные блоки подключаешь через deps.js ? Используя такой подход.

Кто-то уже подключал bempriv.js ? Можете подсказать, что для этого нужно?