Jak uniknąć najczęstszych błędów przy migracji projektów React do monorepo

Marek Radoszewski Marek Radoszewski
Narzędzia i Praktyki
25.05.2026 13 min
Jak uniknąć najczęstszych błędów przy migracji projektów React do monorepo

Wprowadzenie do migracji React do monorepo w małym zespole

Migracja kilku projektów React do jednego monorepo kusi obietnicą porządku, współdzielenia komponentów i spójniejszego rozwoju. Szczególnie w małym zespole brzmi to jak idealny sposób na okiełznanie rosnącej liczby repozytoriów i konfiguracji. Zamiast żonglować wieloma repo, chcesz mieć wszystkie projekty pod jednym dachem i jedną infrastrukturą.

Droga do monorepo jest jednak bardziej złożona niż „skopiuj, wklej i działa”. To duża zmiana architektoniczna, która dotyka narzędzi, procesów CI/CD, stylu kodu i sposobu pracy zespołu. W małej ekipie każda nietrafiona decyzja boli podwójnie, bo nie ma kogo „oddelegować” do gaszenia pożarów.

W praktyce wiele zespołów zaczyna od entuzjazmu, a kończy na frustracji związanej z zależnościami, problemami pipeline’ów i chaosem w strukturze. Dobra wiadomość jest taka, że te problemy są przewidywalne. Najczęstsze błędy da się zidentyfikować z wyprzedzeniem i po prostu ich uniknąć.

W tym artykule przejdziemy krok po kroku przez najczęstsze błędy przy migracji kilku projektów React do monorepo. Skupimy się na realiach małego zespołu, gdzie liczy się pragmatyzm, prostota i minimalizowanie kosztów konfiguracyjnych. Zobaczysz, jak planować, dobierać narzędzia, zarządzać zależnościami i CI/CD oraz jak ogarnąć aspekt ludzki tej zmiany.

Schemat pokazujący kilka aplikacji React scalanych do jednego monorepo z podziałem na apps i libs, ilustrujący migrację i unikanie błędów

Błąd 1: Brak strategii i gruntownego planowania

Pierwszy błąd to rzucenie się na migrację bez jasnego planu i strategii. Widać problem w postaci bałaganu w repozytoriach, pojawia się pomysł monorepo i od razu zaczyna się przenoszenie kodu. Bez audytu, bez zdefiniowanych etapów, bez przemyślanej struktury katalogów i wspólnych zasad.

W małym zespole oznacza to bezpośrednią utratę czasu na cofanie błędnych decyzji. Każdy dzień poświęcony na naprawianie źle zaprojektowanej migracji to dzień mniej na rozwój produktu. Brak planu prowadzi do paraliżu, bo nie wiadomo, co migrować najpierw, co zostawić na później i jak zachować ciągłość prac.

Kluczowe jest rozpoczęcie od audytu istniejących projektów. Spisz wszystkie aplikacje i biblioteki, sprawdź zależności, wspólne komponenty, powielone fragmenty logiki. Zdefiniuj cele: czy priorytetem jest współdzielenie kodu, ujednolicenie narzędzi, przyspieszenie refaktoryzacji, czy optymalizacja CI/CD. Zespół musi rozumieć, po co w ogóle robicie monorepo.

Drugim filarem jest zaprojektowanie struktury, np. apps dla aplikacji (frontend-panel, frontend-client) oraz libs dla bibliotek (ui-kit, shared-hooks, utils). Do tego przygotuj plan migracji krok po kroku, zaczynając od najmniej krytycznych elementów, a nie od wszystkiego naraz. Przykładowe fazy: konfiguracja monorepo, migracja małej biblioteki, pierwsza aplikacja, a potem ujednolicanie konfiguracji (ESLint, Prettier, TypeScript).

Jak zaplanować migrację krok po kroku

  1. Audyt i inwentaryzacja
  2. Lista aplikacji i bibliotek.
  3. Identyfikacja wspólnych komponentów i hooksów.
  4. Przegląd zależności i wersji.

  5. Definicja celów

  6. Priorytet: współdzielenie kodu, CI/CD, spójność konfiguracji?
  7. Oczekiwane korzyści dla zespołu i produktu.

  8. Projekt struktury katalogów

  9. apps/ – wszystkie aplikacje React.
  10. libs/ – współdzielone biblioteki i moduły.

  11. Plan faz migracji

  12. Faza 1: puste monorepo + jedna mała biblioteka.
  13. Faza 2: pierwsza aplikacja.
  14. Faza 3: kolejne aplikacje.
  15. Faza 4: ujednolicenie lintów, formatterów, tsconfigów.

Błąd 2: Niewłaściwy wybór lub niezrozumienie narzędzi do monorepo

Kolejna pułapka to zły dobór narzędzia albo używanie go bez zrozumienia. Rynek oferuje kilka głównych podejść: Yarn Workspaces, pnpm Workspaces, Lerna oraz Nx. Każde z nich ma inne mocne strony i inną złożoność. Wybór „na hype” lub bez PoC szybko się mści.

W małym zespole zbyt zaawansowane narzędzie może przytłoczyć. Jeśli brakuje osoby odpowiedzialnej za infrastrukturę, każdy dodatkowy poziom skomplikowania zabiera czas deweloperom. Z drugiej strony, zbyt proste podejście może przestać wystarczać po dodaniu kilku kolejnych aplikacji i bibliotek, co wymusi kosztowną zmianę stacku.

Najprostsze są Yarn Workspaces lub pnpm Workspaces – świetne do spójnego zarządzania zależnościami w mniejszych monorepo. Lerna dodaje zarządzanie wersjonowaniem i skryptami w wielu pakietach. Nx idzie dalej, oferując analizę zależności między projektami, generatory kodu i inteligentne budowanie tylko tego, co się zmieniło.

Dobre podejście w małym zespole to zrobienie krótkiego Proof of Concept dla 1–2 narzędzi. Przenieś jedną bibliotekę, skonfiguruj podstawowe skrypty build/test i zobacz, jak czujecie się z danym rozwiązaniem. Jeśli decydujecie się na Nx, zaplanujcie choć krótkie wewnętrzne szkolenie, aby wszyscy rozumieli podstawowe komendy i koncepcje.

Jak dobrać narzędzie do monorepo

  1. Yarn/pnpm Workspaces
  2. Dobre do prostego zarządzania zależnościami.
  3. Mała krzywa uczenia, minimalna złożoność.
  4. Wystarczające przy niewielkiej liczbie projektów.

  5. Lerna

  6. Zarządzanie pakietami i skryptami.
  7. Przydatna, gdy zależy ci na klasycznym modelu wielu pakietów.

  8. Nx

  9. Analiza zależności między aplikacjami i bibliotekami.
  10. nx affected do inteligentnych buildów i testów.
  11. Lepsze wsparcie przy rosnącej liczbie projektów.

  12. Strategia wyboru

  13. Zrób PoC na jednej bibliotece.
  14. Oceń złożoność konfiguracji vs. korzyści.
  15. Jeśli nie jesteś pewien, zacznij od Workspaces i migruj do Nx, gdy pojawią się realne potrzeby.

Błąd 3: Problemy z zarządzaniem zależnościami i wersjami

W monorepo łatwo wpaść w dependency hell, jeśli pozwolisz na różne wersje tych samych bibliotek w wielu pakietach. W projektach React szczególnie bolesne są różnice w wersjach React, React DOM, TypeScript czy ESLint. Szybko pojawiają się trudne do zdiagnozowania błędy, konflikty typów i dziwne zachowania UI.

W małym zespole ręczne pilnowanie zgodności zależności potrafi zabrać nieproporcjonalnie dużo czasu. Zamiast rozwijać produkt, debugujesz problemy wynikające z drobnych różnic w wersjach pakietów. Każda próba aktualizacji jednej aplikacji może niespodziewanie wysypać inną, jeśli nie masz jednej „wersji prawdy” dla kluczowych bibliotek.

Rozwiązaniem jest hoisting zależności oraz konsekwentne utrzymywanie spójnych wersji w całym monorepo. Yarn Workspaces, pnpm i Lerna domyślnie podnoszą zależności do głównego node_modules. W połączeniu z trzymaniem kluczowych pakietów (React, TypeScript, narzędzia lintujące) w głównym package.json, zyskujesz kontrolę nad całością ekosystemu.

Warto rozważyć pnpm, który dzięki symlinkom i silniejszej izolacji lepiej radzi sobie z monorepo niż klasyczny npm czy Yarn. Daje bardziej deterministyczne instalacje i zmniejsza ryzyko niespodziewanych konfliktów. Dla małego zespołu może to być inwestycja, która szybko się zwróci.

Dobre praktyki zarządzania zależnościami

  • Jedna wersja prawdy
  • Umieść React, React DOM, TypeScript, ESLint itp. w głównym package.json.
  • Usuń duplikaty tych zależności z poszczególnych pakietów.

  • Hoisting zależności

  • Włącz i skonfiguruj hoisting w Workspaces/Lerna.
  • Upewnij się, że pakiety korzystają z tych samych wersji bibliotek.

  • Automatyzacja i narzędzia

  • W Nx wykorzystaj wbudowane mechanizmy do kontroli zależności.
  • W Lerna używaj komend synchronizujących (bootstrap itp.).

  • pnpm w monorepo

  • Rozważ przejście na pnpm dla lepszej izolacji i deterministycznych instalacji.
  • Zmniejszysz problemy z „niewidzialnymi” konfliktami wersji.

Błąd 4: Brak spójności w architekturze i stylu kodu

Przenosząc wiele niezależnie rozwijanych projektów React do jednego monorepo, zderzasz się z różnymi konwencjami i stylami kodu. Inne nazewnictwo, inna struktura katalogów, różne konfiguracje ESLint, Prettier i TypeScript. Samo przełączanie się między projektami staje się uciążliwe, a debugowanie trudniejsze.

W małym zespole brak spójności szczególnie boli, bo każdy deweloper często dotyka kilku obszarów systemu. Zamiast skupić się na logice biznesowej, ciągle „przestawiasz się” mentalnie między różnymi stylami i konfiguracjami. Onboarding nowych osób też staje się znacznie cięższy.

Wspólne monorepo to świetny moment, by ustandaryzować styl kodu i architekturę. Wprowadź jedną, nadrzędną konfigurację ESLint i Prettier oraz wspólne tsconfig.json, które projekty mogą rozszerzać. Zdefiniuj konwencje nazewnictwa komponentów i strukturę katalogów. Z czasem zbuduj współdzieloną bibliotekę UI, np. z użyciem Storybooka.

Pre-commit hooki (Husky + lint-staged) pozwolą automatycznie formatować i lintować kod, zanim trafi do repozytorium. To ważne szczególnie w małym zespole, gdzie każdy commit ma relatywnie duży wpływ na jakość całości.

Jak zadbać o spójność architektury i stylu

  1. Wspólne ESLint i Prettier
  2. Jedna główna konfiguracja w katalogu root.
  3. eslint-config-prettier oraz eslint-plugin-prettier do bezkonfliktowego formatowania.
  4. Pre-commit hooki wymuszające standard.

  5. Wspólny TypeScript

  6. Główny tsconfig.json z domyślnymi ustawieniami.
  7. Projekty rozszerzają ten plik własnymi specyficznymi opcjami.

  8. Konwencje nazewnictwa i struktury

  9. Jasne zasady dla nazw komponentów, plików, folderów.
  10. Powtarzalna struktura katalogów dla komponentów, np. components/Button.

  11. Wspólna biblioteka UI

  12. Jeden ui-kit w libs/.
  13. Dokumentacja i rozwój komponentów w Storybooku.
  14. Spójny wygląd i zachowanie we wszystkich aplikacjach Reactowych.

Schemat architektury monorepo React z katalogami apps i libs, biblioteka UI i współdzielone zależności, wspierający mały zespół

Błąd 5: Niedocenianie złożoności CI/CD w monorepo

Kiedy kilka aplikacji React i wiele bibliotek ląduje w jednym repo, CI/CD robi się znacząco bardziej skomplikowane. Najczęstszym błędem jest budowanie i testowanie całego monorepo przy każdej zmianie. To może prowadzić do bardzo długich pipeline’ów, które spowalniają cały cykl developmentu.

W małym zespole, bez dedykowanego inżyniera DevOps, każdy problem z pipeline’em oznacza odrywanie deweloperów od właściwego kodowania. Wielominutowe lub wręcz kilkudziesięciominutowe buildy potrafią skutecznie zabić flow pracy. Z czasem prowadzi to do rzadszych wdrożeń i narastającego długu technicznego.

Rozwiązaniem jest inteligentne CI/CD, które buduje i testuje tylko projekty dotknięte zmianami. Narzędzia takie jak Nx mają wbudowaną analizę zależności i komendy typu nx affected, które dokładnie określają, co należy zbudować lub przetestować po danym commicie. W połączeniu z cache’owaniem artefaktów i zależności można radykalnie skrócić czas pipeline’ów.

Dobrą praktyką jest także podział pipeline’ów na osobne ścieżki dla bibliotek i aplikacji oraz wyraźne udokumentowanie procesu. W małym zespole jasne instrukcje „jak odpalić, jak zdebugować” są kluczowe, bo nie ma dużej rotacji specjalistycznych ról.

Jak ogarnąć CI/CD w monorepo

  • Wykrywanie zmian
  • Użyj narzędzi analizujących zależności (np. Nx).
  • Testuj i buduj tylko to, co faktycznie zostało zmienione.

  • Cache’owanie

  • Cache’uj artefakty buildów i zależności w CI.
  • Wykorzystuj lokalne i zdalne cache, jeśli narzędzie je oferuje.

  • Podział pipeline’ów

  • Osobne pipeline’y dla bibliotek i aplikacji.
  • Możliwość uruchamiania tylko fragmentu procesu, gdy to potrzebne.

  • Dokumentacja procesu

  • Opisz krok po kroku, jak działa CI/CD w monorepo.
  • Dodaj sekcję z typowymi problemami i sposobami debugowania.

Błąd 6: Ignorowanie wydajności doświadczenia deweloperskiego (DX)

Monorepo ma ogromny wpływ na doświadczenie deweloperskie (DX). Zbyt duża liczba pakietów, powolne starty dev serverów, ciężkie testy i przeciążone IDE powodują, że każdy dzień pracy staje się bardziej męczący. Wiele problemów wydajności nie jest widocznych od razu, ale kumuluje się, gdy monorepo rośnie.

Dla małego zespołu, w którym każdy i tak ma pełne ręce roboty, powolne środowisko pracy jest wyjątkowo kosztowne. Każde dodatkowe 20–30 sekund oczekiwania przy każdym buildzie czy restarcie dev servera to utrata koncentracji i motywacji. Z czasem odbija się to na jakości kodu i tempie dostarczania funkcji.

Dlatego już na etapie projektowania monorepo warto zadbać o optymalizację DX. Narzędzia, które oferują caching obliczeń i równoległe wykonywanie zadań, znacząco przyspieszają codzienną pracę. Poprawnie skonfigurowany Hot Module Replacement (HMR) skraca czas feedbacku po zmianie komponentu. Odpowiednio przygotowane skrypty pozwalają uruchamiać tylko tę aplikację lub testy, które są w danym momencie potrzebne.

Nie zapominaj o konfiguracji IDE i wtyczek z myślą o monorepo. VS Code z dobrą konfiguracją TypeScript, ESLint i Prettier, świadomą struktury monorepo, robi ogromną różnicę w komfortcie pracy.

Jak zadbać o dobre DX w monorepo

  • Narzędzia z cachingiem i optymalizacją
  • Wykorzystaj computation caching i równoległe taski (np. w Nx).
  • Minimalizuj czas ponownego budowania po małych zmianach.

  • Hot Module Replacement (HMR)

  • Upewnij się, że HMR działa we wszystkich aplikacjach React.
  • Unikniesz pełnych przeładowań strony przy każdej zmianie.

  • Lokalne linkowanie pakietów

  • Użyj yarn link / pnpm link podczas pracy nad współdzielonymi bibliotekami.
  • Szybko testuj zmiany biblioteki w kontekście wielu aplikacji.

  • Wydajne IDE

  • Skonfiguruj VS Code lub inne IDE z myślą o monorepo.
  • Ustaw odpowiednie rozszerzenia i aliasy ścieżek.

  • Minimalizacja zakresu

  • Nie uruchamiaj całego monorepo, gdy pracujesz nad jedną aplikacją.
  • Przygotuj skrypty typu dev:app1, dev:app2, test:libs itd.

Błąd 7: Brak komunikacji i opór przed zmianami w zespole

Migracja do monorepo to nie tylko zmiana technologiczna, ale też zmiana organizacyjna. Jeśli zespół nie rozumie, po co to robicie, jakie będą korzyści i koszty, łatwo o opór i spadek motywacji. Szczególnie w małej ekipie, gdzie każdy ma duży wpływ na atmosferę, brak komunikacji potrafi skutecznie zablokować projekt.

Częsty błąd to planowanie i wdrażanie monorepo „po cichu” przez jedną lub dwie osoby. Reszta zespołu nagle budzi się w nowej strukturze, z nowymi narzędziami, bez wprowadzenia. Wtedy każde potknięcie migracji jest postrzegane jako argument przeciwko zmianie.

Lepsze podejście to włączenie całego zespołu od początku. Transparentnie przedstaw powody migracji, zakładane korzyści i ryzyka. Organizuj regularne spotkania, na których omawiacie postęp, problemy i kolejne etapy. Zadbaj o mentoring – bardziej doświadczeni deweloperzy powinni wspierać pozostałych w nauce nowych narzędzi.

Warto też świętować małe sukcesy: pierwsza poprawnie zmigrowana biblioteka, pierwsza aplikacja działająca w monorepo, pierwsze skrócone pipeline’y. Takie małe kroki pomagają utrzymać entuzjazm i poczucie, że idziecie w dobrym kierunku.

Jak zadbać o aspekt ludzki migracji

  • Włącz zespół od początku
  • Omów powody migracji i oczekiwane korzyści.
  • Daj przestrzeń na pytania i obawy.

  • Regularna komunikacja

  • Krótkie spotkania statusowe raz w tygodniu.
  • Jasne informacje o tym, co już działa, a co jeszcze jest w trakcie.

  • Mentoring i wsparcie

  • Starsi deweloperzy wspierają w pracy z monorepo.
  • Wspólne sesje pair programming przy pierwszych migracjach.

  • Świętowanie postępów

  • Doceniaj kolejne etapy ukończonej migracji.
  • Buduj narrację sukcesu wokół przejścia na monorepo.

Błąd 8: Próba migracji wszystkiego naraz („big bang approach”)

Najbardziej ryzykownym podejściem jest chęć przeniesienia wszystkiego do monorepo jednocześnie. Kusząca jest wizja, że po jednym dużym wysiłku od razu będzie porządek. W praktyce to często przepis na chaos, przeciążenie zespołu i długotrwałe zatrzymanie rozwoju produktu.

W małym zespole nie ma zasobów, żeby obsłużyć jednocześnie wszystkie problemy, jakie pojawią się przy „big bang approach”. Pojawią się konflikty zależności, niespójne konfiguracje, problemy z CI/CD, wydajnością i stylem kodu – wszystko naraz. Łatwo wtedy o zniechęcenie i porzucenie monorepo jako „zbyt skomplikowanego”.

Bezpieczniejsze i skuteczniejsze jest podejście stopniowe. Zacznij od konfiguracji pustego monorepo, następnie przenieś małą, niezależną bibliotekę. Dopiero później migruj pierwszą aplikację, a kolejne dołączaj w następnych fazach. Przez pewien czas możesz utrzymywać stare repozytoria w trybie „read-only” lub „maintenance”, co pozwala na łagodniejsze przejście.

Każda faza powinna kończyć się działającym stanem systemu. Dzięki temu w razie problemów nie blokujesz całego zespołu i możesz szybciej uczyć się na błędach. To szczególnie ważne, gdy w zespole nie ma dużo doświadczeń z monorepo.

Jak uniknąć „big bang” i migrować stopniowo

  1. Faza 1 – Fundamenty
  2. Utwórz puste monorepo z wybranym narzędziem.
  3. Skonfiguruj podstawowy ESLint, Prettier, TypeScript.

  4. Faza 2 – Pierwsza biblioteka

  5. Przenieś małą, niezależną bibliotekę (np. shared-utils).
  6. Upewnij się, że build, testy i lint działają.

  7. Faza 3 – Pierwsza aplikacja

  8. Zmigruj jedną, mniej krytyczną aplikację React.
  9. Na tym etapie może jeszcze używać części starych bibliotek.

  10. Faza 4 – Kolejne aplikacje i ujednolicanie

  11. Stopniowo przenoś kolejne aplikacje.
  12. Ujednolicaj konfiguracje i przenoś współdzielone komponenty do libs.

  13. Stare repozytoria

  14. Przez pewien czas utrzymuj je równolegle.
  15. Oznacz je jako „read-only”, gdy monorepo przejmie ich rolę.

Podsumowanie: checklista udanej migracji do monorepo React

Migracja kilku projektów React do jednego monorepo w małym zespole to wyzwanie, ale dobrze zaplanowana może znacząco poprawić spójność, efektywność i tempo rozwoju. Kluczowe jest świadome unikanie opisanych błędów i traktowanie monorepo jako inwestycji, a nie magicznej pigułki na wszystkie problemy.

Poniżej praktyczna checklista, która pomoże uporządkować działania:

  • Strategia i plan
  • Audyt istniejących aplikacji i bibliotek.
  • Jasno zdefiniowane cele migracji.
  • Zaprojektowana struktura apps/ i libs/.
  • Etapowy plan migracji zamiast „big bang”.

  • Narzędzia

  • Przemyślany wybór między Yarn/pnpm Workspaces, Lerna, Nx.
  • PoC na małym projekcie zanim podejmiesz ostateczną decyzję.
  • Ewentualne szkolenie zespołu z wybranego narzędzia.

  • Zależności i wersje

  • Jedna wersja prawdy dla kluczowych bibliotek.
  • Skonfigurowany hoisting zależności.
  • Rozważenie pnpm dla lepszej izolacji.

  • Spójność kodu

  • Wspólny ESLint, Prettier i tsconfig.json.
  • Jasne konwencje nazewnictwa i struktury.
  • Wspólna biblioteka UI rozwijana i dokumentowana w jednym miejscu.

  • CI/CD i DX

  • Inteligentne pipeline’y budujące tylko zmienione projekty.
  • Cache’owanie buildów i zależności.
  • HMR, zoptymalizowane skrypty, wydajne IDE.
  • Możliwość uruchamiania tylko wybranych aplikacji/testów.

  • Zespół i komunikacja

  • Włączenie całego zespołu w proces od początku.
  • Regularne spotkania i transparentna komunikacja.
  • Mentoring, wspólne rozwiązywanie problemów.
  • Świętowanie kolejnych etapów migracji.

Monorepo nie rozwiąże automatycznie wszystkich problemów, ale przy dobrze poprowadzonej migracji stanie się solidnym fundamentem pod dalszy rozwój. Dzięki planowaniu, stopniowemu podejściu, świadomemu doborowi narzędzi i zadbaniu o aspekt ludzki możesz zamienić potencjalny koszmar w realne usprawnienie pracy zespołu.

Marek Radoszewski

Autor

Marek Radoszewski

Freelance developer i tech blogger od 7 lat. Pracował przy projektach dla klientów z Polski, UK i USA. Na blogu pisze o praktycznych aspektach programowania, narzędziach i tym, jak skutecznie rozwijać karierę jako niezależny programista.

Wróć do kategorii Narzędzia i Praktyki