Общее состояние и маршрутизация между MFE
Организуйте общую глобальную шину событий или контекст между микрофронтендами и координируйте клиентскую маршрутизацию.
«Общее состояние и маршрутизация между MFE» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Проблема общего состояния
Микрофронтенды в разных пакетах не могут напрямую обмениваться состоянием или контекстом React. Им нужны альтернативные стратегии: пользовательские события, общие хранилища, URL или шина событий pub/sub.
Пользовательские события браузера
Используйте API CustomEvent браузера как простую шину событий между микрофронтендами, не связывая их друг с другом.
// Remote emits:
window.dispatchEvent(new CustomEvent('cart:add', { detail: { productId: '123' } }));
// Host listens:
useEffect(() => {
const handler = (e: CustomEvent) => addToCart(e.detail.productId);
window.addEventListener('cart:add', handler);
return () => window.removeEventListener('cart:add', handler);
}, []);Общая библиотека шины событий
Небольшая библиотека pub/sub, общая для всех (через Module Federation или загружаемый по URL одиночный экземпляр), предоставляет типизированную шину событий, доступную всем MFE.
// Singleton event bus
const bus = {
listeners: new Map<string, Function[]>(),
emit(event: string, data: unknown) {
this.listeners.get(event)?.forEach(fn => fn(data));
},
on(event: string, fn: Function) {
if (!this.listeners.has(event)) this.listeners.set(event, []);
this.listeners.get(event)!.push(fn);
return () => this.off(event, fn);
},
off(event: string, fn: Function) {
const list = this.listeners.get(event) || [];
this.listeners.set(event, list.filter(f => f !== fn));
},
};
export default bus;URL как общее состояние
URL (путь и параметры запроса) естественным образом доступен всем MFE. Используйте его для состояния навигации: выбранного элемента, активной вкладки или значений фильтра.
// Remote reads from URL:
const params = new URLSearchParams(window.location.search);
const productId = params.get('product');
// Remote navigates via history API (or exposes a navigate callback from host):
window.history.pushState({}, '', '/products?product=456');Архитектура маршрутизации
Обычно оболочка или хост-приложение владеет маршрутизатором верхнего уровня. Удалённые микрофронтенды получают текущий путь и обратный вызов navigate в свойствах.
// Host passes routing control to remote:
<RemoteProductsApp
basepath="/products"
navigate={(path) => router.push(path)}
/>
// Remote uses basepath for its internal router:
<BrowserRouter basename={basepath}>
<Routes>...</Routes>
</BrowserRouter>React Router с Module Federation
Каждый MFE может использовать собственный React Router в пределах своего базового пути. Маршрутизатор хоста обрабатывает навигацию верхнего уровня, а каждое удалённое приложение независимо обрабатывает вложенную навигацию.
// Remote App component:
export function ProductsApp({ basepath = '/products' }) {
return (
<BrowserRouter basename={basepath}>
<Routes>
<Route path="/" element={<ProductList />} />
<Route path="/:id" element={<ProductDetail />} />
</Routes>
</BrowserRouter>
);
}Общее состояние аутентификации
Состоянием аутентификации (пользователь, токен) обычно владеет оболочка, передавая его удалённым приложениям в свойствах или предоставляя через общее хранилище-одиночный экземпляр.
// Host provides auth via props:
<RemoteCheckout
userId={currentUser.id}
token={accessToken}
onLogout={handleLogout}
/>Zustand как общее хранилище
При передаче хранилища Zustand через Module Federation как одиночного экземпляра все MFE читают данные из одного экземпляра хранилища в памяти.
// shared/store.ts (exposed as singleton)
import { create } from 'zustand';
export const useCartStore = create(set => ({
items: [],
addItem: (item) => set(state => ({ items: [...state.items, item] })),
}));
// Configured as singleton in MF shared configАнтипаттерны взаимодействия между MFE
Избегайте глубоко вложенных цепочек обратных вызовов, передачи внутреннего состояния компонентов и тесной связи с внутренними API другого MFE. Ограничивайте взаимодействие укрупнёнными событиями и публичными контрактами.
Тестирование взаимодействия между MFE
Тестируйте контракты событий (имена событий и формы данных) отдельно от пользовательского интерфейса. Используйте контрактное тестирование, чтобы проверять согласованность схемы события у производителя и потребителя.
Быстрая проверка
Как проще всего обмениваться состоянием навигации или фильтра между несколькими микрофронтендами, не связывая их друг с другом?
Итоги
Обменивайтесь состоянием между MFE с помощью пользовательских событий, одиночной шины событий, URL или общих хранилищ (Zustand/одиночный экземпляр). Оболочка владеет маршрутизатором верхнего уровня и передаёт удалённым приложениям базовый путь и navigate. Контракты между MFE должны быть укрупнёнными и хорошо типизированными.
Часто задаваемые вопросы
Урок «Общее состояние и маршрутизация между MFE» бесплатный?
Да — полный текст урока «Общее состояние и маршрутизация между MFE» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «Общее состояние и маршрутизация между MFE»?
Организуйте общую глобальную шину событий или контекст между микрофронтендами и координируйте клиентскую маршрутизацию. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Общее состояние и маршрутизация между MFE»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Концепции микрофронтендов и компромиссы
- Module Federation с Webpack 5
- Общее состояние и маршрутизация между MFE
- Независимое развёртывание и конвейеры CI для MFE