Мне очень нравится идея deps.js
т.к. позволяет описывать зависимости не большой простыней, а только там где они нужны.
Да и сборку приложения можно организовать достаточно тонко.
Например создать бандл который собирает только js
технологию. И при необходимости js можно подключать отдельно на нужную страницу в нужное время.
Существуют даже методы работы с файлами зависимостей, такие как merge
BEM.decl.merge(), subtract
BEM.decl.subtract()
Но вот опишу задачку. Есть у меня подгружаемые части для SPA. CSS генерится для них и подключаться в сборку главной страницы. HTML же создается шаблонизатором внутри JS файла.
И все эти части собираются отдельно в разные JS файлы, для возможности подгрузки их в нужный момент.
При этом, блоки этих частей используют одни и те же JS блоки на 80%.
Соответственно есть идея вынести эти общие блоки так же как и CSS в сборку общего бандла.
И тут не хватает одной команды, которая выдаст общие блоки между несколькими файлами deps.js
@pavelpower Такая команда есть, называется intersect. Кстати, всеми этими командами можно пользоваться и просто через CLI:
bem decl intersect -h
Не ясно как она работает
могу я ей скормить 100500 файлов?
Можешь. Она намекает на это фразой «can be used many times» ;)
@tadatuta а как ее через API вызвать?
@pavelpower полностью аналогично остальным методам для работы с депсами (и вообще любым COA-командам):
@tadatuta соответственно для обратной операции - удалить из deps общие файлы require('bem').api.decl.subtract({ output: 'path/to/file/with/result.js', declaration: ['path/to/first.deps.js', 'path/to/second.deps.js'] }); ?
Спасибо @tadatuta за intersect. Жаль документации скудна на эту тему.
Кстати не могу понять данные операции не используют
require
ноды?А то, у меня сразу несколько операций подряд происходит
@pavelpower предполагается, что встроенной консольной справки, раздела https://ru.bem.info/tools/bem/bem-tools/api/ и общего описания, как работать с COA-командами через JS API должно быть достаточно, чтобы разобраться.
Последний вопрос про
require
я не понял. Но в принципе рекомендую взглянуть на сорцы — там по 40 строк кода на команду.над командой
intersect
надо поработать в том смысле, что мне нужно выполнить вынос общих блоков в случае если попадется хотя бы в двух файлах из всех. а, командаintersect
общие среди всех.т.е. тут придется писать еще обвязку.
@pavelpower да, с
depsByTech
проблема :(но если уж ты в любом случае пишешь свою обвязку и заранее понятно, что у тебя может быть только js -> bemhtml зависимость, то вызывай
intersect
для соответствующих полей вручную.BTW, скорее всего тебе удобнее будет работать напрямую с классом Deps:
@tadatuta, может быть, подскажешь, как мне смерджить два файла deps.js, так, чтобы из первого
depsByTechs
сохранился в полном объеме?А то, после мерджа, он пропадает напрочь.
*В общем задачу решил так, сделал diff deps.js каждого deps.js с каждым кроме себя, а после смержил получившейся файл.
Но вот не разобрал как таки сохранять
depsByTechs
после мерджа@pavelpower так я же примерно описал в своем предыдущем комментарии. Тебе фактически нужно мержить require('./desktop.bundles/bundle1/bundle1.deps.js').depsByTechs.js.bemhtml с require('./desktop.bundles/bundle2/bundle2.deps.js').depsByTechs.js.bemhtml, остальные поля де-факто тебе не нужны.