Подписывайтесь на нас
поиск в WeChat"отпечаток китайский«Официальный аккаунт предоставит вам самую свежую информацию о внешнем интерфейсе.
Извините, я снова здесь. После двух сообщений в блоге React 17 RC вышла официальная версия React 17. Официальная версия не сильно изменилась по сравнению с предыдущей версией, но это означает, что ее можно официально запустить в производство.
Сегодня мы объявляем об официальном выпуске React 17! До этого мы былиСообщение в блоге о React 17 RCПоследствия выпуска React 17 и внесенные изменения описаны в . Эта статья представляет собой краткое изложение этой статьи, если вы уже читали этот пост в блоге, вы можете пропустить этот.
нет новых функций
Выпуск React v17 необычен тем, что не добавляет никаких новых функций, ориентированных на разработчиков. но,Этот релиз упростит обновление самого React.
Стоит отметить, что React v17 служит «краеугольным камнем» последующих версий, что упрощает вложение разных версий React друг в друга.
Кроме того, React упростит встраивание приложений из других технологий.
инкрементное обновление
**React v17 открывает новую главу в инкрементальных обновлениях React. ** При обновлении с React 15 до 16 (или с 16 до 17) вы обычно обновляете все приложение за один раз, что хорошо работает для большинства приложений. Однако, если кодовая база была написана несколько лет назад и не поддерживается и не обновляется своевременно, это сделает обновление более дорогим. Кроме того, до React 17 использование разных версий React на одной странице (что можно сделать, но рискованно) будет вызывать проблемы с событиями с некоторым неизвестным риском.
Мы исправляем многие проблемы в React v17. это означает,Когда выйдет React 18 или будущие версии, у вас будет больше возможностей. Первый вариант, конечно, — обновить все приложение сразу, но у вас также есть возможность постепенно обновлять приложение. Например, вы можете обновить большую часть функциональности до React v18, но оставить некоторые лениво загружаемые диалоги или подмаршруты в React v17.
но это нене означаетВы должны делать пошаговые обновления.Одноразовое обновление по-прежнему является лучшим вариантом для большинства приложений.. Загрузка двух версий React по-прежнему не идеальна — даже если одна из версий загружается по запросу. Но это имеет большой смысл для тех больших приложений, которые не поддерживались в течение длительного времени, и React v17 начинает делать эти приложения не так легко устаревшими.
мы готовыпример репозитория, этот пример демонстрирует, как лениво загружать старые версии React, когда это необходимо. Этот пример создан с помощью приложения Create React, такого же эффекта можно добиться с помощью других инструментов. Друзья, которые используют другие инструменты, могут предоставить Демо в виде PR.
Уведомление
мыдобавить другие функцииОтложен до выпуска React v17. Цель этого выпуска — включить добавочные обновления. Если обновление до 17 затруднено, это противоречит цели этого выпуска.
Изменения в делегировании событий
Чтобы реализовать инкрементные обновления, нам нужно внести изменения в систему событий React. React 17 — важный выпуск из-за потенциально критических изменений в этом выпуске. Дополнительные сведения о версиях см.Версия FAQ, чтобы узнать о нашей приверженности стабильности версий.
В React v17 React больше не будет добавлять обработку событий вdocument
вместо этого добавьте обработку событий в корневой DOM-контейнер, который отображает дерево React:
const rootNode = document.getElementById('root');
ReactDOM.render(<App />, rootNode);
В React 16 и более ранних версиях React обрабатывал большинство событий.document.addEventListener()
работать. React v17 начнется с вызоваrootNode.addEventListener()
вместо.
Подтверждено, что с годами вissue устройство слеженияначальствоОтчетизмногиепроблемаВсеужеодеялоновые возможностирешать, в основном связанные с интеграцией React с кодом, отличным от React.
Если вы столкнулись с этой проблемой при обновлении,Взгляните на это распространенное решение.
Другие критические изменения
Сообщение в блоге RC для React v17Описывает другие критические изменения в React v17.
В процессе обновления компонентов 10w+ в коде проекта Facebook мы изменили менее 20 компонентов, поэтому **мы предполагаем, что у большинства приложений не возникнет особых проблем при обновлении до v17. ** Если у вас возникнут проблемы, пожалуйста,скажи нам.
Совершенно новая трансформация JSX
Реагировать v17 поддерживаетСовершенно новая трансформация JSX. Мы также сделали его совместимым с версиями React 16.14.0, React 15.7.0 и 0.14.0. Обратите внимание, что эта функция совершенно необязательна и необязательна. Предыдущее преобразование JSX будет продолжать поддерживаться, и мы не планируем прекращать его поддержку.
React Native
У React Native будет отдельный график выпуска. В настоящее время мы ожидаем, что поддержка React v17 появится в React Native 0.65, но точная версия может отличаться. Вы можете публиковать сообщения в сообществе React Native.issue trackerучаствовать в обсуждении.
Установить
Установите React v17 с помощью npm:
npm install react@17.0.0 react-dom@17.0.0
Установите React v17 с пряжей:
yarn add react@17.0.0 react-dom@17.0.0
Мы также предоставляем версию CDN, созданную UMD:
<script crossorigin src="https://unpkg.com/react@17.0.0/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17.0.0/umd/react-dom.production.min.js"></script>
Смотрите в документацииПодробная инструкция по установке.
Список изменений
React
- для новогоКонвертер JSXДобавить к
react/jsx-runtime
иreact/jsx-dev-runtime
. (@lunaruanПредставлено#18299) - Создавайте стеки вызовов компонентов на основе собственных фреймворков. (@sebmarkbageПредставлено#18561)
- Может быть установлен в контексте
displayName
для улучшения информации о стеке вызовов. (@eps1lonПредставлено#18224) - не допустить
'use strict'
Утечка из бандлов UMD. (@koba04Представлено#19614) - прекратить использовать
fb.me
перенаправить. (@cylimПредставлено#19598)
React DOM
- Делегировать мероприятие от
document
Переключитесь на корень. (@trueadmПредставлено#18195иразное) - Перед запуском следующего побочного эффекта очистите все побочные эффекты. (@bvaughnПредставлено#17947)
- работать асинхронно
useEffect
Функция очистки. (@bvaughnПредставлено#17925) - используя браузер
focusin
иfocusout
заменятьonFocus
иonBlur
базовая реализация. (@trueadmПредставлено#19186) - положить все
Capture
Все события реализуются с использованием фазы захвата браузера. (@trueadmПредставлено#19221) - запрещено в
onScroll
Пузырь, когда событие. (@gaearonПредставлено#19464) - если
forwardRef
илиmemo
Возвращаемое значение компонентаundefined
, выдается исключение. (@gaearonПредставлено#19550) - Удалите пул событий. (@trueadmПредставлено#18969)
- Удалите внутренние компоненты, которые не нужны React Native Web. (@necolasПредставлено#18483)
- При монтировании root подключите все известные прослушиватели событий. (@gaearonПредставлено#19659)
- В режиме разработки отключите второй проход рендеринга.
console
. (@sebmarkbageПредставлено#18547) - Устарело, поскольку задокументировано и вводит в заблуждение
ReactTestUtils.SimulateNative
API. (@gaearonПредставлено#13407) - Переименовать закрытые поля, используемые внутри (@gaearonПредставлено#18377)
- Не вызывайте User Timing API в среде разработки. (@gaearonПредставлено#18417)
- Отключить консоль при повторном рендеринге в строгом режиме. (@sebmarkbageПредставлено#18547)
- В строгом режиме компоненты повторного рендеринга также не используют хуки. (@eps1lonПредставлено#18430)
- Разрешить вызов функций жизненного цикла
ReactDOM.flushSync
(но с предупреждением). (@sebmarkbageПредставлено#18759) - будет
code
свойство добавляется к объекту события клавиатуры. (@bl00mberПредставлено#18287) - за
video
добавление элементаdisableRemotePlayback
Атрибуты. (@tombrowndevПредставлено#18619) - за
input
добавление элементаenterKeyHint
Атрибуты. (@eps1lonПредставлено#18634) - когда не дано
<Context.Provider>
При указании любого значения выдается предупреждение. (@charlie1404Представлено#19054) - если
forwardRef
илиmemo
Возвращаемое значение компонентаundefined
, выдается предупреждение. (@bvaughnПредставлено#19550) - Улучшить сообщения об ошибках для недопустимых обновлений. (@JoviDeCroockПредставлено#18316)
- Игнорировать forwardRef и memo из информации о стеке вызовов. (@sebmarkbageПредставлено#18559)
- Улучшены сообщения об ошибках при переключении между контролируемыми и неконтролируемыми входами. (@vcarlПредставлено#17070)
- Хранить
onTouchStart
,onTouchMove
иonWheel
По умолчанию пассивный. (@gaearonПредставлено#19654) - Исправлено закрытие iframe в режиме разработки,
setState
ожидающая проблема. (@gaearonПредставлено#19220) - использовать
defaultProps
Исправлена проблема с компонентом pull-shelf при рендеринге. (@jddxfПредставлено#18539) - ремонт когда
dangerouslySetInnerHTML
заundefined
Когда проблема ложного срабатывания предупреждения. (@eps1lonПредставлено#18676) - стандартная плата за использование
require
Реализовано для исправления Test Utils. (@just-borisПредставлено#18632) - ремонт
onBeforeInput
сообщить неправильноevent.type
. (@eps1lonПредставлено#19561) - исправить в фаерфоксе
event.relatedTarget
Выходundefined
Проблема. (@claytercekПредставлено#19607) - Исправление «неопределенной ошибки» в IE11. (@hemakshisПредставлено#19664)
- Исправлены проблемы с рендерингом в теневом корне. (@Jack-WorksПредставлено#15894)
- Исправить с захватом событий
movementX/Y
Проблемы с полифиллами. (@gaearonПредставлено#19672) - Использовать обработку делегирования
onSubmit
иonReset
событие. (@gaearonПредставлено#19333) - Улучшить использование памяти. (@trueadmПредставлено#18970)
React DOM Server
- использование рендеринга на стороне сервера
useCallback
иuseMemo
Последовательный. (@alexmckenleyПредставлено#18783) - Устранена проблема утечки состояния, когда функциональные компоненты вызывают исключения. (@pmaccartПредставлено#19212)
React Test Renderer
- улучшать
findByType
сообщение об ошибке. (@henryqdineenПредставлено#17439)
Параллельный режим (экспериментальная стадия)
- Улучшить эвристический алгоритм обновления. (@acdliteПредставлено#18796)
- Добавить перед внедрением API
unstable_
префикс. (@acdliteПредставлено#18825) - Удалить
unstable_discreteUpdates
иunstable_flushDiscreteUpdates
. (@trueadmПредставлено#18825) - удаленный
timeoutMs
параметр. (@acdliteПредставлено#19703) - инвалид
<div hidden />
Предварительно обработан для поддержки будущих API. (@acdliteПредставлено#18917) - Добавлено для саспенса
unstable_expectedLoadTime
, для деревьев, привязанных к процессору. (@acdliteПредставлено#19936) - Добавлена реализация
unstable_useOpaqueIdentifier
Крюк. (@lunaruanПредставлено#17322) - Добавлен экспериментальный
unstable_startTransition
API. (@rickhanloniiПредставлено#19696) - Использование в тестовом рендерере
act
После этого запасной вариант Suspense больше не обновляется. (@acdliteПредставлено#18596) - Используйте глобальный тайм-аут рендеринга для приостановки ЦП. (@sebmarkbageПредставлено#19643)
- Перед монтированием очистите содержимое существующего корневого каталога. (@bvaughnПредставлено#18730)
- Исправлена ошибка с неправильными границами. (@acdliteПредставлено#18265)
- Исправлена ошибка, приводившая к потере ожидающих обновлений дерева. (@acdliteПредставлено#18384а также#18457)
- Исправлена ошибка, из-за которой обновления фазы рендеринга терялись. (@acdliteПредставлено#18537)
- Исправьте ошибку SuspenseList. (@sebmarkbageПредставлено#18412)
- Исправлена ошибка, из-за которой резервный режим ожидания отображался преждевременно. (@acdliteПредставлено#18411)
- Исправлена ошибка использования исключения компонента класса в SuspenseList. (@sebmarkbageПредставлено#18448)
- Исправлена ошибка, из-за которой входной контент мог быть удален обновлениями. (@jddxfПредставлено#18515а также@acdliteПредставлено#18535)
- Исправлена ошибка зависания после приостановки отката приостановки. (@acdliteПредставлено#18663)
- Не отрезайте хвост SuspenseList, если он гидратирован. (@sebmarkbageПредставлено#18854)
- ремонт
useMutableSource
ошибка в , эта ошибка может быть вgetSnapshot
появляется при смене. (@bvaughnПредставлено#18297) - ремонт
useMutableSource
Отвратительный баг. (@bvaughnПредставлено#18912) - Если внешне визуализируется и вызывается перед фиксацией
setState
, будет выдано предупреждение. (@sebmarkbageПредставлено#18838)