Stan współdzielony między mikrofrontendami
Sklep składa się z 4 mikrofrontendów ładowanych przez Module Federation: nagłówek z koszykiem, katalog, karta produktu i checkout. Każdy ma swój zespół i swoje wydania. Koszyk w nagłówku nie aktualizuje się po dodaniu produktu w katalogu, a jeden zespół proponuje wspólny store Reduxa dla wszystkich.
Zanim rozwiniesz: powiedz na głos, jak byś to rozwiązał, i nazwij co najmniej jeden kompromis.
Moje rozwiązanie
Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.
Pokaż, czego szuka rekruter, i modelową odpowiedź
Co sprawdza rekruter
- Czy rozumiesz koszt sprzężenia między niezależnie wdrażanymi aplikacjami
- Czy znasz sposoby komunikacji: zdarzenia, kontrakt, źródło prawdy na serwerze
- Czy myślisz o wersjonowaniu kontraktu
Odpowiedź seniora
Wspólny store to wspólne wdrażanie w przebraniu: zmiana kształtu stanu w jednym zespole psuje pozostałe, a singletony Reduxa w Module Federation łatwo zdublować. Źródłem prawdy dla koszyka jest serwer, a mikrofrontendy komunikują się zdarzeniami.
Katalog po dodaniu produktu wysyła żądanie do API koszyka, a po sukcesie emituje zdarzenie cart:updated (CustomEvent na window albo mały event bus z typami w paczce kontraktów). Nagłówek nasłuchuje i odświeża swój stan, np. invalidateQueries w TanStack Query. Każdy mikrofrontend ma własny, prywatny stan i własną kopię danych z API.
Kontrakt zdarzeń jest w osobnej, wersjonowanej paczce z typami TypeScript i schematem, a zmiana łamiąca oznacza nowe zdarzenie (cart:updated.v2) i okres przejściowy. Dla danych naprawdę globalnych i rzadko zmiennych (zalogowany użytkownik, język) host przekazuje je przez propsy przy montowaniu.
Typowe wpadki
- Jeden globalny store dla niezależnie wdrażanych aplikacji
- Komunikacja przez wzajemne importy modułów
- Brak wersjonowania kontraktu zdarzeń
Dopytają o
- Co jeśli zdarzenie zostanie wysłane, zanim nagłówek się zamontuje?
- Jak przetestujesz integrację czterech zespołów?
- Kiedy mikrofrontendy w ogóle nie mają sensu?