Скажите, может уже кто реализовывал загрузчик js файлов связанный с Ymodules. Например у меня есть блок ['a'] который зависит от другого блока ['a_m1'] или ['a_m2'].
Но мне не нужно подгрузить только один из этих блоков в зависимости от браузера который используется. А лишнее грузить нельзя из-за ограниченности памяти.
Коротко задача такая: Есть модуль 'a' он уже загружен.
modules.require('a', ['browser'] function(provide, browser) {
provide( modules.require( 'a_m' ( browser.getName() === 'aurora' ? '1' : '2') ) );
});
А вот модификаторы подгружать только по факту использования.
Кто что-либо делал такое?
Есть еще вариант очистить память. Добавить метод удаления блока из хранилища Ymodules.
Ну и все.
p.s. API модулей лоадера и ос помню не точно ;-)
@zxqfox блок loader из bem-core, а что за блок
os
?@ilyar предположу, что это некое абстрактное название. вообще для целей @pavelpower можно использовать блок
ua
изbem-core
в качествеos
.@zxqfox Отлично! Но разве нет машинки типа той, что если нет либы от которой зависит исполнение модуля, автоматом догрузить ее из файла. А после вызвать мой блок на исполнение?
Иначе вижу это только так:
@ilyar @tadatuta вроде видел os, но да, это был ua ;-( https://github.com/bem/bem-core/blob/v2/touch.blocks/ua/ua.js и требует jquery :-1:
@pavelpower Это оно и есть. Из какого файла — укажи в урле. На клиенте нет файлов, только урлы. Мы же про клиент, верно?
@pavelpower Вообще, если у тебя модуль
a
загружен, а модификаторы в завимости от os должны грузиться, то выглядеть это будет как-то так:Но это не будет загружать по запросу модули, оно будет предполагать, что модули
1
и2
уже загружены заранее. Если нужно загружать по запросу — см. вариант сloader
.Заранее загружены — это
modules.define('1', function(provide) { provide({}); });
в собранном.js
upd: если я правильно понял задачу:
А в самих
a_m_v1/v2
:@zxqfox В общем то ты дал исчерпывающий ответ.
Тут возник еще один вопрос: Что если RESOLVE наступает позже вызова modules.require('A');
Как сработает а? Сработает ли?
Для этого modules и написан :-) Если есть define(a), то require(a) сработает после вызова провайда (или сразу, если вызов уже был). есть нюансы с доопределением, сразу не скажу как и что с ним, в какой именно момент зарезолвится модуль. но сам modules — это отдельный npm и там ну очень мало кода. :-) оч полезно в нем тесты посмотреть.
И еще, все таки в
y-modules
нет важнецкой вещи - выгрузки js модулей. Актуально для ограниченных платформ.Т.е. поюзал я модуль "A", с зависимостями "B" и "C", где от "C" еще зависит модуль "D". И хочу избавится от "A" - удалить из переменных, освободить память.
За одно, чтобы удалил и "B" т.к. он больше не используется, а "C" оставил.
Где-то тут есть оверхэд. Но у нас действительно актуальна тема по удалению лишнего из оперативки.
@pavelpower имхо, js не позволяет насильно выгружать из памяти что бы то ни было. У него есть gc и левая пятка браузера. Про дроп модуля целиком (тупо delete из списка загруженных и сброс статуса) можно написать
issue
и @dfilatov тебя спасет ;-) Правда, если подумать раза 2 — то модули кода в 20-50 кб и данные в мегабайты — сложно сказать, что тут надо выгружать, а что — нет.Не, батенька, не теми вы размерами оперируете! Апосля сборки у нас размеры иного характера, да и оперативки тоже кот наплакал.
А выгрузка у JS из памяти происходит в том случае если на кусок памяти нет больше ссылок. Так вот удалять ссылки на переменную - это косвенное действия для очистки памяти.