Всем привет. Есть ли возможность указать ym что модуль находится во внешнем файле, так чтобы тот его загрузил?
https://github.com/bem/bem-core/blob/v2/common.blocks/jquery/jquery.js — так? Или что ты имеешь ввиду? ;)
Сам по себе
ym
загружать файлы не умеет, но вbem-core
для этого есть loader.Ой, он теперь еще и бандлы загружает... :+1: ничоси
@zxqfox Да. В общем я выпилил из
_index.js
bh шаблоны в файлindex.bh.js
. Теперь из надо адекватно подключить.Кстати, о loader. Можно где то посмотреть реальный пример использования
loader_type_bundle
? штука интересная, но куда применить не знаюВ отличие от jquery, где модуль собранный в один файл со всем остальным подгружает библиотеку, а затем провайдит ее, я пытаюсь загрузить сам модуль.
Товарищи разработчики, подскажите что нибудь, пожалуйста.
@kompolom пример с
loader_type_bundle
когда-нибудь доберемся добавить в документацию, а по сути основного вопроса, будет выглядеть примерно так (не тестировал):@tadatuta Получается, это придется писать во всех блоках использующих bh?
@kompolom Ну смотри. В _index.js тебе нужен какой-то код, который знает как загрузить свой файл с шаблонами. При чем, для каждого бандла нам нужен такой код, который будет загружать свой файл с шаблонами.
Почему не добавить в _index.js код типа:
И дальше останется только загрузить его:
Надо будет только придумать, как добавить в _index.js этот кусок кода с правильным путем до бандла.
Устроит?
@zxqfox Да, это уже интересней, я пробовал так сделать. В таком варианте bh провайдит
undefined
А файло с bh.js что экспротирует? Попробуй руками в
<script>
его прописать и поймать то, что оно экспортировало. И руками Loader запустить:modules.require('loader_type_js', function(Loader) { window.__Loader = Loader; или debugger; });
@zxqfox файл с bh.js экспортирует
bh
иbemhtml
https://github.com/bem/bem-core/blob/9fc75476e99c701a403e7be96b22922a4fb97deb/common.blocks/loader/_type/loader_type_js.js#L15
Надо так, потому что в success не передается ничего:
Так работает. Но если делать modules.require('BEMHTML',.... то уже не работает. Похоже ym зацикливается. А хотелось бы конечно максимально прозрачно... Например, чтобы модуль сам себя загружал и провайдил.
Толи лыжи не едут, толи... А зачем modules.require внутри provide внутри modules.define? ;-) Потому что в bh.js modules.define ?
Ну там внутри можно магию какую-то сделать на modules.isDefined и setTimeout'ах, кажется, что должно хватит ;-. Либо через вспомогательный модуль, да. Каким является BEMHTML сейчас.
upd: Но лучше на уровне сборки это поправить ;-)
@zxqfox внутри чего магию делать? Блока который грузим?
@kompolom заглушки этой, которая грузИТ.
Сейчас там:
Имена разные, двойное проникновение. Это уже магия своего рода ;-)
@zxqfox Хочется вообще прозрачно сделать, как с jquery, без магии. но оно ж не робит.
Для этого надо, чтобы bh глобально торчал при загрузке, как торчит jquery. А для этого, в свою очередь, сборку бх.жс надо поправить.
Ок. с bh можем настроить сборку. Но Вопрос несколько шире - грузить любой модуль по url
Наверно тут уже в самом ym что то мудрить
modules.define = кастомная? Можно обертку над loader
@kompolom
а откуда вообще такое желание?
jQuery
мы так грузим с CDN, т.к. он на портале Яндекса по этим же урлам отдается и со значительной долей вероятности уже закеширован у пользователя в браузере. если же так делать с каждый модулем, то накладные расходы на загрузку будет очень высокими.@tadatuta Желание грузить то что пользователю может не понадобиться не сразу, а по мере необходимости.
Тогда это все-таки не все, а какие-то очень ограниченные куски и для них не должно быть проблемы написать кастомный код.