diff --git a/src/content/blog/2024/04/25/react-19-upgrade-guide.md b/src/content/blog/2024/04/25/react-19-upgrade-guide.md index cb83a61764..55947639e8 100644 --- a/src/content/blog/2024/04/25/react-19-upgrade-guide.md +++ b/src/content/blog/2024/04/25/react-19-upgrade-guide.md @@ -2,139 +2,139 @@ title: "React 19 Upgrade Guide" author: Ricky Hanlon date: 2024/04/25 -description: The improvements added to React 19 require some breaking changes, but we've worked to make the upgrade as smooth as possible and we don't expect the changes to impact most apps. In this post, we will guide you through the steps for upgrading apps and libraries to React 19. +description: Улучшения, добавленные в React 19, требуют некоторых критических изменений, но мы постарались сделать обновление максимально плавным и не ожидаем, что эти изменения затронут большинство приложений. В этой статье мы проведем вас через шаги по обновлению приложений и библиотек до React 19. --- -April 25, 2024 by [Ricky Hanlon](https://twitter.com/rickhanlonii) +25 апреля 2024 г. от [Ricky Hanlon](https://twitter.com/rickhanlonii) --- -The improvements added to React 19 require some breaking changes, but we've worked to make the upgrade as smooth as possible, and we don't expect the changes to impact most apps. +Улучшения, добавленные в React 19, требуют некоторых изменений, нарушающих обратную совместимость, но мы постарались сделать обновление максимально плавным, и не ожидаем, что эти изменения повлияют на большинство приложений. -#### React 18.3 has also been published {/*react-18-3*/} +#### Также опубликован React 18.3 {/*react-18-3*/} -To help make the upgrade to React 19 easier, we've published a `react@18.3` release that is identical to 18.2 but adds warnings for deprecated APIs and other changes that are needed for React 19. +Чтобы облегчить переход на React 19, мы опубликовали релиз `react@18.3`, который идентичен 18.2, но добавляет предупреждения об устаревших API и других изменениях, необходимых для React 19. -We recommend upgrading to React 18.3 first to help identify any issues before upgrading to React 19. +Мы рекомендуем сначала обновиться до React 18.3, чтобы выявить возможные проблемы перед обновлением до React 19. -For a list of changes in 18.3 see the [Release Notes](https://github.com/facebook/react/blob/main/CHANGELOG.md#1830-april-25-2024). +Список изменений в 18.3 см. в [Заметках к релизу](https://github.com/facebook/react/blob/main/CHANGELOG.md#1830-april-25-2024). -In this post, we will guide you through the steps for upgrading to React 19: +В этой статье мы проведем вас через шаги по обновлению до React 19: -- [Installing](#installing) +- [Установка](#installing) - [Codemods](#codemods) -- [Breaking changes](#breaking-changes) -- [New deprecations](#new-deprecations) -- [Notable changes](#notable-changes) -- [TypeScript changes](#typescript-changes) +- [Изменения, нарушающие обратную совместимость](#breaking-changes) +- [Новые устаревшие функции](#new-deprecations) +- [Заметные изменения](#notable-changes) +- [Изменения TypeScript](#typescript-changes) - [Changelog](#changelog) -If you'd like to help us test React 19, follow the steps in this upgrade guide and [report any issues](https://github.com/facebook/react/issues/new?assignees=&labels=React+19&projects=&template=19.md&title=%5BReact+19%5D) you encounter. For a list of new features added to React 19, see the [React 19 release post](/blog/2024/12/05/react-19). +Если вы хотите помочь нам протестировать React 19, следуйте инструкциям в этом руководстве по обновлению и [сообщайте о любых проблемах](https://github.com/facebook/react/issues/new?assignees=&labels=React+19&projects=&template=19.md&title=%5BReact+19%5D), с которыми вы столкнетесь. Список новых функций, добавленных в React 19, см. в [посте о релизе React 19](/blog/2024/12/05/react-19). --- -## Installing {/*installing*/} +## Установка {/*installing*/} -#### New JSX Transform is now required {/*new-jsx-transform-is-now-required*/} +#### Новый JSX-трансформатор теперь обязателен {/*new-jsx-transform-is-now-required*/} -We introduced a [new JSX transform](https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html) in 2020 to improve bundle size and use JSX without importing React. In React 19, we're adding additional improvements like using ref as a prop and JSX speed improvements that require the new transform. +Мы представили [новый JSX-трансформатор](https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html) в 2020 году для улучшения размера сборки и использования JSX без импорта React. В React 19 мы добавляем дополнительные улучшения, такие как использование `ref` в качестве пропса и улучшения скорости JSX, которые требуют нового трансформатора. -If the new transform is not enabled, you will see this warning: +Если новый трансформатор не включен, вы увидите это предупреждение: -Your app (or one of its dependencies) is using an outdated JSX transform. Update to the modern JSX transform for faster performance: https://react.dev/link/new-jsx-transform +Ваше приложение (или одна из его зависимостей) использует устаревший JSX-трансформатор. Обновитесь до современного JSX-трансформатора для повышения производительности: https://react.dev/link/new-jsx-transform -We expect most apps will not be affected since the transform is enabled in most environments already. For manual instructions on how to upgrade, please see the [announcement post](https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html). +Мы ожидаем, что большинство приложений не пострадают, так как трансформатор уже включен в большинстве сред. Инструкции по обновлению вручную см. в [анонсе](https://legacy.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html). -To install the latest version of React and React DOM: +Чтобы установить последнюю версию React и React DOM: ```bash npm install --save-exact react@^19.0.0 react-dom@^19.0.0 ``` -Or, if you're using Yarn: +Или, если вы используете Yarn: ```bash yarn add --exact react@^19.0.0 react-dom@^19.0.0 ``` -If you're using TypeScript, you also need to update the types. +Если вы используете TypeScript, вам также необходимо обновить типы. ```bash npm install --save-exact @types/react@^19.0.0 @types/react-dom@^19.0.0 ``` -Or, if you're using Yarn: +Или, если вы используете Yarn: ```bash yarn add --exact @types/react@^19.0.0 @types/react-dom@^19.0.0 ``` -We're also including a codemod for the most common replacements. See [TypeScript changes](#typescript-changes) below. +Мы также включаем codemod для наиболее распространенных замен. См. [Изменения TypeScript](#typescript-changes) ниже. ## Codemods {/*codemods*/} -To help with the upgrade, we've worked with the team at [codemod.com](https://codemod.com) to publish codemods that will automatically update your code to many of the new APIs and patterns in React 19. +Чтобы помочь с обновлением, мы сотрудничали с командой [codemod.com](https://codemod.com) для публикации codemods, которые автоматически обновят ваш код до многих новых API и паттернов в React 19. -All codemods are available in the [`react-codemod` repo](https://github.com/reactjs/react-codemod) and the Codemod team have joined in helping maintain the codemods. To run these codemods, we recommend using the `codemod` command instead of the `react-codemod` because it runs faster, handles more complex code migrations, and provides better support for TypeScript. +Все codemods доступны в репозитории [`react-codemod`](https://github.com/reactjs/react-codemod), и команда Codemod присоединилась к поддержке codemods. Для запуска этих codemods мы рекомендуем использовать команду `codemod` вместо `react-codemod`, поскольку она работает быстрее, обрабатывает более сложные миграции кода и обеспечивает лучшую поддержку TypeScript. -#### Run all React 19 codemods {/*run-all-react-19-codemods*/} +#### Запуск всех codemods React 19 {/*run-all-react-19-codemods*/} -Run all codemods listed in this guide with the React 19 `codemod` recipe: +Запустите все codemods, перечисленные в этом руководстве, с помощью рецепта `codemod` для React 19: ```bash npx codemod@latest react/19/migration-recipe ``` -This will run the following codemods from `react-codemod`: -- [`replace-reactdom-render`](https://github.com/reactjs/react-codemod?tab=readme-ov-file#replace-reactdom-render) +Это запустит следующие codemods из `react-codemod`: +- [`replace-reactdom-render`](https://github.com/reactjs/react-codemod?tab=readme-ov-file#replace-reactdom-render) - [`replace-string-ref`](https://github.com/reactjs/react-codemod?tab=readme-ov-file#replace-string-ref) - [`replace-act-import`](https://github.com/reactjs/react-codemod?tab=readme-ov-file#replace-act-import) -- [`replace-use-form-state`](https://github.com/reactjs/react-codemod?tab=readme-ov-file#replace-use-form-state) +- [`replace-use-form-state`](https://github.com/reactjs/react-codemod?tab=readme-ov-file#replace-use-form-state) - [`prop-types-typescript`](https://github.com/reactjs/react-codemod#react-proptypes-to-prop-types) -This does not include the TypeScript changes. See [TypeScript changes](#typescript-changes) below. +Это не включает изменения TypeScript. См. [Изменения TypeScript](#typescript-changes) ниже. -Changes that include a codemod include the command below. +Изменения, включающие codemod, сопровождаются командой ниже. -For a list of all available codemods, see the [`react-codemod` repo](https://github.com/reactjs/react-codemod). +Список всех доступных codemods см. в репозитории [`react-codemod`](https://github.com/reactjs/react-codemod). -## Breaking changes {/*breaking-changes*/} +## Изменения, нарушающие обратную совместимость {/*breaking-changes*/} -### Errors in render are not re-thrown {/*errors-in-render-are-not-re-thrown*/} +### Ошибки при рендеринге не перебрасываются {/*errors-in-render-are-not-re-thrown*/} -In previous versions of React, errors thrown during render were caught and rethrown. In DEV, we would also log to `console.error`, resulting in duplicate error logs. +В предыдущих версиях React ошибки, возникающие во время рендеринга, перехватывались и перебрасывались. В режиме разработки (DEV) мы также выводили сообщения в `console.error`, что приводило к дублированию логов ошибок. -In React 19, we've [improved how errors are handled](/blog/2024/04/25/react-19#error-handling) to reduce duplication by not re-throwing: +В React 19 мы [улучшили обработку ошибок](/blog/2024/04/25/react-19#error-handling), чтобы уменьшить дублирование, не перебрасывая их: -- **Uncaught Errors**: Errors that are not caught by an Error Boundary are reported to `window.reportError`. -- **Caught Errors**: Errors that are caught by an Error Boundary are reported to `console.error`. +- **Неперехваченные ошибки**: Ошибки, которые не были перехвачены Error Boundary, сообщаются в `window.reportError`. +- **Перехваченные ошибки**: Ошибки, которые были перехвачены Error Boundary, сообщаются в `console.error`. -This change should not impact most apps, but if your production error reporting relies on errors being re-thrown, you may need to update your error handling. To support this, we've added new methods to `createRoot` and `hydrateRoot` for custom error handling: +Это изменение не должно повлиять на большинство приложений, но если ваша система отчетности об ошибках в продакшене полагается на переброс ошибок, вам может потребоваться обновить обработку ошибок. Для поддержки этого мы добавили новые методы в `createRoot` и `hydrateRoot` для пользовательской обработки ошибок: ```js [[1, 2, "onUncaughtError"], [2, 5, "onCaughtError"]] const root = createRoot(container, { @@ -147,20 +147,20 @@ const root = createRoot(container, { }); ``` -For more info, see the docs for [`createRoot`](https://react.dev/reference/react-dom/client/createRoot) and [`hydrateRoot`](https://react.dev/reference/react-dom/client/hydrateRoot). +Дополнительную информацию см. в документации по [`createRoot`](https://react.dev/reference/react-dom/client/createRoot) и [`hydrateRoot`](https://react.dev/reference/react-dom/client/hydrateRoot). -### Removed deprecated React APIs {/*removed-deprecated-react-apis*/} +### Удалены устаревшие API React {/*removed-deprecated-react-apis*/} -#### Removed: `propTypes` and `defaultProps` for functions {/*removed-proptypes-and-defaultprops*/} -`PropTypes` were deprecated in [April 2017 (v15.5.0)](https://legacy.reactjs.org/blog/2017/04/07/react-v15.5.0.html#new-deprecation-warnings). +#### Удалено: `propTypes` и `defaultProps` для функций {/*removed-proptypes-and-defaultprops*/} +`PropTypes` были объявлены устаревшими в [апреле 2017 г. (v15.5.0)](https://legacy.reactjs.org/blog/2017/04/07/react-v15.5.0.html#new-deprecation-warnings). -In React 19, we're removing the `propType` checks from the React package, and using them will be silently ignored. If you're using `propTypes`, we recommend migrating to TypeScript or another type-checking solution. +В React 19 мы удаляем проверки `propTypes` из пакета React, и их использование будет молчаливо игнорироваться. Если вы используете `propTypes`, мы рекомендуем перейти на TypeScript или другое решение для проверки типов. -We're also removing `defaultProps` from function components in place of ES6 default parameters. Class components will continue to support `defaultProps` since there is no ES6 alternative. +Мы также удаляем `defaultProps` из функциональных компонентов в пользу параметров по умолчанию ES6. Классовые компоненты продолжат поддерживать `defaultProps`, поскольку для них нет альтернативы в ES6. ```js -// Before +// До import PropTypes from 'prop-types'; function Heading({text}) { @@ -174,7 +174,7 @@ Heading.defaultProps = { }; ``` ```ts -// After +// После interface Props { text?: string; } @@ -185,7 +185,7 @@ function Heading({text = 'Hello, world!'}: Props) { -Codemod `propTypes` to TypeScript with: +Codemod `propTypes` в TypeScript с помощью: ```bash npx codemod@latest react/prop-types-typescript @@ -193,16 +193,16 @@ npx codemod@latest react/prop-types-typescript -#### Removed: Legacy Context using `contextTypes` and `getChildContext` {/*removed-removing-legacy-context*/} +#### Удалено: Устаревший контекст с использованием `contextTypes` и `getChildContext` {/*removed-removing-legacy-context*/} -Legacy Context was deprecated in [October 2018 (v16.6.0)](https://legacy.reactjs.org/blog/2018/10/23/react-v-16-6.html). +Устаревший контекст был объявлен устаревшим в [октябре 2018 г. (v16.6.0)](https://legacy.reactjs.org/blog/2018/10/23/react-v-16-6.html). -Legacy Context was only available in class components using the APIs `contextTypes` and `getChildContext`, and was replaced with `contextType` due to subtle bugs that were easy to miss. In React 19, we're removing Legacy Context to make React slightly smaller and faster. +Устаревший контекст был доступен только в классовых компонентах с использованием API `contextTypes` и `getChildContext` и был заменен на `contextType` из-за тонких ошибок, которые было легко пропустить. В React 19 мы удаляем устаревший контекст, чтобы сделать React немного меньше и быстрее. -If you're still using Legacy Context in class components, you'll need to migrate to the new `contextType` API: +Если вы все еще используете устаревший контекст в классовых компонентах, вам нужно будет перейти на новый API `contextType`: ```js {5-11,19-21} -// Before +// До import PropTypes from 'prop-types'; class Parent extends React.Component { @@ -231,7 +231,7 @@ class Child extends React.Component { ``` ```js {2,7,9,15} -// After +// После const FooContext = React.createContext(); class Parent extends React.Component { @@ -253,15 +253,15 @@ class Child extends React.Component { } ``` -#### Removed: string refs {/*removed-string-refs*/} -String refs were deprecated in [March, 2018 (v16.3.0)](https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html). +#### Удалено: строковые рефы {/*removed-string-refs*/} +Строковые рефы были объявлены устаревшими в [марте 2018 г. (v16.3.0)](https://legacy.reactjs.org/blog/2018/03/27/update-on-async-rendering.html). -Class components supported string refs before being replaced by ref callbacks due to [multiple downsides](https://github.com/facebook/react/issues/1373). In React 19, we're removing string refs to make React simpler and easier to understand. +Классовые компоненты поддерживали строковые рефы до их замены на колбэки рефов из-за [множества недостатков](https://github.com/facebook/react/issues/1373). В React 19 мы удаляем строковые рефы, чтобы сделать React проще и понятнее. -If you're still using string refs in class components, you'll need to migrate to ref callbacks: +Если вы все еще используете строковые рефы в классовых компонентах, вам нужно будет перейти на колбэки рефов: ```js {4,8} -// Before +// До class MyComponent extends React.Component { componentDidMount() { this.refs.input.focus(); @@ -274,7 +274,7 @@ class MyComponent extends React.Component { ``` ```js {4,8} -// After +// После class MyComponent extends React.Component { componentDidMount() { this.input.focus(); @@ -288,7 +288,7 @@ class MyComponent extends React.Component { -Codemod string refs with `ref` callbacks: +Codemod строковых рефов в колбэки рефов: ```bash npx codemod@latest react/19/replace-string-ref @@ -296,45 +296,45 @@ npx codemod@latest react/19/replace-string-ref -#### Removed: Module pattern factories {/*removed-module-pattern-factories*/} -Module pattern factories were deprecated in [August 2019 (v16.9.0)](https://legacy.reactjs.org/blog/2019/08/08/react-v16.9.0.html#deprecating-module-pattern-factories). +#### Удалено: фабрики шаблонных модулей {/*removed-module-pattern-factories*/} +Фабрики шаблонных модулей были объявлены устаревшими в [августе 2019 г. (v16.9.0)](https://legacy.reactjs.org/blog/2019/08/08/react-v16.9.0.html#deprecating-module-pattern-factories). -This pattern was rarely used and supporting it causes React to be slightly larger and slower than necessary. In React 19, we're removing support for module pattern factories, and you'll need to migrate to regular functions: +Этот паттерн использовался редко, и его поддержка делает React немного больше и медленнее, чем необходимо. В React 19 мы удаляем поддержку фабрик шаблонных модулей, и вам нужно будет перейти на обычные функции: ```js -// Before +// До function FactoryComponent() { return { render() { return
; } } } ``` ```js -// After +// После function FactoryComponent() { return
; } ``` -#### Removed: `React.createFactory` {/*removed-createfactory*/} -`createFactory` was deprecated in [February 2020 (v16.13.0)](https://legacy.reactjs.org/blog/2020/02/26/react-v16.13.0.html#deprecating-createfactory). +#### Удалено: `React.createFactory` {/*removed-createfactory*/} +`createFactory` был объявлен устаревшим в [феврале 2020 г. (v16.13.0)](https://legacy.reactjs.org/blog/2020/02/26/react-v16.13.0.html#deprecating-createfactory). -Using `createFactory` was common before broad support for JSX, but it's rarely used today and can be replaced with JSX. In React 19, we're removing `createFactory` and you'll need to migrate to JSX: +Использование `createFactory` было обычным делом до широкой поддержки JSX, но сегодня оно используется редко и может быть заменено JSX. В React 19 мы удаляем `createFactory`, и вам нужно будет перейти на JSX: ```js -// Before +// До import { createFactory } from 'react'; const button = createFactory('button'); ``` ```js -// After +// После const button =