Создал проект веб-страницы (результат).
Внутри использую свой слайдер, который находится в библиотеке, подключаемой через 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.И когда сборка запускается, ей нужно построить граф сборки, посмотреть в явные таргеты (целевые файлы), и запустить технологии с низов, спродуцировав в папку бандла еще кучу разных файлов, которые нужны неявно.