Сначала безопасность: почему 16.3.3 — не опция

Начну не с новых возможностей, а с патча. 25 августа 2026 Vercel выпустил внеплановый security-релиз с двумя уязвимостями критической степени:

  • Удалённое выполнение кода через оптимизацию AVIF-изображений. Дыра в библиотеке libheif, которую использует sharp: Next.js оптимизирует подсунутую злоумышленником картинку — и на сервере выполняется чужой код. В исправленных версиях оптимизация AVIF временно отключена, пока не приедет фикс выше по цепочке.
  • Удалённое выполнение кода на Windows-серверах (CVE-2026-75604). Затрагивает приложения, где одновременно используются Pages Router и App Router без Cache Components. Linux и macOS не подвержены, но для Windows-хостинга обходного пути нет.

Исправлено в 16.3.3 (Active LTS) и 15.5.24 (Maintenance LTS). Команда одна: npm install next@16.3.3. Если у вас статический экспорт без Node-сервера, серверные уязвимости вас не касаются напрямую — но версию всё равно поднимите, чтобы не тянуть уязвимую зависимость дальше.

Что получает любой проект без изменений кода

Главная новость 16.3 — улучшения, которые включаются сами после обновления. Цифры ниже — из официального анонса.

Память в dev-режиме. Turbopack теперь выгружает неиспользуемые модули из памяти и держит кэш на диске. Результат — до 90% меньше RAM в длинных сессиях разработки: дашборд vercel.com с 21,5 ГБ упал до 2 ГБ, сайт nextjs.org — с 4,6 ГБ до 840 МБ. Для заказчика это означает одно: разработчик меньше ждёт и меньше перезапускает.

Сборка. Дисковый кэш, который с 16.1 ускорял dev, теперь работает и в next build и включён по умолчанию. Повторные сборки читают неизменившиеся артефакты из кэша: nextjs.org собирается за 9,2 секунды вместо 21, отдельные проекты — в 5,5 раза быстрее. Деплой по каждому коммиту становится дешевле.

Серверный рендеринг. Web-потоки в App Router заменили на нативные потоки Node.js — до 22% больше запросов под нагрузкой на том же железе.

Меньше prefetch-запросов. Мелкие префетчи ссылок склеиваются в один запрос, крупные общие сегменты остаются отдельными, чтобы переиспользоваться между маршрутами.

Кэш статики между деплоями. Неизменяемые ассеты могут переиспользоваться от деплоя к деплою.

Мелочи, которые давно просили. Кастомные границы ошибок через catchError с функцией retry — можно повторно запросить упавший серверный компонент, не ломая notFound и redirect. Доступ к корневым параметрам вроде языка из любого серверного компонента без прокидывания пропсов. Импорт нескольких файлов через import.meta.glob — например, всех markdown-постов блога.

TypeScript 7: проверка типов в 10 раз быстрее

В июле 2026 вышел TypeScript 7 — нативный порт компилятора, который проверяет типы примерно в 10 раз быстрее старого. Next.js 16.3 умеет использовать его прямо в next build: достаточно поднять версию typescript до 7 в зависимостях проекта. На сайте с сотнями страниц контента это заметно: этап «Running TypeScript» в сборке перестаёт быть самым долгим.

Instant Navigations: что это и кому включать

Вторая половина релиза — набор инструментов, который Vercel называет Instant Navigations. Идея: серверные компоненты дали быстрый первый рендер, но переходы между страницами часто ощущались медленнее, чем в старых SPA, где оболочка появлялась мгновенно. 16.3 это чинит, и включается всё двумя флагами в next.config: cacheComponents и partialPrefetching.

Что внутри:

  • Partial Prefetching. Next.js сам извлекает из любой страницы переиспользуемую «оболочку» и подгружает её до клика. Через prefetch на ссылке можно задать, сколько контента целевой страницы тянуть заранее.
  • Instant Insights. Панель в DevTools, которая подсвечивает переходы, оказавшиеся не мгновенными, и подсказывает, что исправить.
  • Navigation Inspector. Можно «заморозить» навигацию на этапе оболочки и посмотреть, что именно увидит пользователь в момент клика.
  • Новый ISR. Страницы, не сгенерированные при сборке, первому посетителю отдают мгновенную оболочку, а в фоне дорендериваются и попадают в кэш.
  • Хелпер instant() для Playwright. Тест падает, если контент, который должен появляться мгновенно, вдруг начал ждать сеть — например, после рефакторинга кто-то добавил чтение cookies в общий header.

Vercel прямо говорит, что это поведение станет умолчанием в следующей мажорной версии. Поэтому включать флаги стоит уже сейчас — но на staging и с прогоном Instant Insights, а не на проде в пятницу.

Экспериментальное — попробовать, не включать в прод

  • React Compiler на Rust. Компилятор теперь может работать внутри Turbopack без Babel. На большом приложении время от запуска next dev до готовой страницы сократилось на 34% при холодном старте и на 46% при тёплом. Выигрыш есть, только если Babel из проекта убран полностью.
  • Устойчивость к обрывам сети. С флагом useOffline навигации, запросы данных и Server Actions при потере связи не падают, а ждут и повторяются после восстановления. Хук useOffline позволяет показать пользователю баннер «вы офлайн».

Что это меняет для заказчика сайта

Если отбросить фреймворковую лексику, для владельца бизнес-сайта релиз означает три вещи:

  1. Дешевле сопровождение. Меньше памяти и быстрее сборки — меньше часов разработчика на ожидание и меньше денег на CI.
  2. Быстрее сайт для посетителя. Мгновенные переходы между каталогом, карточками и формой заявки — это прямое влияние на конверсию, о чём я писал в разборе View Transitions и Speculation Rules.
  3. Меньше сюрпризов при обновлениях. Next.js публикует версионированную документацию для AI-агентов: next dev поддерживает блок в AGENTS.md, который ведёт агента к документации именно вашей версии. Если ваш подрядчик работает с Claude Code или Cursor, ошибок от «устаревших знаний» модели становится меньше.

Порядок обновления

  1. Посмотреть текущую версию next в package.json и в продакшене.
  2. Обновиться до 16.3.3 (или 15.5.24, если проект на 15-й ветке и переезд на 16 не запланирован).
  3. Прогнать сборку и e2e-тесты. В 16.3 нет ломающих изменений для существующих приложений, но проверять надо всегда.
  4. Поднять TypeScript до 7 и сравнить время сборки.
  5. На staging включить cacheComponents и partialPrefetching, пройтись по сайту с Instant Insights, закрыть найденные медленные переходы.
  6. Только после этого — прод.

Если сайт до сих пор на Next.js 13–14, отдельный разговор: там сначала миграция на 15, потом на 16. Как это делается без остановки бизнеса — в моих корпоративных сайтах на Next.js и в разборе миграции с WordPress на Next.js.