Перейти к основному содержанию
Разработка2 мин чтения

Next.js 16 на практике: что изменилось и что переписывать

Обновление затрагивает три вещи: асинхронные параметры маршрутов, новую модель кэширования и сборщик. Разбираем каждую и порядок переезда без простоя.

Монитор с каркасной сеткой макета в тёмной студии

Мы перевели на Next.js 16 несколько рабочих проектов и собрали список того, что действительно требует внимания. Большая часть изменений обратно совместима, но три вещи придётся править руками, и лучше знать о них до начала обновления.

Асинхронные параметры маршрутов

Самое заметное изменение: params, searchParams, headers и cookies больше не синхронные. Их нужно дожидаться. Это касается каждой динамической страницы и каждого обработчика маршрута, поэтому правок обычно много, но все они однотипные.

До и после: динамическая страница
// Было
export default function Page({ params }: { params: { slug: string } }) {
  const post = getPost(params.slug)
  return <Article post={post} />
}

// Стало
export default async function Page({
  params,
}: {
  params: Promise<{ slug: string }>
}) {
  const { slug } = await params
  const post = getPost(slug)
  return <Article post={post} />
}

То же самое в generateMetadata и в обработчиках маршрутов. Забытое ожидание проявляется не ошибкой типов, а пустым значением в рантайме, поэтому после правок обязательно прогоните сборку с проверкой типов.

Новая модель кэширования

Кэширование стало явным. Вместо неявных правил, о которых нужно было помнить, появилась директива для явного обозначения кэшируемых участков и обновлённый набор функций сброса кэша.

Явное кэширование функции и сброс по тегу
// Кэшируем результат функции
export async function getPricing() {
  "use cache"
  const rows = await db.pricing.findMany()
  return rows
}

// Сброс кэша: второй аргумент задаёт профиль устаревания
import { revalidateTag, updateTag } from "next/cache"

// В обычном коде: помечаем как устаревшее, показываем старое
// значение и обновляем в фоне
revalidateTag("pricing", "max")

// В серверном действии: нужно, чтобы пользователь сразу увидел
// собственное изменение
updateTag("pricing")

Turbopack по умолчанию

Сборщик Turbopack стал стабильным и используется по умолчанию. На наших проектах холодный старт сократился примерно втрое, отклик при правке файла — заметно быстрее. Из подводных камней встретили два.

  • Обращение к путям через process.cwd в серверном коде заставляет сборщик трассировать весь проект. Это раздувает бандл и вызывает предупреждение при сборке.
  • Часть плагинов, написанных под webpack, не имеет аналога. Проверьте нестандартные настройки сборки до обновления.

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

  1. Обновите зависимости на отдельной ветке и запустите сборку — она покажет большинство мест с параметрами.
  2. Пройдите по всем динамическим страницам, обработчикам маршрутов и generateMetadata, добавьте ожидание параметров.
  3. Прогоните проверку типов: она поймает несоответствия в типах параметров.
  4. Разберитесь с кэшированием там, где раньше полагались на неявное поведение.
  5. Проверьте сборку на предупреждения и только затем публикуйте.

Обновление минорной версии фреймворка — работа на день. Обновление, отложенное на два года, превращается в проект на месяц.

Частые вопросы

Что обязательно переписывать при переходе на Next.js 16?
Главное изменение — параметры маршрутов, а также headers и cookies стали асинхронными и требуют ожидания. Правки затрагивают все динамические страницы, обработчики маршрутов и функции генерации метаданных. Забытое ожидание проявляется пустым значением в рантайме, а не ошибкой типов.
Стоит ли обновляться сразу или подождать?
Обновление отдельной версии — обычно работа на день, тогда как отложенное на пару лет превращается в проект на месяц из-за накопившихся несовместимостей. Мы рекомендуем обновляться на отдельной ветке с прогоном сборки и проверки типов.
Что даёт Turbopack на реальных проектах?
На наших проектах холодный старт сократился примерно втрое, отклик при правке файлов стал заметно быстрее. Из ограничений: часть плагинов, написанных под webpack, не имеет аналогов, поэтому нестандартные настройки сборки нужно проверить до обновления.
Next.jsReactинструментыпроизводительность

Похожая задача в вашем проекте?

Разберём вашу ситуацию и пришлём оценку по этапам — без обязательств и общих слов.

Обсудить задачу

Вопрос по статье
или по своему проекту

Отвечаем на заявки в течение одного рабочего дня. Если задача не наша — скажем прямо и подскажем, к кому обратиться.

Написать нам

Поля со звёздочкой обязательны для заполнения.