W 2026 oba routery są nadal wspierane, ale większość nowych możliwości Next.js trafia najpierw do App Router. W tym artykule porównam oba rozwiązania bez marketingowego szumu i pokażę nie tylko zalety, ale też realny koszt migracji, granice ekosystemu i momenty, w których Pages Router wciąż bywa rozsądnym wyborem.
Szybkie porównanie
| Kryterium | Pages Router | App Router |
|---|---|---|
| Folder | pages/ | app/ |
| Domyślny typ komponentu | Client Component | Server Component |
| Pobieranie danych | getServerSideProps, getStaticProps | async component, fetch() |
| Layouty | _app.tsx + getLayout pattern | Natywne, zagnieżdżone, zachowują stan |
| Loading/Error states | Ręczna implementacja | Plik loading.tsx / error.tsx |
| Metadata / SEO, czyli Search Engine Optimization, to optymalizacja strony pod widoczność w wynikach wyszukiwania. | next/head | Metadata API, czyli Application Programming Interface, definiuje sposób komunikacji między aplikacjami lub modułami. Tu chodzi o konwencje plików Next.js, które zamieniają eksportowaną funkcję w gotowy plik sitemap.xml lub robots.txt. z TypeScript |
| Bundle to paczka JavaScriptu lub innych zasobów wysyłana do przeglądarki jako część aplikacji. size | Większy (cały kod do klienta) | Mniejszy (Server Components) |
| Streaming | Brak | Wbudowany z Suspense |
| Status wsparcia | Utrzymywany, bez nowych funkcji | Aktywny rozwój, nowe funkcje |
| Krzywa uczenia się | Niska dla znających React | Wyższa (RSC, Server Actions, cache) |
| Kiedy wybrać | Istniejący projekt, proste strony, stabilność | Nowe projekty, dashboard, SSaaS, SEO-heavy |
Czym się różnią?
Zanim przejdziemy do szczegółów, warto zwrócić uwagę na fundamentalną różnicę:
Pages Router to tradycyjny routing Next.js, w którym pliki w folderze pages/ automatycznie stają się trasami. Komponenty są Client Components z opcjonalnym SSR, czyli Server-Side Rendering, to generowanie HTML na serwerze przy żądaniu — komponent client:only je pomija i renderuje się wyłącznie w przeglądarce./SSG (Static Site Generation) to generowanie kompletnego HTML podczas budowania strony. Gotowe pliki serwujesz z CDN bez renderowania na żądanie — najszybszy i najtańszy model dla treści, która nie zmienia się przy każdej wizycie. przez getServerSideProps i getStaticProps.
App Router — kluczowe w nim są komponenty serwerowe z biblioteką React Server Components wy routing w folderze app/, omyślnie wszystkie komponenty to Server Components,a layouts, loading states i error boundaries są wbudowane w strukturę folderów.
Kluczowe różnice
1. Pobieranie danych
Tutaj zaszła największa zmiana i jest to też źródło największych komplikacji
Pages Router — dedykowane funkcje eksportowane z komponentu strony:
App Router — dane pobierasz bezpośrednio w komponencie:
Model pobierania danych w App Router bywa prostszy na poziomie samego kodu, ale dochodzi nowa warstwa decyzji o cache, rewalidacji i granicach między kodem serwerowym, a klienckim. Jeśli interesuje Cię ten temat, możesz zobaczyć więcej o strategiach pobierania danych w artykule o fetch, cache i rewalidacji w Next.js.
2. Layouty
Pages Router — jeden globalny _app.tsx, opcjonalnie per-page layouts przez pattern z getLayout:
App Router — layouty są natywne, zagnieżdżone i zachowują stan:
Layouty w App Router mogą zachowywać stan i nie być odtwarzane przy każdej nawigacji w obrębie tego samego drzewa. To ogromna różnica dla UX, czyli User Experience, opisuje całe doświadczenie użytkownika podczas korzystania z produktu., ale tylko wtedy, gdy sensownie zaprojektujesz granice layoutów i nie przeniesiesz zbyt wiele logiki do Client Components.
3. Loading i Error States
Pages Router — musisz sam zaimplementować loading states, ponieważ error boundaries to dodatkowa konfiguracja:
App Router — konwencja plików obsługuje to automatycznie:
4. Server Components vs Client Components
W Pages Router komponenty są z natury klienckie. Oznacza to, że nawet po wyrenderowaniu strony na serwerze (SSR/SSG), ich kod JavaScript i tak jest wysyłany do przeglądarki:
App Router — domyślnie Server Components, kod zostaje na serwerze:
To przekłada się na mniejszy JavaScript wysyłany do przeglądarki.
5. Metadata i SEO
Pages Router — komponent Head lub next/head:
App Router — Metadata API z pełnym typowaniem:
Metadata API jest czytelniejsze i obsługuje dynamiczne meta tagi bez dodatkowych bibliotek.
Porównanie wydajności
| Aspekt | Pages Router | App Router |
|---|---|---|
| Bundle size | Większy (cały kod do klienta) | Mniejszy (Server Components) |
| Hydration to etap, w którym React podłącza logikę JavaScript do już wygenerowanego HTML-a w przeglądarce. | Pełna hydratacja | Selektywna hydratacja |
| Streaming | Brak | Wbudowany z Suspense |
| Layout persistence | Wymaga obejścia | Natywne |
| Initial load | Szybki (SSR/SSG) | Szybki + streaming |
Gdzie App Router nadal potrafi boleć
App Router nie zawsze jest idealnym rozwiązaniem dla każdego zespołu i w każdej sytuacji, dlatego też warto bym rozwinął kilka potencjalnych trudności:
- Rozróżnienie kodu serwerowego od klienckiego: trudności w odróżnieniu kodu serwerowego od klienta, czyli która część kodu działa na serwerze, a która w przeglądarce. Jest to szczególnie problematyczne, gdy używasz bibliotek, które potrzebują dostępu do funkcji przeglądarki (np.
window) lub specjalnych funkcji Reacta (hooków), które działają tylko po stronie klienta. - Złożone zarządzanie danymi: Mechanizmy pamięci podręcznej (cache) i odświeżania danych są bardziej zaawansowane niż w Pages Router, ale też bardziej skomplikowane w obsłudze. Samo użycie
fetch()do pobierania danych nie gwarantuje, że zawsze będziesz mieć aktualne informacje. - Wyzwania w testowaniu: Narzędzia do testowania i same testy wciąż mogą być problematyczne, zwłaszcza przy asynchronicznych komponentach serwerowych. Testy kompleksowe (E2E) są aktualnie bezpieczniejszym wyborem niż próba testowania wszystkiego testami jednostkowymi.
- Konieczność nauki nowych koncepcji: Zespół musi przyswoić nowe koncepcje, takie jak React Server Components, strumieniowanie danych, akcje serwerowe i nowe sposoby zarządzania pamięcią podręczną. To wymaga czasu i zmiany sposobu myślenia, a to powoduje duży opór zespołu.
Kiedy wybrać Pages Router?
- Istniejący projekt — migracja dużego projektu to relatywnie duży wysiłek,
- Proste strony — landing page, portfolio bez zastosowania złożonej logiki,
- Zespół nie zna App Routera — krzywa uczenia się jest realna,
- Zależność od bibliotek — niektóre biblioteki nie wspierają jeszcze Server Components,
- Stabilność — Pages Router jest pewny i bardzo przewidywalny.
Kiedy wybrać App Router?
- Nowy projekt — w praktyce to domyślny wybór dla większości nowych aplikacji,
- Złożone layouty — dashboard, panel admina, aplikacja SaaS,
- SEO i wydajność — łatwiej wykorzystać streaming, Metadata API i nowy model renderowania,
- Duże ilości danych — Server Components redukują bundle,
- Streaming — potrzebujesz pokazywać treść progresywnie,
Pytanie brzmi - czy można używać obu?
Tak, jest taka możliwość, by w Next.js używać hybrydowego podejścia — pages/ i app/ mogą współistnieć, co ułatwia stopniową migrację. Właśnie taka stopniowa migracja, może nam oszczędzić sporo złym emocji, a jednocześnie osiągniemy swój cel.
Uwaga! Pamiętaj, że ta sama trasa nie może istnieć w obu folderach (!)
Migracja z Pages Router do App Router
Jeśli masz istniejący projekt, migruj stopniowo:
- Utwórz folder
app/i skonfiguruj podstawowy layout. - Zacznij od prostych stron, na "tapetę" weź strony np. about, kontakt, statyczne treści.
- Migruj strony z danymi — zamień
getStaticPropsna komponenty serwerowe async. - Zostaw API routes w
pages/api/albo migruj stopniowo do Route Handlers wapp/**/route.ts. - Na końcu migruj te najbardziej złożone strony, czyli dashboardy czy skomplikowane formularze etc.
Nie musisz migrować wszystkiego naraz. Hybrydowe podejście jest w pełni wspierane.
Moja rekomendacja
Nowy projekt w 2026? Najlepszy wybór to właśnie App Router, ponieważ to kierunek rozwoju Next.js i domyślna ścieżka w aktualnej dokumentacji.
Istniejący projekt? Najlepiej zostań przy Pages Router, jeśli działa i zespół nie potrzebuje funkcji specyficznych dla App Router. Nie migruj na siłę, tylko wtedy, gdy realnie uprości to architekturę albo odblokuje nowe możliwości. Z czasem różnica będzie bardziej widoczna między App Router i Pages Router.
Uczysz się Next.js? Zacznij od App Router i jego modelu routingu, renderowania oraz pobierania danych. Pages Router nadal warto rozumieć, bo masa istniejących projektów nadal go używa, ale nowe rzeczy poznawaj już przede wszystkim w modelu App Router.
