bem-site/bem-forum-content-ru

Хакатон: генерация Virtual DOM из bemhtml шаблонов с помощью движка для bem-xjst

awinogradov opened this issue · 37 comments

Задача научиться рендерить Virtual DOM из текущих шаблонов на bemhtml

Состав команды: @nik-kor @amel-true @khvostov @voischev @awinogradov. Все супер котаны!)

Результат

  1. Написали движок для рендера bemhtml шаблонов и положили аккуратно в PR bem/bem-xjst#235. Экспортит атрибуты в виде массива вида ['div', {...attrs}, content, ...anotherContent].
  2. Сделали адаптер для React https://github.com/bem-contrib/react-xjst, который использует бандл из шаблонов в bemhtml и инстанс React для создания Virtual DOM , с помощью библиотеки react-dom.
  3. Начали доставлять bem-components в React, используя bemhtml шаблоны и стили. Собирается с помощью Webpack и специального лоадера для него https://github.com/alfa-bank-dev/bem-loader, который резолвит все нужное по депсам через bem-deps. Можно дописывать bemhtml шаблоны на уровне проекта как и раньше;)
  4. Запилили песочницу для bem-xjst с переключателем движков: BEMHTML, BEMTREE, VIDOM – bem/bem-xjst#238. Одни шаблоны на все времена, тестить, сравнивать, все, что душе угодно можно делать.
  5. Так же планировали поработать над интеграцией с Redux. Но так сложилось, что задача решилась автоматически. На уровне React ничего не изменилось, поэтому данные как и раньше доезжают до компонентов, где формируется bemjson для функции рендера.

Превью готовых компонентов http://awinogradov.github.io/react-xjst-example/ и песочницы http://vladkhvo.github.io/.

Далее

Зарелизить react-components – библиотеку, которая использует шаблоны и стили из bem-components, но логику React в БЭМ-терминах.

Ура?;) Теперь мы имеем одни шаблоны и стили для параллельных стеков. Поддерживаем в одном месте и в ус не дуем! Предположительно можно написать подобных адаптеров и для других технологий;)

Проброс конструкторов React решили сделать экзотически) Положить на уровне React шаблоны для компонентов, в которых написать следующее:

block('button')(
    tag()(function() {
        const Input = require('./input.js'); // react-component
        return <Input />; // constructor instead of string, it's right for React.createElement function
    })
);
qfox commented

Можно использовать arrow functions...

А можно и не использовать...

Можно использовать arrow functions...

в общем коде пока еще нельзя все-таки

qfox commented

Я там вижу jsx, значит компиляция все равно нужна будет.

Можно и без него:) но мы уважаем хипстеров:)

Sent from my iPhone

On 05 Apr 2016, at 00:34, Alexej Yaroshevich notifications@github.com wrote:

Я там вижу jsx, значит компиляция все равно нужна будет.


You are receiving this because you were mentioned.
Reply to this email directly or view it on GitHub

Господи, я дожил до этого дня.

qfox commented

@JiLiZART не «Господи», а «Боже» ;-)

Теперь как бы придумать, чтобы реиспользовать логику из i-bem реализации компонентов, было бы очень круто.

qfox commented

реиспользовать логику из i-bem реализации компонентов

@JiLiZART рук не хватает, уже есть идеи.

@awinogradov только у меня репозиторий @amel-true :)

@zxqfox @awinogradov jsx внутри шаблонов не нужен.
Так должно быть ок

block('button')(
    tag()(function() {
        return require('../src/button/button');
    })
);

Как и обещал создал струтур react-components) приглашаю всех желающих к разработке) https://github.com/awinogradov/react-components

Все как у взрослых) Стили отдельно, шаблоны отдельно, js отдельно;)

bemhtml про генерацию html, но реакт не только про это, он еще и про поведение компонента. Как будет выглядеть шаблон(?) блока, у которого должно быть какое-то js поведение. Например такое: при клике на блок показать alert, как будет выглядеть в ваших блоках?

@megatolya я бы начал свой рассказ с того, что реакт не про генерацию html впринципе;) А закончил бы его тем, что наши компоненты ровно такие же как и ваши. А все алерты пишутся православно как и принято в js;) вот здесь прям вот видно https://github.com/awinogradov/react-components/blob/master/src/components/button/button.js

я бы начал свой рассказ с того, что реакт не про генерацию html впринципе;)

@awinogradov я как раз и написал, что реакт не только про это ;)

увидел, спасибо

@nik-kor Спасибо!

Можешь, пожалуйста, добавить ссылок на упоминаемые в посте штуки и репостнуть полный текст поста на https://en.bem.info/forum/ ?

Круто, спасибо тебе!

А как этим пользоваться? Подключил форк @awinogradov на проект. Изменений не заметил. Что то в проекте нужно менять, чтобы использовать VIDOM?

@kompolom Этим не нужно пользоваться) Это же искусство) :trollface:

А так тебе нужен вот этот пул-руквест bem/bem-xjst#235, вот этот адаптер https://github.com/bem-contrib/react-xjst и можно смотреть примеры вот тут https://github.com/awinogradov/react-bl/tree/master/src

@awinogradov А без react?

Я правильно понимаю, что существующий проект на bemhml + i-bem.js не получится перевести на virtual DOM?

@kompolom получится, но i-bem код придется выбросить

@awinogradov распечатаю код, повешаю на стену в рамочку, буду фапать любоваться :)

Смотрю на react-bl - не вижу bemjson. Плохо ищу или его нет?

А в чем тогда смысл bemhtml шаблонов, если у нас в компоненте все описывается?

@kompolom не уловил я суть вопроса. Что описывается в компоненте? Можешь вот по этому коду сказать какая будет верстка?

Тупанул... Необычно все это, непривычно.

Ты запусти) Тебе понравится)

Кажется, можно представить, что React в данном случае - в том числе некая замена bemtree.

Круто, мечты сбываются =) Только подумал об этом, и тут вы уже запили =) Спасибо. Это реально классный инструмент.

ol-lo commented

@awinogradov как я понимаю, ты ушел от использования bem-xjst в https://github.com/bem/bem-react-core. Можешь рассказать почему?

@OlegErm ответил тут #1212