BackНазад к блогу

Next.js 15

Next.js 15 представляет поддержку React 19, улучшения кэширования, стабильную версию Turbopack для разработки, новые API и многое другое.

Next.js 15 официально стабилен и готов к использованию в продакшене. Этот релиз основан на обновлениях из RC1 и RC2. Мы сосредоточились на стабильности, добавив при этом несколько интересных обновлений, которые, как мы думаем, вам понравятся. Попробуйте Next.js 15 уже сегодня:

terminal
# Используйте новый автоматизированный CLI для обновления
npx @next/codemod@canary upgrade latest
 
# ...или обновите вручную
npm install next@latest react@rc react-dom@rc

Мы также рады рассказать больше о предстоящих изменениях на Next.js Conf в этот четверг, 24 октября.

Вот что нового в Next.js 15:

Плавные обновления с @next/codemod CLI

Мы включаем кодмоды (автоматизированные преобразования кода) в каждый крупный релиз Next.js, чтобы помочь автоматизировать обновление критических изменений.

Чтобы сделать обновления ещё более плавными, мы выпустили улучшенный CLI для кодмодов:

Terminal
npx @next/codemod@canary upgrade latest

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

Тег canary использует последнюю версию кодмода, тогда как latest указывает версию Next.js. Мы рекомендуем использовать canary-версию кодмода, даже если вы обновляетесь до последней версии Next.js, так как мы планируем продолжать улучшать инструмент на основе ваших отзывов.

Узнайте больше о Next.js codemod CLI.

Асинхронные API запросов (Критическое изменение)

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

Поэтому мы переводим API, которые зависят от данных, специфичных для запроса — такие как headers, cookies, params и searchParams — в асинхронный режим.

import { cookies } from 'next/headers';
 
export async function AdminPanel() {
  const cookieStore = await cookies();
  const token = cookieStore.get('token');
 
  // ...
}

Это критическое изменение, которое затрагивает следующие API:

  • cookies
  • headers
  • draftMode
  • params в layout.js, page.js, route.js, default.js, generateMetadata и generateViewport
  • searchParams в page.js

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

Terminal
npx @next/codemod@canary next-async-request-api .

В случаях, когда кодмод не может полностью перенести ваш код, прочитайте руководство по обновлению. Мы также предоставили пример миграции приложения Next.js на новые API.

Семантика кэширования

Next.js App Router запускался с определёнными настройками кэширования по умолчанию. Они были разработаны для предоставления наиболее производительного варианта по умолчанию с возможностью отказаться от него при необходимости.

На основе ваших отзывов мы пересмотрели наши эвристики кэширования и их взаимодействие с такими проектами, как Partial Prerendering (PPR), и с сторонними библиотеками, использующими fetch.

В Next.js 15 мы меняем настройки кэширования по умолчанию для GET Route Handlers и Client Router Cache с "кэшируется по умолчанию" на "не кэшируется по умолчанию". Если вы хотите сохранить предыдущее поведение, вы можете продолжить явно включать кэширование.

Мы продолжаем улучшать кэширование в Next.js в ближайшие месяцы и скоро поделимся дополнительными деталями.

GET Route Handlers больше не кэшируются по умолчанию

В Next.js 14 Route Handlers, использующие метод HTTP GET, кэшировались по умолчанию, если только они не использовали динамические функции или динамические опции конфигурации. В Next.js 15 GET функции не кэшируются по умолчанию.

Вы всё ещё можете включить кэширование, используя статическую опцию конфигурации маршрута, такую как export dynamic = 'force-static'.

Специальные Route Handlers, такие как sitemap.ts, opengraph-image.tsx, icon.tsx и другие файлы метаданных, остаются статическими по умолчанию, если они не используют динамические функции или динамические опции конфигурации.

Клиентский Router Cache больше не кэширует компоненты страниц по умолчанию

В Next.js 14.2.0 мы представили экспериментальный флаг staleTimes, позволяющий настраивать Router Cache.

В Next.js 15 этот флаг остаётся доступным, но мы меняем поведение по умолчанию, устанавливая staleTime равным 0 для сегментов страниц. Это означает, что при навигации по приложению клиент всегда будет отражать последние данные из компонентов страниц, которые становятся активными в ходе навигации. Однако некоторые важные поведения остаются неизменными:

  • Данные общих макетов не будут перезапрашиваться с сервера, чтобы продолжать поддерживать частичный рендеринг.
  • Навигация назад/вперёд всё ещё будет восстанавливаться из кэша, чтобы обеспечить восстановление позиции прокрутки браузером.
  • loading.js останется в кэше на 5 минут (или значение конфигурации staleTimes.static).

Вы можете включить предыдущее поведение Client Router Cache, установив следующую конфигурацию:

next.config.ts
const nextConfig = {
  experimental: {
    staleTimes: {
      dynamic: 30,
    },
  },
};
 
export default nextConfig;

React 19

В рамках релиза Next.js 15 мы приняли решение согласоваться с предстоящим релизом React 19.

В версии 15 App Router использует React 19 RC, а также мы добавили обратную совместимость с React 18 для Pages Router на основе отзывов сообщества. Если вы используете Pages Router, это позволяет вам обновиться до React 19, когда будете готовы.

Хотя React 19 всё ещё находится на стадии RC, наши обширные тестирования в реальных приложениях и тесная работа с командой React дали нам уверенность в его стабильности. Основные критические изменения были хорошо протестированы и не затронут существующих пользователей App Router. Поэтому мы решили выпустить Next.js 15 как стабильный сейчас, чтобы ваши проекты были полностью готовы к GA React 19.

Чтобы обеспечить максимально плавный переход, мы предоставили кодмоды и автоматизированные инструменты для упрощения процесса миграции.

Прочитайте руководство по обновлению Next.js 15, руководство по обновлению React 19 и посмотрите ключевой доклад React Conf, чтобы узнать больше.

Pages Router на React 18

Next.js 15 сохраняет обратную совместимость для Pages Router с React 18, позволяя пользователям продолжать использовать React 18, получая при этом улучшения Next.js 15.

После первого Release Candidate (RC1) мы сместили фокус, чтобы включить поддержку React 18 на основе отзывов сообщества. Эта гибкость позволяет вам использовать Next.js 15 с Pages Router на React 18, давая вам больший контроль над процессом обновления.

Примечание: Хотя возможно запускать Pages Router на React 18 и App Router на React 19 в одном приложении, мы не рекомендуем такую настройку. Это может привести к непредсказуемому поведению и несоответствиям типов, поскольку базовые API и логика рендеринга между двумя версиями могут не полностью совпадать.

React Compiler (Экспериментально)

React Compiler — это новый экспериментальный компилятор, созданный командой React в Meta. Компилятор глубоко понимает ваш код через семантику чистого JavaScript и Правила React, что позволяет ему добавлять автоматические оптимизации в ваш код. Компилятор уменьшает количество ручного мемоизирования, которое разработчики должны делать с помощью API, таких как useMemo и useCallback, — упрощая код, облегчая его поддержку и уменьшая количество ошибок.

В Next.js 15 мы добавили поддержку React Compiler. Узнайте больше о React Compiler и доступных опциях конфигурации Next.js.

Примечание: React Compiler в настоящее время доступен только как плагин Babel, что приведёт к более медленному времени разработки и сборки.

Улучшения обработки ошибок гидратации (Hydration error improvements)

Next.js 14.1 представил улучшения в сообщениях об ошибках и ошибках гидратации. Next.js 15 продолжает развивать эти улучшения, добавляя усовершенствованный вид ошибок гидратации. Теперь ошибки гидратации отображают исходный код ошибки с предложениями по её устранению.

Например, вот как выглядело сообщение об ошибке гидратации в Next.js 14.1:

Сообщение об ошибке гидратации в Next.js 14.1

В Next.js 15 это было улучшено до:

Улучшенное сообщение об ошибке гидратации в Next.js 15

Turbopack Dev

Мы рады сообщить, что next dev --turbo теперь стабилен и готов ускорить ваш процесс разработки. Мы использовали его для работы над vercel.com, nextjs.org, v0 и всеми нашими другими приложениями с отличными результатами.

Например, с vercel.com, большим приложением Next.js, мы наблюдали:

  • До 76,7% быстрее запуск локального сервера.
  • До 96,3% быстрее обновления кода с Fast Refresh.
  • До 45,8% быстрее компиляция начального маршрута без кэширования (Turbopack пока не поддерживает кэширование на диске).

Подробнее о Turbopack Dev вы можете узнать в нашем новом посте в блоге.

Индикатор статических маршрутов (Static Route Indicator)

Next.js теперь отображает индикатор статических маршрутов во время разработки, чтобы помочь вам определить, какие маршруты являются статическими или динамическими. Этот визуальный сигнал упрощает оптимизацию производительности, позволяя понять, как ваши страницы рендерятся.

Вы также можете использовать вывод команды next build для просмотра стратегии рендеринга всех маршрутов.

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

Узнайте больше об индикаторе статических маршрутов, который можно отключить.

Выполнение кода после ответа с unstable_after (Experimental)

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

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

after() — это новый экспериментальный API, который решает эту проблему, позволяя запланировать выполнение работы после завершения потоковой передачи ответа, что позволяет выполнять вторичные задачи без блокировки основного ответа.

Чтобы использовать его, добавьте experimental.after в next.config.js:

next.config.ts
const nextConfig = {
  experimental: {
    after: true,
  },
};
 
export default nextConfig;

Затем импортируйте функцию в Server Components, Server Actions, Route Handlers или Middleware.

import { unstable_after as after } from 'next/server';
import { log } from '@/app/utils';
 
export default function Layout({ children }) {
  // Вторичная задача
  after(() => {
    log();
  });
 
  // Основная задача
  return <>{children}</>;
}

Узнайте больше о unstable_after.

instrumentation.js (Stable)

Файл instrumentation с API register() позволяет пользователям подключаться к жизненному циклу сервера Next.js для мониторинга производительности, отслеживания источников ошибок и глубокой интеграции с библиотеками наблюдаемости, такими как OpenTelemetry.

Эта функция теперь стабильна, и опцию конфигурации experimental.instrumentationHook можно удалить.

Кроме того, мы сотрудничали с Sentry для разработки нового хука onRequestError, который можно использовать для:

  • Сбора важного контекста обо всех ошибках, возникающих на сервере, включая:
    • Роутер: Pages Router или App Router
    • Контекст сервера: Server Component, Server Action, Route Handler или Middleware
  • Отправки ошибок в ваш любимый сервис наблюдаемости.
export async function onRequestError(err, request, context) {
  await fetch('https://...', {
    method: 'POST',
    body: JSON.stringify({ message: err.message, request, context }),
    headers: { 'Content-Type': 'application/json' },
  });
}
 
export async function register() {
  // инициализация SDK вашего любимого сервиса наблюдаемости
}

Узнайте больше о функции onRequestError.

Компонент <Form>

Новый компонент <Form> расширяет HTML-элемент <form> с возможностями префетчинга (prefetching), клиентской навигации (client-side navigation) и прогрессивного улучшения.

Он полезен для форм, которые ведут на новую страницу, например, формы поиска, которая ведёт на страницу результатов.

app/page.jsx
import Form from 'next/form';
 
export default function Page() {
  return (
    <Form action="/search">
      <input name="query" />
      <button type="submit">Submit</button>
    </Form>
  );
}

Компонент <Form> включает:

  • Префетчинг: Когда форма находится в поле зрения, layout и loading UI предварительно загружаются, что ускоряет навигацию.
  • Клиентская навигация: При отправке формы общие лейауты и клиентское состояние сохраняются.
  • Прогрессивное улучшение: Если JavaScript ещё не загрузился, форма всё равно работает через полную перезагрузку страницы.

Раньше для реализации этих возможностей требовалось много ручного кода. Например:

Пример

// Примечание: Код сокращён для демонстрации.
// Не рекомендуется для использования в продакшн-коде.
 
'use client'
 
import { useEffect } from 'react'
import { useRouter } from 'next/navigation'
 
export default function Form(props) {
  const action = props.action
  const router = useRouter()
 
  useEffect(() => {
    // если цель формы — URL, предзагружаем его
    if (typeof action === 'string') {
      router.prefetch(action)
    }
  }, [action, router])
 
  function onSubmit(event) {
    event.preventDefault()
 
    // собираем все поля формы и вызываем `router.push` с данными в URL
    const formData = new FormData(event.currentTarget)
    const data = new URLSearchParams()
 
    for (const [name, value] of formData) {
      data.append(name, value as string)
    }
 
    router.push(`${action}?${data.toString()}`)
  }
 
  if (typeof action === 'string') {
    return <form onSubmit={onSubmit} {...props} />
  }
 
  return <form {...props} />
}

Узнайте больше о компоненте <Form>.

Поддержка next.config.ts

Next.js теперь поддерживает файлы TypeScript next.config.ts и предоставляет тип NextConfig для автодополнения и типобезопасных опций:

next.config.ts
import type { NextConfig } from 'next';
 
const nextConfig: NextConfig = {
  /* опции конфигурации здесь */
};
 
export default nextConfig;

Узнайте больше о поддержке TypeScript в Next.js.

Улучшения для самостоятельного хостинга

При самостоятельном хостинге приложений вам может потребоваться больше контроля над директивами Cache-Control.

Один из распространённых случаев — управление периодом stale-while-revalidate для страниц ISR. Мы реализовали два улучшения:

  1. Теперь вы можете настроить значение expireTime в next.config. Ранее это была опция experimental.swrDelta.
  2. Обновлено значение по умолчанию до одного года, что гарантирует, что большинство CDN смогут полностью применять семантику stale-while-revalidate как задумано.

Мы также больше не переопределяем пользовательские значения Cache-Control значениями по умолчанию, что обеспечивает полный контроль и совместимость с любой настройкой CDN.

Наконец, мы улучшили оптимизацию изображений при самостоятельном хостинге. Ранее мы рекомендовали устанавливать sharp для оптимизации изображений на вашем сервере Next.js. Эта рекомендация иногда пропускалась. В Next.js 15 вам больше не нужно вручную устанавливать sharp — Next.js будет автоматически использовать sharp при использовании next start или запуске в режиме standalone output.

Чтобы узнать больше, ознакомьтесь с нашим новым демо и обучающим видео по самостоятельному хостингу Next.js.

Улучшенная безопасность Server Actions

Server Actions — это серверные функции, которые можно вызывать с клиента. Они определяются добавлением директивы 'use server' в начале файла и экспортом асинхронной функции.

Даже если Server Action или вспомогательная функция не импортируется в других частях вашего кода, она всё равно остаётся общедоступной HTTP-точкой. Хотя такое поведение технически корректно, оно может привести к непреднамеренному раскрытию таких функций.

Для повышения безопасности мы внедрили следующие улучшения:

  • Устранение мёртвого кода: Неиспользуемые Server Actions не будут иметь свои ID раскрыты в клиентском JavaScript-бандле, что уменьшает размер бандла и улучшает производительность.
  • Безопасные ID действий: Next.js теперь создаёт непредсказуемые, недетерминированные ID, чтобы клиент мог ссылаться и вызывать Server Action. Эти ID периодически пересчитываются между сборками для повышения безопасности.
// app/actions.js
'use server';
 
// Это действие **используется** в нашем приложении, поэтому Next.js
// создаст безопасный ID, чтобы клиент мог ссылаться
// и вызывать Server Action.
export async function updateUserAction(formData) {}
 
// Это действие **не используется** в нашем приложении, поэтому Next.js
// автоматически удалит этот код во время `next build`
// и не создаст публичную точку входа.
export async function deleteUserAction(formData) {}

Всё равно следует рассматривать Server Actions как публичные HTTP-точки. Узнайте больше о защите Server Actions.

Оптимизация бандлинга внешних пакетов (Stable)

Бандлинг внешних пакетов может улучшить производительность холодного старта вашего приложения. В App Router внешние пакеты бандлятся по умолчанию, и вы можете исключить определённые пакеты, используя новую опцию конфигурации serverExternalPackages.

В Pages Router внешние пакеты по умолчанию не бандлятся, но вы можете указать список пакетов для бандлинга, используя существующую опцию transpilePackages. С этой опцией конфигурации вам нужно указывать каждый пакет вручную.

Чтобы унифицировать конфигурацию между App и Pages Router, мы представляем новую опцию bundlePagesRouterDependencies, чтобы соответствовать автоматическому бандлингу по умолчанию в App Router. Затем вы можете использовать serverExternalPackages для исключения определённых пакетов, если это необходимо.

next.config.ts
const nextConfig = {
  // Автоматически бандлить внешние пакеты в Pages Router:
  bundlePagesRouterDependencies: true,
  // Исключить определённые пакеты из бандлинга для App и Pages Router:
  serverExternalPackages: ['package-name'],
};
 
export default nextConfig;

Узнайте больше об оптимизации внешних пакетов.

Поддержка ESLint 9

Next.js 15 также представляет поддержку ESLint 9, после окончания поддержки ESLint 8 5 октября 2024 года.

Чтобы обеспечить плавный переход, Next.js остаётся обратно совместимым, что означает, что вы можете продолжать использовать ESLint 8 или 9.

Если вы обновитесь до ESLint 9, и мы обнаружим, что вы ещё не перешли на новый формат конфигурации, Next.js автоматически применит escape-хатч ESLINT_USE_FLAT_CONFIG=false для облегчения миграции.

Кроме того, устаревшие опции, такие как —ext и —ignore-path, будут удалены при запуске next lint. Обратите внимание, что ESLint в конечном итоге запретит эти старые конфигурации в ESLint 10, поэтому мы рекомендуем начать миграцию как можно скорее.

Для получения дополнительной информации об этих изменениях ознакомьтесь с руководством по миграции.

В рамках этого обновления мы также обновили eslint-plugin-react-hooks до версии v5.0.0, которая вводит новые правила использования React Hooks. Вы можете ознакомиться со всеми изменениями в списке изменений для [email protected].

Улучшения разработки и сборки

HMR для Server Components

Во время разработки Server Components перевыполняются при сохранении. Это означает, что любые fetch-запросы к вашим API-эндпоинтам или сторонним сервисам также вызываются.

Чтобы улучшить производительность локальной разработки и снизить потенциальные затраты на платные API-вызовы, мы теперь гарантируем, что Hot Module Replacement (HMR) может повторно использовать ответы fetch из предыдущих рендеров.

Узнайте больше о кэше HMR для Server Components.

Ускоренная статическая генерация для App Router

Мы оптимизировали процесс статической генерации для ускорения сборки, особенно для страниц с медленными сетевыми запросами.

Ранее наш процесс статической оптимизации рендерил страницы дважды — сначала для генерации данных для клиентской навигации, а затем для рендеринга HTML при первом посещении страницы. Теперь мы повторно используем первый рендер, исключая второй проход, что снижает нагрузку и ускоряет сборку.

Кроме того, воркеры статической генерации теперь используют общий кеш fetch между страницами. Если вызов fetch не отказывается от кеширования, его результаты будут повторно использованы другими страницами, обрабатываемыми тем же воркером. Это уменьшает количество запросов для одних и тех же данных.

Расширенный контроль статической генерации (Экспериментально)

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

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

next.config.ts
const nextConfig = {
  experimental: {
    // сколько раз Next.js будет повторять попытки генерации страниц при ошибках
    // перед завершением сборки с ошибкой
    staticGenerationRetryCount: 1
    // сколько страниц будет обрабатываться одним воркером
    staticGenerationMaxConcurrency: 8
    // минимальное количество страниц перед созданием нового воркера экспорта
    staticGenerationMinPagesPerWorker: 25
  },
}
 
export default nextConfig;

Подробнее о настройках статической генерации.

Другие изменения

  • [Критическое] next/image: Удалена зависимость squoosh в пользу sharp как опциональной (PR)
  • [Критическое] next/image: Изменено значение по умолчанию Content-Disposition на attachment (PR)
  • [Критическое] next/image: Ошибка при наличии пробелов в начале или конце src (PR)
  • [Критическое] Middleware: Применено условие react-server для ограничения нерекомендуемых импортов React API (PR)
  • [Критическое] next/font: Удалена поддержка внешнего пакета @next/font (PR)
  • [Критическое] next/font: Удалено хеширование font-family (PR)
  • [Критическое] Кеширование: force-dynamic теперь устанавливает значение no-store по умолчанию для кеша fetch (PR)
  • [Критическое] Конфигурация: Включены по умолчанию swcMinify (PR), missingSuspenseWithCSRBailout (PR) и outputFileTracing (PR), удалены устаревшие опции
  • [Критическое] Удалена автоинструментация для Speed Insights (теперь необходимо использовать пакет @vercel/speed-insights) (PR)
  • [Критическое] Удалено расширение .xml для динамических маршрутов sitemap и выравнивание URL sitemap между разработкой и продакшеном (PR)
  • [Критическое] Экспорт export const runtime = "experimental-edge" в App Router объявлен устаревшим. Теперь следует использовать export const runtime = "edge". Добавлен кодмод для автоматического перехода (PR)
  • [Критическое] Вызов revalidateTag и revalidatePath во время рендеринга теперь вызывает ошибку (PR)
  • [Критическое] Файлы instrumentation.js и middleware.js теперь используют вендорные пакеты React (PR)
  • [Критическое] Минимальная требуемая версия Node.js обновлена до 18.18.0 (PR)
  • [Критическое] next/dynamic: удалено устаревшее свойство suspense, и при использовании компонента в App Router больше не вставляется пустая граница Suspense (PR)
  • [Критическое] При разрешении модулей в Edge Runtime условие worker больше не применяется (PR)
  • [Критическое] Запрещено использование ssr: false с next/dynamic в Server Components (PR)
  • [Улучшение] Метаданные: Обновлены fallback-значения переменных окружения для metadataBase при размещении на Vercel (PR)
  • [Улучшение] Исправлено tree-shaking при смешанных импортах namespace и named из optimizePackageImports (PR)
  • [Улучшение] Parallel Routes: Catch-all маршруты теперь получают все известные параметры (PR)
  • [Улучшение] Настройка bundlePagesExternals стала стабильной и переименована в bundlePagesRouterDependencies
  • [Улучшение] Настройка serverComponentsExternalPackages стала стабильной и переименована в serverExternalPackages
  • [Улучшение] create-next-app: Новые проекты теперь игнорируют все файлы .env по умолчанию (PR)
  • [Улучшение] outputFileTracingRoot, outputFileTracingIncludes и outputFileTracingExcludes переведены из экспериментальных в стабильные (PR)
  • [Улучшение] Исключено слияние глобальных CSS-файлов с CSS-модулями глубже в дереве (PR)
  • [Улучшение] Обработчик кеша теперь можно указать через переменную окружения NEXT_CACHE_HANDLER_PATH (PR)
  • [Улучшение] Pages Router теперь поддерживает React 18 и React 19 (PR)
  • [Улучшение] В Error Overlay добавлена кнопка для копирования URL Node.js Inspector, если инспектор включен (PR)
  • [Улучшение] Клиентские префетчи в App Router теперь используют атрибут priority (PR)
  • [Улучшение] Next.js теперь предоставляет функцию unstable_rethrow для повторного выброса внутренних ошибок в App Router (PR)
  • [Улучшение] unstable_after теперь можно использовать в статических страницах (PR)
  • [Улучшение] Если компонент next/dynamic используется во время SSR, его чанк будет префетчен (PR)
  • [Улучшение] Опция esmExternals теперь поддерживается в App Router (PR)
  • [Улучшение] Опция experimental.allowDevelopmentBuild позволяет использовать NODE_ENV=development с next build для отладки (PR)
  • [Улучшение] Трансформы Server Action теперь отключены в Pages Router (PR)
  • [Улучшение] Воркеры сборки теперь предотвращают зависание сборки при завершении работы (PR)
  • [Улучшение] При редиректе из Server Action ревалидации теперь применяются корректно (PR)
  • [Улучшение] Динамические параметры теперь корректно обрабатываются для parallel routes в Edge Runtime (PR)
  • [Улучшение] Статические страницы теперь учитывают staleTime после первоначальной загрузки (PR)
  • [Улучшение] vercel/og обновлен с исправлением утечки памяти (PR)
  • [Улучшение] Обновлены временные метки для совместимости с пакетами типа msw для мокирования API (PR)
  • [Улучшение] Предварительно сгенерированные страницы теперь используют статический staleTime (PR)

Подробнее см. в руководстве по обновлению.

Участники

Next.js — результат совместной работы более 3000 разработчиков, индустриальных партнеров, таких как Google и Meta, и нашей основной команды в Vercel. Этот релиз стал возможен благодаря:

Отдельная благодарность @AbhiShake1, @Aerilym, @AhmedBaset, @AnaTofuZ, @Arindam200, @Arinji2, @ArnaudFavier, @ArnoldVanN, @Auxdible, @B33fb0n3, @Bhavya031, @Bjornnyborg, @BunsDev, @CannonLock, @CrutchTheClutch, @DeepakBalaraman, @DerTimonius, @Develliot, @EffectDoplera, @Ehren12, @Ethan-Arrowood, @FluxCapacitor2, @ForsakenHarmony, @Francoscopic, @Gomah, @GyoHeon, @Hemanshu-Upadhyay, @HristovCodes, @HughHzyb, @IAmKushagraSharma, @IDNK2203, @IGassmann, @ImDR, @IncognitoTGT, @Jaaneek, @JamBalaya56562, @Jeffrey-Zutt, @JohnGemstone, @JoshuaKGoldberg, @Julian-Louis, @Juneezee, @KagamiChan, @Kahitar, @KeisukeNagakawa, @KentoMoriwaki, @Kikobeats, @KonkenBonken, @Kuboczoch, @Lada496, @LichuAcu, @LorisSigrist, @Lsnsh, @Luk-z, @Luluno01, @M-YasirGhaffar, @Maaz-Ahmed007, @Manoj-M-S, @ManuLpz4, @Marukome0743, @MaxLeiter, @MehfoozurRehman, @MildTomato, @MonstraG, @N2D4, @NavidNourani, @Nayeem-XTREME, @Netail, @NilsJacobsen, @Ocheretovich, @OlyaPolya, @PapatMayuri, @PaulAsjes, @PlagueFPS, @ProchaLu, @Pyr33x, @QiuranHu, @RiskyMH, @Sam-Phillemon9493, @Sayakie, @Shruthireddy04, @SouthLink, @Strift, @SukkaW, @Teddir, @Tim-Zj, @TrevorSayre, @Unsleeping, @Willem-Jaap, @a89529294, @abdull-haseeb, @abhi12299, @acdlite, @actopas, @adcichowski, @adiguno, @agadzik, @ah100101, @akazwz, @aktoriukas, @aldosch, @alessiomaffeis, @allanchau, @alpedia0, @amannn, @amikofalvy, @anatoliik-lyft, @anay-208, @andrii-bodnar, @anku255, @ankur-dwivedi, @aralroca, @archanaagivale30, @arlyon, @atik-persei, @avdeev, @baeharam, @balazsorban44, @bangseongbeom, @begalinsaf, @bennettdams, @bewinsnw, @bgw, @blvdmitry, @bobaaaaa, @boris-szl, @bosconian-dynamics, @brekk, @brianshano, @cfrank, @chandanpasunoori, @chentsulin, @chogyejin, @chrisjstott, @christian-bromann, @codeSTACKr, @coderfin, @coltonehrman, @controversial, @coopbri, @creativoma, @crebelskydico, @crutchcorn, @darthmaim, @datner, @davidsa03, @delbaoliveira, @devjiwonchoi, @devnyxie, @dhruv-kaushik, @dineshh-m, @diogocapela, @dnhn, @domdomegg, @domin-mnd, @dvoytenko, @ebCrypto, @ekremkenter, @emmerich, @flybayer, @floriangosse, @forsakenharmony, @francoscopic, @frys, @gabrielrolfsen, @gaojude, @gdborton, @greatvivek11, @gnoff, @guisehn, @GyoHeon, @hamirmahal, @hiro0218, @hirotomoyamada, @housseindjirdeh, @hungdoansy, @huozhi, @hwangstar156, @iampoul, @ianmacartney, @icyJoseph, @ijjk, @imddc, @imranolas, @iscekic, @jantimon, @jaredhan418, @jeanmax1me, @jericopulvera, @jjm2317, @jlbovenzo, @joelhooks, @joeshub, @jonathan-ingram, @jonluca, @jontewks, @joostmeijles, @jophy-ye, @jordienr, @jordyfontoura, @kahlstrm, @karlhorky, @karlkeefer, @kartheesan05, @kdy1, @kenji-webdev, @kevva, @khawajaJunaid, @kidonng, @kiner-tang, @kippmr, @kjac, @kjugi, @kshehadeh, @kutsan, @kwonoj, @kxlow, @leerob, @lforst, @li-jia-nan, @liby, @lonr, @lorensr, @lovell, @lubieowoce, @luciancah, @luismiramirez, @lukahartwig, @lumirlumir, @luojiyin1987, @mamuso, @manovotny, @marlier, @mauroaccornero, @maxhaomh, @mayank1513, @mcnaveen, @md-rejoyan-islam, @mehmetozguldev, @mert-duzgun, @mirasayon, @mischnic, @mknichel, @mobeigi, @molebox, @mratlamwala, @mud-ali, @n-ii-ma, @n1ckoates, @nattui, @nauvalazhar, @neila-a, @neoFinch, @niketchandivade, @nisabmohd, @none23, @notomo, @notrab, @nsams, @nurullah, @okoyecharles, @omahs, @paarthmadan, @pathliving, @pavelglac, @penicillin0, @phryneas, @pkiv, @pnutmath, @qqww08, @r34son, @raeyoung-kim, @remcohaszing, @remorses, @rezamauliadi, @rishabhpoddar, @ronanru, @royalfig, @rubyisrust, @ryan-nauman, @ryohidaka, @ryota-murakami, @s-ekai, @saltcod, @samcx, @samijaber, @sean-rallycry, @sebmarkbage, @shubh73, @shuding, @sirTangale, @sleevezip, @slimbde, @soedirgo, @sokra, @sommeeeer, @sopranopillow, @souporserious, @srkirkland, @steadily-worked, @steveluscher, @stipsan, @styfle, @stylessh, @syi0808, @symant233, @tariknh, @theoludwig, @timfish, @timfuhrmann, @timneutkens, @tknickman, @todor0v, @tokkiyaa, @torresgol10, @tranvanhieu01012002, @txxxxc, @typeofweb, @unflxw, @unstubbable, @versecafe, @vicb, @vkryachko, @wbinnssmith, @webtinax, @weicheng95, @wesbos, @whatisagi, @wiesson, @woutvanderploeg, @wyattjoh, @xiaohanyu, @xixixao, @xugetsu, @yosefbeder, @ypessoa, @ytori, @yunsii, @yurivangeffen, @z0n, @zce, @zhawtof, @zsh77, и @ztanner за помощь!