Next.js 15 окончательно закрыл гонку за стабильность App Router и стал предсказуемым инструментом для серьёзных проектов. Разберём ключевые изменения и как мы используем их в реальных коммерческих сайтах на стеке React 19 + TypeScript + Tailwind.
Async Request APIs
Самое заметное изменение для разработчиков — cookies(), headers(), params и searchParams стали асинхронными. Это разовая боль на миграции и серьёзный плюс на проде: фреймворк теперь рендерит статические части страницы до того, как дождётся динамические запросы. Лидерборд по Lighthouse идёт вверх без оптимизации.
На практике миграция с 14 на 15 — это около 100–300 правок на проект средней сложности. Codemod покрывает 80%, остальное правится руками. Все наши новые проекты стартуют сразу на 15, миграцию старых делаем по запросу за 3–5 рабочих дней.
Кэширование стало явным
В 14 версии fetch кэшировался по умолчанию, что приводило к удивлениям в проде. В 15 дефолт сменился: fetch теперь не кэшируется, GET-роуты не кэшируются, кэш на маршруте включается явно через force-cache или revalidate. Это намного честнее для продуктовой команды — никаких сюрпризов с устаревшими данными.
Новый API unstable_cache позволяет кэшировать любую функцию (не только fetch) с тегами и временем жизни. Удобно для тяжёлых запросов в БД: посчитали один раз, сохранили на час, при изменении данных вызвали revalidateTag. Реализуем так каталоги и аналитические дашборды — снижение нагрузки на Postgres в 5–10 раз.
Turbopack: стабильно для dev
Turbopack теперь стабилен для dev-сервера. На больших проектах (более 1000 модулей) холодный старт ускоряется в 3–5 раз, hot reload — почти мгновенный. Для production build Turbopack пока в beta, но на простых проектах уже работает и сборка проходит в 1.5–2 раза быстрее, чем на Webpack.
Эффект для команды: разработчик меньше ждёт, больше делает. На проектах 4–8 недель экономия в 2–4 рабочих дня только за счёт смены сборщика.
React 19 и Server Actions
React 19 принёс хуки useActionState, useOptimistic, useFormStatus, что отлично сочетается с Server Actions из Next.js. Простая форма с прогресс-баром, оптимистичным апдейтом и обработкой ошибок теперь пишется в 30–40 строк без сторонних библиотек.
Server Actions заменяют большую часть сценариев, где раньше был отдельный API-роут: отправка формы, лайки, добавление в избранное, оптимистичные апдейты. Безопасность встроена — Next валидирует CSRF и origin. Для серьёзных бэкенд-операций (платежи, тяжёлые расчёты) мы по-прежнему пишем отдельный Go-сервис, но 70% CRUD-форм уезжают на Server Actions.
Partial Prerendering и Streaming
Partial Prerendering (PPR) пока в experimental, но работает достаточно стабильно. Идея: статическая часть страницы рендерится на сборке, динамическая (например, корзина в шапке) — стримится из сервера. TTFB остаётся низким, динамика обновляется без задержки на холодный SSR.
Streaming SSR с Suspense уже стабилен. На продуктовых страницах это даёт визуально мгновенный рендер — каркас отображается сразу, дорогие компоненты подтягиваются по мере готовности. Для каталогов с фильтрами разница в восприятии скорости огромная.
Image и Font оптимизации
next/image улучшил автоматическое определение размеров, поддерживает AVIF из коробки, лучше обрабатывает remote-источники с Object Storage. next/font стал стабильнее на сложных деплоях (на нашем стеке Yandex Cloud + S3 теперь работает без танцев).
Новый компонент <Form> с автоматическим Form Validation State, прогрессивно ухудшающийся до обычной HTML-формы, — приятная мелочь, которую мы используем во всех новых проектах.
Что стоит делать сразу
Включайте Turbopack для dev, мигрируйте на async APIs, переписывайте простые формы на Server Actions, явно настраивайте кэш каждой fetch и страницы, используйте revalidateTag для аналитики и каталогов. Это базовые практики, без которых Next.js 15 даёт меньше, чем мог бы.
Итого
Next.js 15 — зрелый и предсказуемый фреймворк без революций, но с десятком важных улучшений. Главные победы: явное кэширование, Turbopack для dev, React 19 с Server Actions. Для новых проектов это очевидный выбор; миграция со старых окупается за счёт скорости разработки и более понятного поведения в проде.
Частые вопросы
Что такое Async Request APIs в Next.js 15?
Cookies(), headers(), params и searchParams стали асинхронными. Это разовая боль на миграции и серьёзный плюс на проде: фреймворк теперь рендерит статические части страницы до того, как дождётся динамические запросы. Лидерборд по Lighthouse идёт вверх без оптимизации. На практике миграция с 14 на 15 — это около 100–300 правок на проект средней сложности. Codemod покрывает 80%, остальное правится руками. Все новые проекты стартуют сразу на 15.
Как изменилось кэширование в Next.js 15?
В 14 версии fetch кэшировался по умолчанию, что приводило к удивлениям в проде. В 15 дефолт сменился: fetch теперь не кэшируется, GET-роуты не кэшируются, кэш на маршруте включается явно через force-cache или revalidate. Это намного честнее для продуктовой команды — никаких сюрпризов с устаревшими данными. Новый API unstable_cache позволяет кэшировать любую функцию (не только fetch) с тегами и временем жизни. Удобно для тяжёлых запросов в БД.
Стоит ли использовать Turbopack в Next.js 15?
Turbopack теперь стабилен для dev-сервера. На больших проектах (более 1000 модулей) холодный старт ускоряется в 3–5 раз, hot reload — почти мгновенный. Для production build Turbopack пока в beta, но на простых проектах уже работает и сборка проходит в 1.5–2 раза быстрее, чем на Webpack. Эффект для команды: разработчик меньше ждёт, больше делает. На проектах 4–8 недель экономия в 2–4 рабочих дня только за счёт смены сборщика. Включайте Turbopack для dev сразу.
Что даёт React 19 + Server Actions в Next.js 15?
React 19 принёс хуки useActionState, useOptimistic, useFormStatus, что отлично сочетается с Server Actions из Next.js. Простая форма с прогресс-баром, оптимистичным апдейтом и обработкой ошибок теперь пишется в 30–40 строк без сторонних библиотек. Server Actions заменяют большую часть сценариев, где раньше был отдельный API-роут: отправка формы, лайки, добавление в избранное. Безопасность встроена — Next валидирует CSRF и origin. 70% CRUD-форм уезжают на Server Actions.
Что такое Partial Prerendering в Next.js 15?
Partial Prerendering (PPR) пока в experimental, но работает достаточно стабильно. Идея: статическая часть страницы рендерится на сборке, динамическая (например, корзина в шапке) — стримится из сервера. TTFB остаётся низким, динамика обновляется без задержки на холодный SSR. Streaming SSR с Suspense уже стабилен. На продуктовых страницах это даёт визуально мгновенный рендер — каркас отображается сразу, дорогие компоненты подтягиваются по мере готовности. Для каталогов с фильтрами разница в восприятии скорости огромная.
Какие практики использовать в Next.js 15 с первого дня?
Включайте Turbopack для dev, мигрируйте на async APIs, переписывайте простые формы на Server Actions, явно настраивайте кэш каждой fetch и страницы, используйте revalidateTag для аналитики и каталогов. Это базовые практики, без которых Next.js 15 даёт меньше, чем мог бы. Также next/image улучшил автоматическое определение размеров, поддерживает AVIF из коробки. next/font стал стабильнее на сложных деплоях. Новый компонент Form с автоматической валидацией — приятная мелочь для всех новых проектов.