По запросу в поисковик "i-bem__dom_init_auto" я нашел кучу незавершенных тем. Решился написать на форум, увидев, что подобным интересуюсь не только я. Думаю, понятно о чем пойдет речь. Стоит сразу 2 задачи: вынести ym, jquery, i-bem и т.д в отдельный файл, и заводить не по domReady. Хотелось бы решить максимально не велосипедя.
Прямо в документации сказано:
noDeps (массив/объект) — можно отменить какую-то зависимость (например, i-bem__dom_init_auto).
Хотя, как я понимаю, принято категорически избегать noDeps. Видимо, по тем же причинам что и !important
в css. Так или иначе, не могу его исплючить из финального deps, он все равно приезжает. Ну и если кто-то найдет этот пост, дабы уж не разметать все по кускам, напишу тут, что, по-идеи, достаточно собрать бандл с ym и блоком 'page'
. А уж потом можно вторым файлом бандл со своими блоками лепить. Но! Тут то и встает у меня основная проблема.
Представим,что у нас такая картина:
//ym, i-bem и вот это все.
<script src="/assets/bootstrap/bootstrap.js" type="text/javascript"></script>
//В этом бандле один единственный блок
<script src="/bundles/index/index.js" type="text/javascript"></script>
Не работает. И нет ошибки в консоли.
i-bem__dom_init_auto
находится в конце файла bootstrap.js - не работает.
Подрубаю к моему к моему index.js
в сборку i-bem
. Теперь мой блок находится в одном файле с i-bem__dom_init_auto
, и все еще ниже него. Результат: теперь работает. Я бы и не против замешивать "стартер" с ручным вызовом в каждый свой бандл, кода то там совсем чуть-чуть. Но как тогда исключить его из сборки bootstrap.js
?
Такая же проблема будет если просто взять https://yastatic.net/bem-components/latest/touch-pad/bem-components.js
.Но там мои блоки хотя бы через раз работают. Да, именно так. Просто сижу и тыкаю ctrl + r, иногда код не отрабатывает. (Могу даже дать ссылку боевого сайта, где такая проблема) Успел твой файл скачаться до инициации? Ну и ладненько, радуйся.
Казалось бы, логичный кейс. Зачем мне заворачивать все в один бандл, если страниц на сайте много? Я ведь не ландинг делаю, пущай в кэш браузера запомнит основу. Давайте наконец-то разберемся.
@fortael Начну с конца :)
В ридми к dist-поставке
bem-core
есть припискаВ случае с использованием bem-component с CDN это означает, что нужно подключать бандл без автоинициализации (
https://yastatic.net/bem-components/latest/touch-pad/bem-components.no-autoinit.js
) и дергать инициализацию вручную после того, как добавлен проектный код на i-bem.Вот фидл, который будет работать каждый раз, а не через раз: https://jsfiddle.net/tadatuta/p3o8p324/
Теперь по поводу того, как собрать свое такое же. Проблема с
noDeps
в том, что это отменяет только свою зависимость. Т.е. если на уровне библиотеки у блокаb1
есть зависимость от блокаb2
, то можно на уровне проекта положитьb1.deps.js
и там отменить зависимость отb2
с помощьюnoDeps
. Но если, как в случае с bem-core, зависимость дублируется во множестве блоков, придется иnoDeps
написать многократно.Конечно, это плохой путь.
Более прямое решение можно подсмотреть в сборке того самого dist-а: https://github.com/bem/bem-core/blob/v3/.enb/tasks/dist.js#L47-L56
Там происходит буквально следующее: в build-time создается декларация, состоящая только из
i-bem__dom_init_auto
, а затем из уже разрезолвленных зависимостей основного бандла вычивается эта декларация. Дальнейшая сборка происходит с результатом этого вычитания.Надеюсь, ответил на все вопросы.
@tadatuta, спасибо. :ь Тоже сперва поглядывал на метод
subtractDeps
, но от чего-то воспринимал его как костыль. Из примера увидел, что это вполне себе отличное решение. Все работает замечательно. Более того, это сразу решает проблему отсечения лишнего из index.js на основе bootstrap.js