1. Сравнение архитектур: Pages Router против App Router и новые возможности маршрутизации
Сравнение архитектур: Pages Router против App Router и новые возможности маршрутизации
Добро пожаловать на курс по Next.js. Мы начинаем наше погружение с фундаментального сдвига, который произошел в экосистеме React и Next.js за последние годы. Если вы работали с Next.js до 13-й версии, вы привыкли к определенному укладу вещей. Однако с появлением App Router правила игры изменились, превратив Next.js из простого мета-фреймворка в полноценное решение для построения архитектуры веб-приложений.
В этой статье мы разберем, почему произошел этот переход, чем новая модель отличается от старой, и как эти изменения влияют на производительность и SEO вашего приложения.
Pages Router: Эпоха монолитного клиента
Долгое время стандартом в Next.js был Pages Router. Его архитектура строилась вокруг папки pages. Любой файл, созданный в этой директории, автоматически становился маршрутом (роутом) приложения. Например, файл pages/about.js становился доступен по адресу /about.
Особенности Pages Router
В этой модели мы использовали специальные функции для получения данных:
* getStaticProps — для статической генерации (SSG).
* getServerSideProps — для рендеринга на сервере при каждом запросе (SSR).
* getStaticPaths — для генерации динамических маршрутов.
Главная проблема этой архитектуры заключалась в отсутствии встроенной поддержки вложенных макетов (nested layouts). Чтобы сохранить состояние боковой панели или плеера при переходе между страницами, разработчикам приходилось использовать сложные обходные пути в файле _app.js.
Кроме того, в Pages Router по умолчанию все компоненты в дереве рендеринга гидратировались на клиенте. Даже если компонент просто отображал статический текст, его JavaScript-код отправлялся в браузер, увеличивая размер бандла (Total Blocking Time).
App Router: Смена парадигмы
App Router — это новая модель, представленная в Next.js 13.4 (как стабильная), работающая в директории app. Это не просто изменение названия папки, это полная переработка того, как React работает с сервером и клиентом.
Ключевые отличия:
app являются серверными (React Server Components — RSC), если вы явно не укажете обратное.layout.js позволяют оборачивать страницы и сохранять состояние UI при навигации.page.js, layout.js, loading.js, error.js, not-found.js.!Сравнение файловой структуры: плоская структура Pages Router против вложенной структуры App Router
Server Components против Client Components
Понимание различия между серверными и клиентскими компонентами — это фундамент работы с App Router.
Server Components (RSC)
В App Router компоненты рендерятся на сервере. Результат их работы — это не HTML-строка (как в классическом SSR), и не DOM-элементы, а специальный формат данных (RSC Payload), который React использует для построения дерева компонентов.
Плюсы Server Components:
* Нулевой размер бандла: Код серверного компонента и его зависимости (например, библиотека для форматирования даты) не отправляются в браузер. * Прямой доступ к бэкенду: Вы можете обращаться к базе данных или файловой системе прямо внутри компонента. * Безопасность: Секретные ключи API и токены остаются на сервере. * Улучшенное SEO: Сервер отдает готовый контент, который легко индексируется поисковыми роботами.
Минусы:
* Нет доступа к Browser API (window, localStorage).
* Нельзя использовать хуки (useState, useEffect).
* Нельзя вешать обработчики событий (onClick).
Client Components
Чтобы добавить интерактивность (клики, состояние, эффекты), мы используем директиву 'use client' в начале файла. Это сообщает Next.js, что данный компонент и все его дочерние элементы должны быть отправлены в браузер и пройти процесс гидратации.
#### Процесс рендеринга Client Component (на примере счетчика)
Рассмотрим компонент <Counter /> с директивой 'use client'. Процесс его появления на экране выглядит так:
!Жизненный цикл клиентского компонента: от серверного HTML до интерактивности
Стратегии рендеринга в App Router
App Router отказывается от явных функций типа getServerSideProps в пользу гибридного подхода, основанного на Fetch API и конфигурации кэширования.
1. Static Rendering (SSG) — По умолчанию
Если компонент не использует динамические функции (куки, заголовки) и данные кэшируются, Next.js генерирует HTML во время сборки (build time). Этот HTML переиспользуется для каждого запроса.
2. Dynamic Rendering (SSR)
Рендеринг происходит для каждого пользователя в момент запроса. Это включается автоматически, если:
* Вы используете динамические функции: cookies(), headers().
* Вы отключаете кэш в запросе данных: fetch(url, { cache: 'no-store' }).
3. Incremental Static Regeneration (ISR)
Позволяет обновлять статические страницы без полной пересборки сайта. Вы указываете время жизни кэша, и Next.js регенерирует страницу в фоне после истечения таймера.
Пример:
4. Streaming
Технология, позволяющая разбивать UI на части и отправлять их клиенту по мере готовности. Используя компонент <Suspense>, вы можете мгновенно показать скелетон или спиннер, пока тяжелая часть страницы (например, список товаров) еще грузится на сервере.
5. Client-Side Rendering (CSR)
Классический подход React SPA. Используется внутри компонентов с 'use client', когда данные загружаются через useEffect или библиотеки вроде SWR/TanStack Query уже после загрузки страницы.
6. Partial Prerendering (PPR) — Экспериментально
Новейшая стратегия, объединяющая статику и динамику. Статическая оболочка (shell) отдается мгновенно (как SSG), а динамические части (дырки в статике) стримятся параллельно. Это «Святой Грааль» веб-производительности.
Server Actions: Мутации данных
В Pages Router для отправки формы нам нужно было создавать API Route (pages/api/form.js) и вызывать его через fetch на клиенте. App Router вводит Server Actions.
Это асинхронные функции с директивой 'use server', которые можно вызывать прямо из компонентов (даже клиентских) или форм.
Как это работает:
action формы.Это убирает необходимость вручную писать API-эндпоинты для простых мутаций.
Влияние на SEO
Переход на App Router значительно улучшает SEO-показатели:
* Server HTML: Весь контент серверных компонентов (и начальное состояние клиентских) доступен в исходном коде страницы.
* Metadata API: Вместо тега <Head>, теперь мы экспортируем объект metadata из layout.js или page.js, что упрощает управление мета-тегами, Open Graph и JSON-LD.
* Скорость: Меньше JavaScript на клиенте означает более быструю загрузку и лучшие показатели Core Web Vitals, что является фактором ранжирования Google.
> «App Router — это не просто обновление, это взросление React как фуллстек-технологии, где граница между клиентом и сервером становится инструментом, а не препятствием.»
В следующей статье мы углубимся в файловую структуру и создадим наше первое приложение на App Router, применяя изученные концепции на практике.