tgoop.com/super_oleg_dev/204
Create:
Last Update:
Last Update:
Привет!
Небольшой но интересный баг с микрофронтами, вебпаком и loadable.
Ранее я уже писал про интеграцию loadable для создания многостраничных микрофронтов Child Apps с разделением кода - https://www.tgoop.com/super_oleg_dev/183
Вебпак собирает отдельные модуля в чанки, внутри они хранятся в мапе вида:
{
1234: function(...) { исходный код, экспорты/импорты },
5678: function(...) { исходный код, экспорты/импорты },
...
}
Где цифры - уникальные id этих модулей.
Модули из разных чанков после загрузки затем попадают в общую мапу, из которой вебпак будет доставать их при импорте.
Исследуя ошибку, увидел что в экспорте микрофронта получаю объект с переменными из нашего UI-kit.
Сначала грешил на Module Federation, так или иначе все стектрейсы проходят через него.
Но в итоге увидел, что вебпак ID для модуля микрофронта Foo в его чанке такой же, как ID модуля переменных UI-kit, внимание, в чанке другого микрофронта Bar.
Bar загружается раньше, его модуль попадает в общую мапу, и далее при импорте Foo, по указанному ID мы получаем эти переменные вместо микрофронта.
Проблема конечно же в глобальной мапе, в нашем случае это переменная:
window.__LOADABLE_LOADED_CHUNKS__
В которую попадает тысячи модулей.
А учитывая независимые сборки микрофронтов, попасть на такую коллизию было просто делом времени.
Оказывается, вебпак плагин Loadable переопределяет эту переменную для сборки.
Хорошо что есть из коробки возможность переопределить эту переменную, сделал уникальной для каждого микрофронта:
{
chunkLoadingGlobal: `__LOADABLE_LOADED_CHUNKS__child_${name}_${version}__`
}
Проверил разные кейсы, шаринг через Module Federation не пострадал, ошибка ушла.
Потом собрал без Loadable плагина, увидел что создается уникальное название, для моего чанка -
webpackChunkchild_app_state_0_3_18
, что можно увидеть и в дефолтах вебпака.То есть проблема появилась только при интеграции нового функционала.
Пример такой проблемы, о которой даже знать и думать не будешь, пока не столкнешься.
И тот случай где ну очень удобно делать отладку через Chrome Overrides, без необходимости публиковать обновленный код пачки микрофронтов.
BY SuperOleg dev notes
Share with your friend now:
tgoop.com/super_oleg_dev/204