Всем привет.
Я один из немногих, кажется, кто сейчас использует возможность посылать запросы из bemtree. Одна из причин, по которой я так делаю - полная независимость блоков, то есть блок сам знает, какие данные ему нужны. Однако асинхронный bemtree мне неудобен. Я какое-то время назад собирался написать об этом bem-team, с предложением создать синхронный аналог, но оказалось, что работа над таким аналогом уже идёт и, в принципе, на него уже можно переходить. Останавливает меня от перехода только всё то же желание хранить информацию о том, как получать данные для блока, в папке блока.
Эта была проблема. Теперь о том, каким я вижу решение. Мне кажется, можно хранить информацию о получении данных в файлах отдельной технологии, скажем, block.data.js
. Тут всё просто и понятно. Сложность в том, что хотелось бы, чтобы при сборке к каждому такому блоку прибавлялась информация о содержимом файлов этой технологии тех блоков, от которых он зависит - для того, чтобы было легко сформировать один запрос за всеми данными, нужными для отрисовки блока.
Зачем я пишу здесь:
- Чтобы получить советы по реализации такой технологии. У меня есть опыт написания технологий для enb, но обычно они проще.
- Чтобы услышать мнения о подходе в целом. Есть ли какие-то проблемы, которые я не вижу?
Можно декларировать необходимые блокам данные с помощью https://www.npmjs.com/package/bla Зависимости в данном случае будут работать совершенно аналогично зависимостям для других технологий.
Вопрос лишь в том, что где-то нужно будет сделать запрос и дождаться ответа до того, как отдать данные в шаблоны.
Наверное, я не очень понятно написал. Проблема не с форматом декларирования необходимых данных. И то, что запрос надо будет делать - это понятно.
Допустим, есть блок blockА, он зависит от данных dataA и блока blockB, который зависит от блока blockC, который зависит от данных dataC.
Я хочу после сборки получить
При этом я не хочу дублировать зависимости из deps-файлов, как мы это делаем для js в ym modules.
Если речь про выпаршивание зависимостей из деклараций про данные с помощью ENB, то в качестве источника вдохновения можно посмотреть на https://github.com/enb/enb-modules#deps-with-modules
Речь, скорее, про обратную задачу - про выпаршивание зависимостей из deps.js. То есть я хочу по deps-файлам получить для каждого блока содержимое файлов data.js всех блоков, от которых он зависит.
Спасибо за ссылку, посмотрю.
То ли я все еще не понимаю задачу, то ли именно так депсы и работают из коробки (с точностью до зависимостей по технологиям).
Наверное, что-то у меня сегодня с формулировкой мыслей. Депсы работают так: Исходное дерево:
результирующий файл:
dataC dataA
Мне же нужно:
dataC dataC, dataA
То есть мне как бы для каждого блока, получается, надо собрать зависимости - а потом уже объединять. Хочется сделать это эффективным образом.
ты точно правильно написал в «нужно»? если да, то давай какой-то менее абстрактный пример, потому что я все равно не догоняю почему депсы из коробки не решают твою задачу.
Хорошо. Вдруг правда решают.)
blockA.data.js:
blockC.data.js:
результат сборки, index.data.js:
альтернативный результат сборки, index.data.js:
Я ещё не знаю, как точно буду делать, но из этих двух примеров должно быть понятно, какие данные мне нужны.
@blond, может быть, ты сможешь что-нибудь посоветовать?
Я, кажется, понял, что ты хочешь :)
Нужно, чтобы модуль сборки глядя на депсы, генерировал контент собранного бандла?
Да, можно так сказать. Но если бы я написал "Нужно, чтобы модуль сборки глядя на депсы, генерировал контент собранного бандла." ты бы тоже вполне мог сказать что так всё и работает из коробки) Мне кажется, примеры выше достаточно конкретные, сложно словами сказать понятнее, чем показав этот код.
Кажется, в текущем мире чтобы этого добиться, нужно сгенирировать по бандлу на каждый блок (декл из одного блока), собрать по ним зависимости (deps-файл для каждого блока) и с полученными зависимостями собирать
data.js
. Наверняка это даже сработает, но будет адово медленно.В будущем мире с новыми депсами это должно быть очень просто (предполагается, что у полного графа зависимостей можно будет попросить зависимости для любого произвольного узла в любую сторону), но сроков его наступления, похоже, даже Блонд не назовет. Следить за прогрессом можно в https://github.com/bem-sdk/bem-deps
Но я могу и ошибаться и, быть может, есть какой-то более быстрый способ и в текущих реалиях.
Как минимум, не должно быть сложно уже сейчас собрать файлы deps.js и засунуть их в bem-deps, получить граф, пройдя по которому сгенерировать новый файл для собираемого бандла с нужным контентом.
Здесь всё про резолв: https://github.com/bem-sdk/bem-deps/tree/wip/lib/resolve
Еще можно посмотреть суда, если не смотрел: https://github.com/enb/enb-bem-techs/blob/master/techs/deps.js — как читать в enb файлы
@zxqfox, спасибо за совет!
Правда, придётся по графу проходить для каждого блока, но это, по крайней мере, похоже на путь, который может привести к решению. А есть возможность где-то посмотреть примеры работы с графом? Я так понимаю, есть какой-то инструмент для этого?
Вот по ссылке в resolve как раз строится граф и производится обход. И там на итераторах.