Планирую написать сайт на БЭМ и django. Взаимодействие будет реализовано как написал Владимир тут https://ru.bem.info/forum/483/#comment-120414533
- Наружу торчит какой-нибудь балансер (например, nginx).
- За ним стоит node.js сервер, который ходит в джангу за данными (rowData). Это может быть как один запрос так и агрегация нескольких запросов по http или через unix-socket. Помимо Django нода может собирать данные из любых других необходимых источников (сторонних API, etc). Соответственно Django ничего не знает про view-часть и служит универсальным источником данных для десктопа, телефонной веб-версии или мобильного приложения.
- Полученный от Django ответ rowData отдается первому слою преобразования (например, с помощью BEMTREE и на выходе получается BEMJSON — т.е. это по-прежнему данные, но уже знающие про view.
- Далее BEMJSON передается в BEMHTML/BH и на выходе получается HTML.
Но я не хочу переносить какую-либо бизнес логику в nodejs. Nodejs будет лишь принимать запросы и проксировать их в django. Django будет возвращать данные только в JSON. При этом помимо самих данных бэкенд будет предоставлять дополнительные данные для БЭМ стека. Например, имя бандла, который должен принять эти данные и сформировать HTML.
Таким образом, можно будет воспользоваться всеми преимущесвами построения интерфейса на БЭМ, но при этом оставить всю бизнес-логику в django, не дублировать логику (DRY)
На стороне django будут реализованы все необходимые урлы, вьюхи. Вьюхи полагаю будут в основном на django-rest-framework + доп. данные для БЭМ. А вот на стороне nodejs будет простейший proxy сервер на express. Proxy сервер будет принимать запросы от браузера, проксировать их в django и получать в ответ JSON-данные. В этих данных будут дополнительные поля для БЭМ (возможно лучше передавать эти данные в заголовках ответа), например, имя бандла. А далее эти данные передаем в BEMTREE шаблон нужного бандла, получаем bemjson, далее этот bemjson передаем в BEMHTML шаблон и на выходе получаем html-код страницы, которуый передаем в браузер.
Это все в теории, хотелось бы услышать комментарии по данной реализации. Какие подводные камни могут ожидать?
Еще хотелось бы помощи в реализации proxy-сервера на nodejs. Пробовал использовать https://www.npmjs.com/package/http-proxy но так и не понял как его доработать, чтоб возвращать в браузер не json-ответ от django, а подменять его сформированным в БЭМ html. Может у кого есть примеры подобных реализаций? Поделитесь опытом.
Вполне годный подход.
На стороне сервера для превращения данных в HTML потребуется что-то вроде: https://github.com/tadatuta/bem-express/blob/master/server/render.js
По сути, вы просто отрываете рендер джанги и превращаете его в data-provider (что-то вроде API или REST), который возвращает данные для фронтенда (nodejs сервера между nginx и джангой).
Ну и весь рендер джангин вам становится не нужен. Нужен только аналог
JSON.stringify
, чтобы сериализовать данные и отдать во фронтенд.upd: А фронтенд делаете на nodejs с использованием BEMTREE, BEMHTML и всего такого. Там же сами реализуете нужные ручки.
Если использовать REST, то можно что-то такое: http://www.django-rest-framework.org/ и https://github.com/search?l=JavaScript&q=rest+client
Хочу сделать тоже самое, но data provider'ом будет php, сервер примерный накатал (да там и писать особо нечего). Простая мидлвара, которая смотри что пришло, делает запрос на endpoint, получает результат кормит его BEMTREE и выдает пользователю.
Нууу, я бы взял Laravel с каким-то REST модулем и тот же nodejs rest (restler или аналог) пакет ;) не уверен, что это лучшее решение, но ничего лучше в голову пока не приходит).