Создал проект веб-страницы (результат).
Внутри использую свой слайдер, который находится в библиотеке, подключаемой через bower (https://github.com/Oopscurity/oopsy). измененный make.js
При сборке и запуске страницы в консоли браузера получаю следующее сообщение:
Uncaught Error: Module "image": can't resolve dependence "lightbox"
На странице как image
с js: true
, так и lightbox
не используются. Помогает (и это понятно) комментирование image.js
в коде установленной библиотеки.
Демо: работа слайдера, лайтбокса. Все собирается и работает без нареканий.
Помогите, пожалуйста, разобраться, в чем проблема.
Привет!
Проблема в том, что сборка не учитывает зависимости по технологиям, кроме bemhtml (https://github.com/Oopscurity/oopscurity.github.io/blob/master/.enb/make.js#L67-L85), а в библиотеке
oopsy
активно используется зависимость по технологииjs
.Пути решения два:
js
полностью аналогично тому, как сделано для клиентского bemhtml.js
в пользу универсальных зависимостей по блокам. В данном конкретном случае достаточно, чтобы вoopsy/common.blocks/image/image.deps.js
оказалось({ shouldDeps: 'lightbox' })
вместо того, что там написано сейчас.PS: Пока искал причину, заметил момент, который стоит поправить: В
common.blocks/preloader/preloader.js
нет смысла в обработчикеjs inited
ждатьdomReady
, он к тому времени гарантированно наступил. Вместо этого стоит добавить прелоадеру модификаторvisible
и ему прямо в стилях прописатьdisplay: block
, тогда можно будет изначально делать его видимым, а в нужный момент делатьdelMod('visible')
и в обработчике с анимацией прятать.Ну и в целом любое изменение состояния блоков удобно реализовывать через модификаторы, а не просто методы. Помимо консистентности и возможности для каждого состояния добавлять нужные стили, появится возможность подписываться на события изменения этих модификаторов из других блоков.
Доброго вечера! Большое спасибо за ответ.
Порылся в документации и
make.js
в bem-components. Попробовал изменитьmake.js
проекта, добавив в него строки примерно следующего содержания:Никакого результата не добился. Подскажите, пожалуйста, где можно почитать об этом и найти пример правильной настройки сборщика на случай, если это окажется необходимым.
Второй путь оказался значительно легче первого. Всего одна строчка и (без потери js-зависимости!) все встало, как нужно!
Спасибо за совет насчет
preloader
! Еще один вопрос: каким образом можно вызвать деструктор блока? Если я понимаю верно,BEMDOM.destruct()
применим только к элементам. (Во всяком случае, удалить с его помощью блок не удалось, даже если устанавливатьexcludeSelf
вtrue
) Точно также не удается удалить у блока модификаторjs
Решение с депсами выглядит так:
На русский это переводится приблизительно так:
bemdecl
с названием?.js-js.bemdecl.js
для технологииjs
.?.bemdecl.js
(генерируется выше с помощьюbemjsonToBemdecl
) с?.js-js.bemdecl.js
и запиши результат в?.js.bemdecl.js
.?.js.bemdecl.js
раскрой зависимости с учетом deps.js-файлов и запиши в?.js.deps.js
.?.js.files
.Общий совет — не нужно использовать
mustDeps
там, где можно обойтисьshouldDeps
.Это на самом деле абсолютное большинство случаев. В частности, если речь о JS-зависимостях с использованием модульной системы, то она сама подождет, пока проинициализируются все нужные модули, так что порядок сборки не важен.
BEMDOM.destruct()
удаляет БЭМ-блоки на переданных DOM-узлах, ноexcludeSelf
как раз должен оставаться вfalse
. Если этого не происходит, скорее всего, что-то не так с вызовом.@Oopscurity Если коротко про ENB, то каждая технология в ENB (те, что в addTech) порождает какие-то файлы в бандле. На вход она может использовать результат работы других технологий, либо файлы технологий (js, css) из блоков. Кроме того, у многих технологий по умолчанию
target
иsource
опущены, так как общеприняты, но они есть и их можно переопределить (кроме, разве что, таких технологий, какfile-provider
— там нет смысла в значении по умолчанию).Чтобы что-то начало собираться — нужно потянуть за какую-то вершину графа, это делается через
addTargets
, это явно ожидаемые целевые файлы в бандле (они же могут использоваться для других целевых файлов).В итоге получается направленный граф, который можно посмотреть, запустив с флагом
--graph
, или на главной страницеenb server
.И когда сборка запускается, ей нужно построить граф сборки, посмотреть в явные таргеты (целевые файлы), и запустить технологии с низов, спродуцировав в папку бандла еще кучу разных файлов, которые нужны неявно.