Коллеги, давненько присматриваюсь к БЭМ методологии. Но никак не могу до конца понять как его интегрировать в проект на django. Может у кого есть опыт, поделитесь?
Коллеги, давненько присматриваюсь к БЭМ методологии. Но никак не могу до конца понять как его интегрировать в проект на django. Может у кого есть опыт, поделитесь?
/cc @tadatuta
На днях слышал про желание запилить bh-py — это позволит классическим способом писать шаблоны на аналоге bh и рендерить их питоном.
Видел еще такое: https://github.com/dyve/django-bootstrap3 ;-)
Кир @lensvol планировал попробовать написать такой пакет.
Лёш, сможешь поделиться с Кириллом опытом?
@tadatuta Конечно, пишите)
Я пробовал интегрировать bem-core в django для http://eifmanacademy.ru/, bem-core подтягивался через bower. Подключение js — руками, ну а дальше подзабросил всё это дело.
Вопрос, собственно в том, хочется ли тащить в django сборщик на ноде или писать свой на питоне.
@h4 можно собирать в момент разработки и публиковать пакет с уже собранным
@tadatuta ну вот на месте рядового python-разработчика я был бы не очень рад необходимости запускать что-то ещё. Ну и сборщик статики там уже есть из коробки, так что лучше бы расширить его.
@h4 в том-то и дело, что конечному пользователю потенциально ничего больше запускать не нужно — он ставит пакет, где все уже заранее собрано разработчиком шаблонизатора
А вы уверены, что стоит менять Django templates на что-то другое вот так вот сразу?
Идея в том, что не обязательно менять. Сделать 2 слоя:
bh-py
и обертку сверху, которая наружу будет торчать точно таким же способом, как https://github.com/dyve/django-bootstrap3Только бутстрап приезжает в виде единого js-файла и не завязан на модульную систему. А вот i-bem и бэм-блоки надо тоже будет собирать?
@v-bornov мы тут что-то сферическое обсуждаем, получается. Расскажите, как вы видите использование БЭМ+Django для себя?
Я так понимаю, что готовой реализации пока нет. А как вообще в теории можно организовать взаимодействие django и bem-стека?
Просто в документации по БЭМ в основном речь идет о статическом контенте. А еcли контент формируется динамически django...
Можно заворачивать в пакет готовую сборку по аналогии с https://ru.bem.info/forum/469/
Да, пока нет :(
Есть несколько принципиально разных вариантов. Привожу в субъективном порядке от наименее гибкого, но простого к сложному, но универсальному.
bem-core
иbem-components
. Инфраструктура тестирования сейчас поддерживает возможность добавлять движки.И несколько БЭМ + python реализаций из дикой природы:
@tadatuta, спасибо за развернутый ответ. Заинтересовали варианты 4 и 5.
Да, напишите подробнее по 4 пункту, пожалуйста. Там на django поднимается RESTful API?
@h4 если нужен полноценный бэм — да.
Можно распилить его по страницам, и собирать бандлы для этих страниц. Тогда самой джанге не надо будет это делать.
Вообще, я понимаю, что есть фанаты sprockets или сборщиков в джанге, но этот подход отмирает — это не я так решил, это так жизнь решила. Так что, я бы так сразу не отнекивался от отдельного сборщика, пусть даже на ноде.
Да, все так. Идея следующая:
rowData
). Это может быть как один запрос так и агрегация нескольких запросов по http или через unix-socket. Помимо Django нода может собирать данные из любых других необходимых источников (сторонних API, etc). Соответственно Django ничего не знает про view-часть и служит универсальным источником данных для десктопа, телефонной веб-версии или мобильного приложения.rowData
отдается первому слою преобразования (например, с помощью BEMTREE и на выходе получается BEMJSON — т.е. это по-прежнему данные, но уже знающие про view.Причем потенциально, если речь про админку или SPA, где нет задачи индексации поисковиками, можно унести шаги 3 и 4 на клиент, т.к. оба преобразования работают на JS и могут выполняться непосредственно в браузере.
Подробнее про схему с двухстадийной шаблонизацией см. https://ru.bem.info/technology/bemhtml/v2/templating/
@tadatuta, идею понял.
А насколько быстра такая схема? Тут же и агрегация данных и слои преобразований. Полагаю, что она будет медленнее классического django-сайта.
Да, интересует вариант рендеринга на сервере, чтоб с индексацией не было проблем.
@tadatuta, я вижу уже далеко не первый раз это объяснение и, кажется, уже давал его сам. Вообще, "как использовать все это дело с PHP/python/my_favourite_lang", похоже, популярный запрос, думаю, стоит его раскрыть на bem.info. Я знаю, ни у кого нет времени, но ведь на подобные ответы на форуме оно тоже тратится...
@v-bornov с одной стороны какие-то накладные расходы, конечно, есть, с другой стороны шаблонизация есть всегда, только теперь она выполняется силами другого сервера.
При этом никто не отменяет кэширование (как данных от бекенда, так и отрендеренного HTML), а явное разделение каждого этапа между физически разными серверами — гибко масштабировать именно ту часть, в которую в результате реально упирается сервис.
@apsavin ты прав, конечно. нужно написать.
@apsavin поддерживаю.
Мне понравился вариант от @tadatuta, конечно если его автоматизировать:
@tadatuta, можно услышать подробности о работе python (возможно django) + bem в Яндексе, очень интересно знать о нагрузках. Node.js при нагрузках не хуже Python?
@ValeriySotnikov У нас уже несколько лет общая тенденция к переводу фронтенда шаблонизации на разные варианты JS и node.js в частности. Здесь важно понимать, что бекенд можно оставаться реализован на любой технологии, в том числе Django, а node.js будет обращаться к нему за данными. Поэтому сравнивать нагрузку здесь не совсем честно — разные технологии решают совершенно разные задачи. Но если отвечать без сравнения, то ответ положительный, node.js нагрузку держит.
@tadatuta, почему нельзя сравнить отдачу HTML собираемого node.js'ом и django'й на основе данных полученных через RESTful API?
Наверное можно, если специально этим озадачиться. Но я про такие эксперименты не знаю :( В целом переживать о производительности ноды, думаю, нет смысла — на сегодняшний день ее использует в продакшене множество компаний-гигантов.