0Pricing
React Academy · Урок

Общий доступ к состоянию и маршрутизации между удалёнными приложениями

Используйте один экземпляр React Router и хранилище Zustand в независимо развёртываемых микрофронтендах.

«Общий доступ к состоянию и маршрутизации между удалёнными приложениями» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Проблема совместного использования состояния

Каждое удалённое приложение Module Federation собирается и развёртывается независимо. Его состояние (React useState, контекст и хранилища Zustand) находится в собственной области видимости модуля JavaScript. Хост и удалённые приложения не используют состояние автоматически — архитектуру совместного использования необходимо продумать явно.

Вариант 1: URL как общее состояние

Простейший механизм совместного использования состояния — URL: любое удалённое приложение может читать параметры URL, строки запроса и значения хеша без обмена данными с другими удалёнными приложениями. Это хорошо подходит для состояния основной навигации, значений фильтров и любых данных, которые должны сохраняться в закладках и передаваться через ссылку.

Вариант 2: CustomEvents для слабой связанности

CustomEvents через браузерный EventTarget позволяют удалённым приложениям обмениваться данными без прямого импорта. Одно удалённое приложение вызывает window.dispatchEvent(new CustomEvent('cart:updated', { detail: cart })), а любой другой модуль (хост или другое удалённое приложение) подписывается с помощью window.addEventListener('cart:updated', handler). Общий модуль не нужен.

Вариант 3: общее удалённое приложение состояния

Создайте отдельное «удалённое приложение состояния», которое предоставляет хранилище Zustand или Jotai. Хост и другие удалённые приложения импортируют данные из этого удалённого приложения состояния и получают один и тот же экземпляр хранилища, поскольку он является общим синглтоном. Это удобно для сложного общего состояния (аутентификация, корзина, пользовательские настройки), но добавляет зависимость от развёртывания.

Вариант 4: хост владеет состоянием и передаёт функции обратного вызова

Оболочка (хост) владеет всем общим состоянием и передаёт его удалённым приложениям в виде свойств или через контекст. Удалённые приложения получают такие функции обратного вызова, как onCartUpdate, и выполняют навигацию через свойства. Это сохраняет состояние централизованным в хосте, но требует, чтобы хост знал API удалённых приложений, создавая тесную связанность.

React Router в Module Federation

Состояние истории и текущего адреса React Router предоставляется компонентом маршрутизатора (BrowserRouter или createBrowserRouter). В конфигурации Module Federation должен быть ровно один маршрутизатор — размещение его в каждом удалённом приложении создаст несколько конкурирующих контекстов маршрутизации и приведёт к конфликтам навигации.

Хост владеет маршрутизатором

Архитектурное правило таково: хост (оболочка) предоставляет маршрутизатор. Удалённые приложения получают свойства маршрутизации от хоста или напрямую читают URL. Удалённое приложение никогда не должно создавать собственный BrowserRouter: он будет конфликтовать с маршрутизатором хоста и нарушит навигацию во всём приложении.

Общий контекст для удалённых приложений

Значения контекста React связаны с конкретным экземпляром React и объектом контекста. Чтобы контекст работал между хостом и удалённым приложением, оба должны импортировать один и тот же объект контекста из одного источника — обычно из общего удалённого приложения состояния или общего пакета утилит. Синглтон React гарантирует, что один и тот же контекст будет работать во всех удалённых приложениях.

Архитектурный шаблон оболочки

В хорошо организованной архитектуре Module Federation оболочка (хост) отвечает за HTML-оболочку, провайдер маршрутизатора, контекст аутентификации, провайдер темы и токенов дизайна, а также глобальную навигацию. Удалённые приложения отвечают за содержимое своих функциональных областей. Оболочка объединяет удалённые приложения в макет, не зная деталей их реализации.

Как избежать тесной связанности

Самый серьёзный антипаттерн Module Federation — тесная связанность хоста и удалённого приложения: хост импортирует типы из удалённого приложения, удалённое приложение импортирует компоненты из хоста или они используют общий пакет npm, который обоим приходится обновлять одновременно. Такая связанность сводит на нет преимущество независимого развёртывания.

Контракты взаимодействия

Определите явные контракты между хостом и удалёнными приложениями: свойства, которые принимает компонент удалённого приложения, события CustomEvents, которые он вызывает, и параметры URL, которые он читает. Документируйте эти контракты как интерфейсы TypeScript в общем пакете типов. Это позволяет командам развиваться независимо в рамках согласованного контракта.

Размещение React Router в Module Federation

Где следует размещать провайдер React Router (BrowserRouter) в архитектуре Module Federation?

Итоги урока

Для совместного использования состояния между удалёнными приложениями Module Federation можно применять состояние в URL (самый простой вариант), CustomEvents (слабая связанность), общее удалённое приложение состояния (централизованное хранилище) или состояние, которым владеет хост и которое передаётся через свойства. Хост должен владеть единственным провайдером маршрутизатора — удалённые приложения никогда не должны создавать собственные. Чёткие контракты взаимодействия через интерфейсы TypeScript сохраняют независимость команд и обеспечивают действительно независимое развёртывание.

Часто задаваемые вопросы

Урок «Общий доступ к состоянию и маршрутизации между удалёнными приложениями» бесплатный?

Да — полный текст урока «Общий доступ к состоянию и маршрутизации между удалёнными приложениями» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «Общий доступ к состоянию и маршрутизации между удалёнными приложениями»?

Используйте один экземпляр React Router и хранилище Zustand в независимо развёртываемых микрофронтендах. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Общий доступ к состоянию и маршрутизации между удалёнными приложениями»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

  1. Федерация модулей: динамический импорт во время выполнения
  2. Настройка приложений React: основного и удалённых
  3. Общий доступ к состоянию и маршрутизации между удалёнными приложениями
  4. Версионирование, развёртывание и оркестрация
← Назад к React Academy