Какой роутер использовался на проекте: App Router или Page Router
Что проверяют
Работали ли вы с современным Next.js и понимаете ли, чем два роутера отличаются по сути, а не по названию. Следом спрашивают: почему выбрали этот вариант, мигрировали ли и что при переходе сломалось.
Как отвечать
Сначала поправьте название: правильно Pages Router. Это два способа маршрутизации внутри Next.js, а не отдельные библиотеки. Скажите, что было у вас, и покажите разницу:
- Pages Router: каталог
pages/, файл равен маршруту, данные черезgetServerSideProps,getStaticPropsиgetStaticPaths, общая обёртка в_app.tsxи_document.tsx. Все компоненты клиентские, на сервере они пререндерятся и потом гидратируются. Роутер поддерживается и сейчас; - App Router: каталог
app/, стабилен с Next.js 13.4. Построен на React Server Components: компоненты по умолчанию серверные, клиентские помечаются"use client". Есть вложенныеlayout.tsx,loading.tsxиerror.tsx, стриминг черезSuspense, Server Actions,generateMetadataиgenerateStaticParams; - кэширование: в App Router это отдельная тема. С Next.js 15
fetchпо умолчанию не кэшируется, ISR включается черезrevalidate, а чтениеcookies()илиheaders()делает маршрут динамическим.
Если мигрировали, расскажите как: оба каталога могут жить в одном проекте, страницы переносят по одной. Типичные проблемы: библиотеки, которые не работают в серверных компонентах, контексты и состояние, которые пришлось выносить в клиентские провайдеры, другое поведение кэша.
Если у вас был только один из роутеров, скажите прямо и объясните, как понимаете второй. Это честнее и сильнее, чем выдуманный опыт.
Где спотыкаются
Путают с React Router или называют App Router «роутером для SPA». Оба роутера Next.js рендерят страницы на сервере.
Ставят "use client" в каждый файл после миграции. Формально это App Router, но без выгоды от серверных компонентов, и весь код уезжает в клиентский бандл.
Думают, что клиентский компонент рендерится только в браузере. Он тоже проходит серверный рендер и затем гидратируется, поэтому обращение к window в теле компонента ломает серверный рендер.