Микрофронтенды: общение между приложениями

Как организовать общение между микрофронтами?

Микрофронты обычно живут в разных бандлах (иногда разных командах/репозиториях) и монтируются в один shell (layout). Обмен данными зависит от того, same-origin они или нет.

ПодходКогда использоватьКомментарий
window.postMessageРазные origin, iframe / web component из другого доменаЯвная проверка origin; контракт сообщений (версионирование схемы)
CustomEvent на window / DOMShell и микрофронты на одном origin, UMD / script-тегПростой event-bus без зависимостей
Общий event-bus (модуль)Monorepo, shared npm-пакетТипизированная шина подписок
Поднять состояние в shellНужны общие user, theme, permissionsShell передаёт пропсы / контекст в дочерние приложения (если единый React/Vue runtime — осторожно с версиями)
BroadcastChannel / localStorage eventsСинхронизация между вкладками или изолированными контекстами одного сайтаНе замена внутреннему state сложного UI
BFF / APIИсточник правды на сервереМикрофронты не обязаны знать друг о друге — только о домене данных
Module Federation (Webpack) / import remoteДинамическая загрузка remote с экспортом модулейОбщие зависимости и контракты версий нужно согласовывать

Практические рекомендации:

  1. Минимизировать жёсткие связи — договориться о событиях/полях payload, а не о внутренних сторах друг друга.
  2. Для iframe-микрофронтов — почти всегда только postMessage + политики безопасности (sandbox, CSP).
  3. Авторизация: токены обычно в shell или cookie; микрофронт получает только то, что shell передаёт или что доступно через API.
  4. Избегать двух копий React в одном DOM без изоляции — конфликты хуков и контекста; MF настраивают shared singleton.

Кратко для собеса: на одном origin — shared bus / события / контекст shell; на разных — postMessage; общие данные часто тянут через API или глобальный layout, а не через прямое чтение чужого state.