Версия 11
Для обновления до версии 11 выполните следующую команду:
npm i next@11 react@17 react-dom@17
yarn add next@11 react@17 react-dom@17
pnpm up next@11 react@17 react-dom@17
bun add next@11 react@17 react-dom@17
Полезно знать: Если вы используете TypeScript, убедитесь, что вы также обновили
@types/react
и@types/react-dom
до соответствующих версий.
Webpack 5
Webpack 5 теперь используется по умолчанию для всех приложений Next.js. Если у вас не было пользовательской конфигурации webpack, ваше приложение уже использует webpack 5. Если у вас есть пользовательская конфигурация webpack, вы можете обратиться к документации Next.js по webpack 5 для получения инструкций по обновлению.
Очистка distDir
теперь включена по умолчанию
Директория с результатами сборки (по умолчанию .next
) теперь очищается автоматически, за исключением кешей Next.js. Подробнее можно узнать в RFC по очистке distDir
.
Если ваше приложение полагалось на предыдущее поведение, вы можете отключить новое поведение, добавив флаг cleanDistDir: false
в next.config.js
.
Поддержка переменной окружения PORT
для next dev
и next start
Next.js 11 поддерживает переменную окружения PORT
для установки порта, на котором запускается приложение. Использование -p
/--port
по-прежнему рекомендуется, но если у вас были ограничения на использование -p
, теперь вы можете использовать PORT
в качестве альтернативы:
Пример:
PORT=4000 next start
Настройка next.config.js
для импорта изображений
Next.js 11 поддерживает статический импорт изображений с помощью next/image
. Эта новая функция требует возможности обработки импортов изображений. Если вы ранее добавляли пакеты next-images
или next-optimized-images
, вы можете либо перейти на встроенную поддержку с помощью next/image
, либо отключить эту функцию:
module.exports = {
images: {
disableStaticImages: true,
},
}
Удаление super.componentDidCatch()
из pages/_app.js
Метод componentDidCatch
компонента next/app
был объявлен устаревшим в Next.js 9, так как он больше не нужен, и с тех пор не выполнял никаких действий. В Next.js 11 он был удалён.
Если ваш pages/_app.js
содержит пользовательский метод componentDidCatch
, вы можете удалить super.componentDidCatch
, так как он больше не требуется.
Удаление Container
из pages/_app.js
Этот экспорт был объявлен устаревшим в Next.js 9, так как он больше не нужен, и с тех пор не выполнял никаких действий, выводя предупреждение во время разработки. В Next.js 11 он был удалён.
Если ваш pages/_app.js
импортирует Container
из next/app
, вы можете удалить Container
, так как он был удалён. Подробнее в документации.
Удаление использования props.url
в компонентах страниц
Это свойство было объявлено устаревшим в Next.js 4 и с тех пор выводило предупреждение во время разработки. С появлением getStaticProps
/ getServerSideProps
эти методы уже запрещали использование props.url
. В Next.js 11 это свойство было полностью удалено.
Подробнее в документации.
Удаление свойства unsized
в next/image
Свойство unsized
в next/image
было объявлено устаревшим в Next.js 10.0.1. Вместо него можно использовать layout="fill"
. В Next.js 11 unsized
был удалён.
Удаление свойства modules
в next/dynamic
Свойства modules
и render
для next/dynamic
были объявлены устаревшими в Next.js 9.5. Это было сделано для того, чтобы API next/dynamic
стал ближе к React.lazy
. В Next.js 11 свойства modules
и render
были удалены.
Эти свойства не упоминались в документации начиная с Next.js 8, поэтому маловероятно, что ваше приложение их использует.
Если ваше приложение использует modules
и render
, обратитесь к документации.
Удаление Head.rewind
Head.rewind
не выполнял никаких действий начиная с Next.js 9.5, в Next.js 11 он был удалён. Вы можете безопасно удалить все использования Head.rewind
.
Локали Moment.js исключены по умолчанию
Moment.js включает переводы для многих локалей по умолчанию. Next.js теперь автоматически исключает эти локали для оптимизации размера сборки приложений, использующих Moment.js.
Для загрузки конкретной локали используйте следующий код:
import moment from 'moment'
import 'moment/locale/ja'
moment.locale('ja')
Вы можете отключить это новое поведение, добавив excludeDefaultMomentLocales: false
в next.config.js
, если не хотите использовать новую оптимизацию. Однако настоятельно рекомендуется не отключать её, так как она значительно уменьшает размер Moment.js.
Обновление использования router.events
Если вы обращаетесь к router.events
во время рендеринга, в Next.js 11 router.events
больше не предоставляется во время предварительного рендеринга. Убедитесь, что вы обращаетесь к router.events
в useEffect
:
useEffect(() => {
const handleRouteChange = (url, { shallow }) => {
console.log(
`App is changing to ${url} ${
shallow ? 'with' : 'without'
} shallow routing`
)
}
router.events.on('routeChangeStart', handleRouteChange)
// Если компонент размонтируется, отпишитесь
// от события с помощью метода 'off':
return () => {
router.events.off('routeChangeStart', handleRouteChange)
}
}, [router])
Если ваше приложение использует router.router.events
, который был внутренним свойством и не являлся публичным, убедитесь, что вы используете router.events
.
Переход с React 16 на 17
React 17 представил новое JSX-преобразование, которое привнесло давнюю функцию Next.js в экосистему React: отсутствие необходимости в import React from 'react'
при использовании JSX. При использовании React 17 Next.js автоматически применяет новое преобразование. Это преобразование не делает переменную React
глобальной, что было непреднамеренным побочным эффектом предыдущей реализации Next.js. Доступен кодмод для автоматического исправления случаев, когда вы случайно использовали React
без импорта.
Большинство приложений уже используют последнюю версию React. В Next.js 11 минимальная версия React была обновлена до 17.0.2.
Для обновления выполните следующую команду:
npm install react@latest react-dom@latest
Или с помощью yarn
:
yarn add react@latest react-dom@latest