0Pricing
React Academy · Урок

Общее состояние и маршрутизация между 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 — локальная установка не требуется.

Все уроки этого курса

  1. Концепции микрофронтендов и компромиссы
  2. Module Federation с Webpack 5
  3. Общее состояние и маршрутизация между MFE
  4. Независимое развёртывание и конвейеры CI для MFE
← Назад к React Academy