Как реализовать взаимодействие между компонентами микрофронтов при изменении состояния?
Что проверяют
Понимаете ли вы, что микрофронтенды затевают ради независимого деплоя, и поэтому связь между ними должна быть слабой. Следом обычно спрашивают, как менять формат события, не ломая соседей, и что делать, если получатель загрузился позже, чем событие было отправлено.
Как отвечать
Перечисляйте способы от самого слабого связывания к самому сильному:
- URL: состояние, которое должно переживать перезагрузку и передаваться ссылкой (фильтры, выбранный товар, вкладка), кладите в адрес. Каждый микрофронт читает его сам;
- события браузера:
CustomEventнаwindowс данными вdetail, подписка черезaddEventListener. Нативно, без общей библиотеки. Для синхронизации между вкладками естьBroadcastChannel; - данные от шелла: хост-приложение передаёт значения при монтировании. В single-spa это
customProps, в Module Federation пропсы экспортируемого компонента, у Web Components атрибуты и свойства; - общий стор: маленький pub/sub, который отдаёт шелл, или модуль, расшаренный в Module Federation с
singleton: true. Работает, но связывает версии команд; - сервер как источник правды: корзину или профиль микрофронт перезапрашивает с бэкенда, получив событие-сигнал.
Отдельно проговорите контракт: имя события с пространством имён (cart:item-added), описанный тип данных, версия. Типы удобно держать в отдельном пакете и менять только с обратной совместимостью. Для позднего подписчика шина хранит последнее значение, либо получатель при монтировании сам запрашивает текущее состояние.
Где спотыкаются
Предлагают один Redux-стор на все микрофронты. Команды снова зависят друг от друга: изменение формы state у одной ломает соседей, и деплоиться по отдельности уже нельзя.
Тащат EventEmitter из Node, будто это браузерный API, хотя в браузере есть EventTarget и CustomEvent. И забывают отписаться при размонтировании: обработчики копятся, и одно событие срабатывает несколько раз.
Не описывают контракт вовсе. Переименованное поле в данных события ломает потребителя в проде, а сборка ничего не замечает, потому что каждый микрофронт собирается отдельно.