Важно за новите проекти
Кратка история - откъде идваме
Pages Router съществува от самото начало на Next.js. Моделът е прост и интуитивен: всеки файл в pages/ директорията автоматично става route. pages/about.tsx е /about. pages/blog/[slug].tsx е /blog/:slug. Data fetching се случва чрез специални функции - getServerSideProps за SSR, getStaticProps за SSG, getStaticPaths за динамични статични routes. Моделът работи отлично в продължение на години. Лесен за разбиране, предвидим, с огромна документация и ecosystem. App Router е представен с Next.js 13 и стабилизиран в 13.4. Той е пълно преосмисляне на routing архитектурата, базирано на React Server Components, нови file conventions и вградена поддръжка за Suspense, streaming и layouts. В Next.js 16 App Router е зрял, production-ready и е посоката, в която се движи целият framework.Ключови разлики между двата подхода
Преди да влезем в плюсовете и минусите, важно е да разбереш архитектурните разлики - защото те определят всичко останало. В Pages Router всеки компонент е Client Component по подразбиране. Data fetching е отделен от компонента - чрез getServerSideProps или getStaticProps, които се изпълняват на сървъра и предават данните като props. Layouts се управляват ръчно чрез _app.tsx и _document.tsx. В App Router всеки компонент е Server Component по подразбиране. Data fetching се случва директно в компонента чрез async/await. Layouts са вградена file convention - файл layout.tsx автоматично обвива всички routes в директорията. Добавят се и нови специални файлове: loading.tsx, error.tsx, not-found.tsx.// Pages Router структура
pages/
_app.tsx // Global layout и providers
_document.tsx // HTML структура
index.tsx // /
about.tsx // /about
blog/
index.tsx // /blog
[slug].tsx // /blog/:slug
api/
posts.ts // /api/posts
// App Router структура
app/
layout.tsx // Root layout (задължителен)
page.tsx // /
about/
page.tsx // /about
blog/
layout.tsx // Layout за всички blog routes
page.tsx // /blog
[slug]/
page.tsx // /blog/:slug
loading.tsx // Loading UI за този route
error.tsx // Error UI за този route
api/
posts/
route.ts // /api/posts (Route Handlers)
Плюсове на App Router
React Server Components по подразбиране
Най-голямото предимство е вече разгледано подробно в отделна статия - Server Components означават по-малко JavaScript към клиента, директен database достъп в компонентите и значително по-добри Core Web Vitals. В Pages Router всеки компонент е клиентски, а data fetching е изкуствено отделен в специални функции. В App Router компонентът и данните му са едно цяло.Tsx
Вградени Nested Layouts
В Pages Router, ако искаш различен layout за различни секции на сайта, трябва да го управляваш ръчно в _app.tsx с условна логика. В App Router layouts са file convention - просто създаваш layout.tsx файл в директорията и той автоматично се прилага за всички routes вътре.Tsx
Streaming и Suspense
App Router има вградена поддръжка за React Suspense и HTTP streaming. Това означава, че бавни части на страницата могат да се зареждат прогресивно - браузърът получава и рендира HTML на части, без да чака всичко да е готово.Tsx
Server Actions
Server Actions са може би най-радикалната промяна. Те позволяват да дефинираш server-side функции директно в компонентите и да ги извикваш от клиента - без ръчно създаване на API routes.Tsx
Минуси на App Router - честен поглед
Би ми дошло лесно да напиша само похвали за App Router. Но реалността е по-нюансирана и справедливостта изисква да кажа и какво не работи добре - особено ако мислиш за миграция на съществуващ проект.Стръмна крива на учене
App Router въвежда едновременно много нови концепции: Server Components, Client Components, Server Actions, Route Handlers, Parallel Routes, Intercepting Routes, новите file conventions. За разработчик, свикнал с Pages Router, това е значително когнитивно натоварване. В първите седмици на работа с App Router съм допускал грешки, които в Pages Router изобщо не биха съществували.Проблеми с библиотеки на трети страни
Не всички библиотеки са адаптирани за Server Components. Много популярни пакети - особено UI библиотеки, state management решения и analytics инструменти - изискват клиентска среда. Преди да мигрираш, трябва да провериш всяка зависимост. Типичните проблеми: библиотека, използваща window или document на top level, Context Provider, който трябва да обвие цялото приложение, или компонент, импортиращ browser-only код без условна проверка. Решението обикновено е 'use client' wrapper или dynamic import с { ssr: false }, но това изисква допълнителна работа.Кеширането е сложно
App Router има агресивна кеширащ стратегия с четири различни нива: Request Memoization, Data Cache, Full Route Cache и Router Cache. В Pages Router кешът беше по-прост и предвидим. В App Router е мощен, но изисква разбиране - иначе получаваш или остарели данни, или ненужни заявки.Tsx
Debugging е по-труден
Когато нещо се счупи в App Router, намирането на причината е по-трудно. Кодът се изпълнява на две места - сървъра и клиента - и грешките понякога се появяват само на едното. Server Component грешките са видими в терминала, не в browser console-а. Това изисква промяна в debugging навиците.Стъпки за миграция от Pages Router към App Router
Добрата новина: Next.js поддържа инкрементална миграция. pages/ и app/ директориите могат да съществуват едновременно в един проект. Можеш да мигрираш route по route, без да пипаш цялото приложение наведнъж.Стратегия за миграция
Стъпка 1 - Подготовка и одит
Преди да докоснеш каквото и да е, направи одит на проекта:- Провери всяка зависимост в package.json за Server Components съвместимост
- Идентифицирай компонентите, използващи useState, useEffect, browser APIs - те ще изискват 'use client'
- Прегледай _app.tsx - всичко там трябва да се пренесе в app/layout.tsx
- Провери дали имаш getServerSideProps, getStaticProps или getInitialProps - всяка се мигрира по различен начин
Стъпка 2 - Създай root layout
Първото нещо в app/ директорията е задължителният root layout:Tsx
Tsx
Стъпка 3 - Мигрирай data fetching
Всеки getServerSideProps се трансформира в async Server Component:Tsx
Tsx
Tsx
Стъпка 4 - Мигрирай API Routes към Route Handlers
Tsx
Tsx
Стъпка 5 - Добави 'use client' там, където е необходимо
Всеки компонент, използващ hooks или browser APIs, трябва да получи 'use client'. Добрата практика е да идентифицираш тези компоненти предварително и да ги изолираш - придвижи интерактивната логика надолу в компонентното дърво, така че 'use client' границата да е колкото е възможно по-малка.Кое да избереш - ръководство за решението
Често задавани въпроси
Ще спре ли Vercel да поддържа Pages Router?
Могат ли pages/ и app/ да съществуват едновременно?
Как да мигрирам getInitialProps?
Работи ли next-auth с App Router?
По-бавен ли е App Router от Pages Router?
Миграцията от Pages Router към App Router не е спринт - тя е marathon, който изисква планиране, търпение и добро разбиране на новите концепции. Ако проектът ти работи добре с Pages Router, не мигрирай само защото "трябва". Мигрирай, когато имаш конкретна причина: нужда от Server Components, Streaming, Server Actions или nested layouts. За нови проекти обаче изборът е ясен - App Router е бъдещето на Next.js и правилният старт за всяко ново приложение днес.