Что изменилось в 17 версии React?
React 18+
React 17 (октябрь 2020) — знаменитый релиз «без новых фич»: никаких новых API для разработчиков. Все изменения — внутренние, ради упрощения будущих миграций.
Главные изменения
Новая система событий. Делегированные обработчики переехали с document на корневой контейнер приложения (элемент из createRoot/render). Зачем:
- несколько React-приложений (в т.ч. разных версий) на одной странице перестали конфликтовать обработчиками;
- проще интеграция с не-React кодом (jQuery-обработчики, микрофронтенды);
- поведение ближе к нативному (например, e.stopPropagation() в внешнем коде теперь корректно останавливает React-события).
Также: убран event pooling (события перестали переиспользоваться — можно обращаться к event асинхронно), onScroll больше не всплывает, onFocus/onBlur переведены на нативные focusin/focusout.
Новый JSX-трансформ (вместе с Babel/TS): JSX компилируется в jsx() из react/jsx-runtime вместо React.createElement — стало не нужно писать `import React from 'react'` в каждом файле; чуть меньше бандл.
Постепенные обновления как стратегия. React 17 сделан «мостом»: страница может нести React 17 и, скажем, встроенный виджет на будущей версии. Плюс подготовка к конкурентным фичам: очистка устаревших внутренностей, предупреждения для UNSAFE_-методов.
Прочее: cleanup эффектов стал выполняться асинхронно (и строго до следующего эффекта); стек ошибок компонентов стал информативнее.
Коротко для собеседования
React 17 — технический релиз без новых API: события делегируются на корень приложения (совместимость нескольких React на странице, лучшее сосуществование с внешним кодом), убран event pooling, введён новый JSX-трансформ (import React больше не нужен). Смысл релиза — плавный мост к React 18.