Как реализовать динамическую подгрузку микрофронтов через админку?
Что проверяют
Понимаете ли вы, как оболочка приложения узнаёт о модулях во время работы, а не при сборке, и что происходит, когда удалённый модуль недоступен или несовместим. Уточнение обычно про общие зависимости и откат плохой версии.
Как отвечать
Опишите три части: реестр, загрузчик и изоляцию.
- реестр в админке: для каждого микрофронта хранятся имя, URL точки входа, версия, экспортируемый модуль, маршрут или слот и флаг включения. Бэкенд отдаёт оболочке манифест JSON, лучше с коротким кэшем;
- загрузка через Module Federation: в webpack 5 удалённые модули по умолчанию прописаны в конфиге сборки. Для списка из админки нужна рантайм-регистрация: в Module Federation 2.0 это пакет
@module-federation/enhancedсregisterRemotesиloadRemote, он работает и с Rspack; - без Module Federation: нативные ES-модули через
import()по URL или import maps. Webpack при этом попытается забандлить импорт, нужен комментарий/* webpackIgnore: true */, в Vite/* @vite-ignore */; - общие зависимости: React и роутер объявляются в
sharedсsingleton: trueиrequiredVersion, иначе на странице окажутся две копии React; - версии и откат: каждая версия выкладывается по неизменяемому URL, админка лишь переключает указатель. Откат занимает секунды и не требует пересборки;
- устойчивость: каждый удалённый модуль обёрнут в error boundary и
Suspenseс таймаутом и заглушкой. Падение одного виджета не должно ронять оболочку; - безопасность: подгружаемый код исполняется с правами вашего домена. URL принимается только из белого списка доменов,
script-srcв CSP ограничен ими же, а менять реестр может узкая роль с журналом изменений.
Сервис-воркер для кэша здесь не обязателен: точке входа достаточно короткого кэша, а чанкам с хэшем в имени долгого.
Где спотыкаются
Не настраивают singleton для React и получают «Invalid hook call» только в продакшене, когда версии у команд разъехались.
Кэшируют remoteEntry.js надолго. Админка переключила версию, а у пользователей ещё сутки старый код.
Разрешают вписать в админке любой URL. Это готовая точка для внедрения чужого скрипта, и защищать её надо так же строго, как деплой.