Сегодня мы рады представить React Native 0.80!
В этом релизе версия React, поставляемая вместе с React Native, обновлена до последней стабильной версии: 19.1.0.
Мы также внесли ряд улучшений стабильности в наш JS API: глубокие импорты (deep imports) теперь будут вызывать предупреждение, и мы предлагаем новый опциональный Strict TypeScript API, который предоставляет более точные и безопасные типы.
Более того, Legacy Architecture в React Native теперь официально заморожена, и вы начнете видеть предупреждения для API, которые перестанут работать после того, как мы полностью откажемся от Legacy Architecture.
Основные моменты
- Устаревание глубоких импортов JavaScript
- Заморозка Legacy Architecture и предупреждения
- React 19.1.0
- Экспериментально — зависимости React Native для iOS теперь предварительно скомпилированы
Основные моменты
Устаревание глубоких импортов JavaScript
В этом релизе мы предпринимаем шаги по улучшению и стабилизации публичного JavaScript API React Native. Первым шагом к этому является лучшее определение того, какие из наших API могут быть импортированы приложениями и фреймворками. В связи с этим мы официально объявляем устаревшими глубокие импорты из React Native (см. RFC) и вводим предупреждения через ESLint и консоль JS.
Эти предупреждения касаются импортов из исходного кода вашего проекта, и от них можно отказаться. Однако, пожалуйста, имейте в виду, что мы планируем удалить глубокие импорты из API React Native в будущем релизе, поэтому их следует заменить на корневые импорты.
// До — импорт из подпути
import {Alert} from 'react-native/Libraries/Alert/Alert';
// После — импорт из `react-native`
import {Alert} from 'react-native';
Некоторые API не экспортируются в корне, и они станут недоступны без глубоких импортов. Это сделано намеренно, чтобы уменьшить общую поверхность API React Native. У нас открыта ветка для обратной связи по проблемам пользователей, и мы будем работать с сообществом, чтобы окончательно определить, какие API мы будем экспортировать в течение (как минимум) следующих двух релизов React Native. Пожалуйста, поделитесь своим мнением!
Узнайте больше об этом изменении в нашей специальной статье: Moving Towards a Stable JavaScript API.
Опциональный Strict TypeScript API
Наряду с вышеуказанным переопределением экспортов в нашем публичном API, в версии 0.80 мы также поставляем новый набор типов TypeScript для пакета react-native, который мы называем Strict TypeScript API.
Переход на Strict TypeScript API — это предварительный взгляд на наш будущий стабильный JavaScript API для React Native. Эти новые типы:
- Генерируются непосредственно из нашего исходного кода — улучшая покрытие и корректность, поэтому вы можете ожидать более строгих гарантий совместимости.
- Ограничены индексным файлом React Native — более четко определяя наш публичный API, что означает, что мы не сломаем API при внесении внутренних изменений в файлы.
Мы поставляем их вместе с существующими типами, что означает, что вы можете выбрать время для миграции, когда будете готовы. Кроме того, если вы используете стандартные API React Native, многие приложения должны пройти проверку без каких-либо изменений. Мы настоятельно рекомендуем ранним последователям и новым приложениям включить этот режим через файл tsconfig.json.
Когда сообщество будет готово, Strict TypeScript API станет нашим API по умолчанию в будущем — синхронно с удалением глубоких импортов.
Узнайте больше об этом изменении в нашей специальной статье: Moving Towards a Stable JavaScript API.
Заморозка Legacy Architecture и предупреждения
New Architecture в React Native является выбором по умолчанию начиная с версии 0.76, и мы читаем истории успеха проектов и инструментов, которые получают от этого огромную пользу.
Недавно мы сообщили, что теперь считаем Legacy Architecture замороженной. Мы больше не будем разрабатывать новые исправления ошибок или функции для Legacy Architecture и перестанем тестировать её во время работы над релизом.
Чтобы облегчить миграцию, мы по-прежнему позволяем пользователям отказаться от New Architecture, если вы столкнулись с ошибками или регрессиями.
Однако поддержка двух архитектур в React Native — это огромная задача, которая влияет на производительность во время выполнения, размер приложения и поддержку нашей кодовой базы.
Вот почему в будущем нам в конечном итоге придется отказаться от Legacy Architecture.
В версии 0.80 мы добавили ряд предупреждений, которые будут появляться в React Native DevTools, чтобы предупредить вас, если вы используете API, которые не будут работать в New Architecture.
Мы рекомендуем не игнорировать эти предупреждения и рассмотреть возможность миграции ваших приложений и библиотек на New Architecture, чтобы быть готовыми к будущему.
Вы можете узнать больше об этих изменениях в докладе "Life After Legacy: The New Architecture Future", который мы недавно представили на App.js.
React 19.1.0
Этот релиз React Native поставляется с последней стабильной версией React: 19.1.0.
Вы можете прочитать обо всех новых функциях и исправлениях ошибок, представленных в React 19.1.0, в описании релиза.
предупреждение
Одной из примечательных особенностей React 19.1.0 является реализация и улучшения стеков владельцев (owner stacks). Это функция только для разработки, которая должна помочь вам определить, какой компонент отвечает за конкретную ошибку.
Однако мы знаем, что стеки владельцев работают не так, как ожидалось в React Native, если вы используете плагин Babel @babel/plugin-transform-function-name, который включен по умолчанию в React Native Babel Preset. Мы выпустим исправление для этого в будущем релизе React Native.
Экспериментально — зависимости React Native для iOS теперь предварительно скомпилированы
Если вы создаете приложение React Native для iOS, вы, вероятно, заметили, что первая нативная сборка занимает некоторое время: пару минут или даже больше на старых машинах. Это связано с тем, что нам нужно скомпилировать весь код React Native для iOS плюс все его зависимости.
В последние недели мы экспериментировали с предварительной сборкой части ядра React Native для iOS, аналогично тому, что происходит на Android, чтобы сократить время сборки при первом запуске приложения React Native.
React Native 0.80 — это первый релиз, который может поставлять часть React Native для iOS в виде предварительной сборки, чтобы помочь сократить время сборки.
В процессе выпуска React Native мы создаем XCFramework под названием ReactNativeDependencies.xcframework, который представляет собой предварительно скомпилированную версию только сторонних зависимостей, от которых зависит React Native.
Мы провели эксперименты и оценили, сколько времени экономит эта начальная предварительная сборка для iOS, и, по нашим тестам, запущенным на машине M4, сборки iOS примерно на 12% быстрее с предварительной сборкой, чем при сборке из исходного кода.
По нашему опыту, мы также заметили, что несколько отчетов об ошибках от пользователей вызваны проблемами сборки, связанными со сторонними зависимостями React Native (пример #39568). Предварительная сборка сторонних зависимостей позволяет нам собирать их за вас, чтобы вы больше не сталкивались с этими проблемами сборки.
Обратите внимание, что мы не выполняем предварительную сборку всего React Native: мы выполняем предварительную сборку только тех библиотек, которые Meta не контролирует напрямую, таких как Folly и GLog.
В будущем релизе мы также будем поставлять остальную часть ядра React Native в виде предварительной сборки.
Как их использовать
Эта функция все еще является экспериментальной, поэтому она не включена по умолчанию.
Если вы хотите использовать их, вы можете установить свои поды, добавив переменную окружения RCT_USE_RN_DEP:
RCT_USE_RN_DEP=1 bundle exec pod install
Альтернативный вариант: если вы хотите включить это для всех разработчиков, работающих над проектом, вы можете изменить свой Podfile следующим образом:
if linkage != nil
Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green
use_frameworks! :linkage => linkage.to_sym
end
+ENV['RCT_USE_RN_DEP'] = '1'
target 'HelloWorld' do
config = use_native_modules!
Пожалуйста, сообщайте о любых проблемах, которые могут вызвать предварительные сборки (prebuilds) у вас или в вашем приложении, в этом обсуждении. Мы стремимся изучить их и убедиться, что их использование прозрачно для вашего приложения.
Другие изменения
Android — уменьшение размера APK благодаря IPO
Этот релиз обеспечивает значительное уменьшение размера всех Android-приложений, собранных с помощью React Native. Начиная с версии 0.80, мы включили межпроцедурную оптимизацию (Interprocedural Optimization) как для React Native, так и для сборок Hermes.
Это привело к экономии около 1 Мб для всех Android-приложений.
Вы получите это преимущество в размере, обновив версию React Native до 0.80; никаких дополнительных изменений в вашем проекте не требуется.
Редзайн экрана нового приложения (New App Screen)
Если вы не используете Expo, а используете Community CLI и шаблон, то в этой версии мы перенесли экран нового приложения в его собственный пакет и обновили его внешний вид. Это уменьшает количество начального шаблонного кода при создании нового приложения с помощью Community Template, а также обеспечивает лучшее отображение на больших экранах.
React Native 0.80 — последняя версия React Native, предлагающая поддержку JSC от первого лица. Поддержка JSC будет предоставляться через поддерживаемый сообществом пакет @react-native-community/javascriptcore.
Если вы пропустили анонс, вы можете прочитать об этом подробнее здесь
Критические изменения
Добавлено поле "exports" в основной пакет
В рамках изменений нашего стабильного JS API мы внедрили поле "exports" в манифест package.json для react-native.
В версии 0.80 это сопоставление по-прежнему открывает все подпути JavaScript по умолчанию, поэтому не должно стать серьезным критическим изменением. В то же время это может незначительно повлиять на то, как разрешаются модули внутри пакета react-native:
- В Metro платформозависимые расширения не будут автоматически расширяться при совпадении с "exports". Мы предоставили ряд модулей-прокладок (shim) для адаптации к этому (#50426).
- В Jest возможность имитации (mock) глубоких импортов может быть изменена, что может потребовать обновления тестов.
Другие критические изменения
Этот список содержит ряд других критических изменений, которые, как мы полагаем, могут оказать незначительное влияние на код вашего продукта и заслуживают внимания:
JS
- Мы обновили eslint-plugin-react-hooks с версии v4.6.0 до v5.2.0 (см. полный список изменений здесь). Правила линтинга react-hooks могут генерировать новые сигналы об ошибках, которые вам придется исправить или подавить.
Android
- В этом релизе версия Kotlin, поставляемая с React Native, обновлена до 2.1.20. Kotlin 2.1 представляет новые возможности языка в предварительной версии, которые вы можете начать использовать в своих модулях/компонентах. Подробнее об этом можно прочитать в официальных примечаниях к выпуску.
- Мы удалили класс StandardCharsets. Он был помечен как устаревший начиная с версии 0.73. Вместо него следует использовать класс java.nio.charset.StandardCharsets.
- Мы сделали несколько классов внутренними (internal). Эти классы не являются частью публичного API, и доступ к ним не должен осуществляться. Мы уже уведомили или отправили патчи в затронутые библиотеки: com.facebook.react.fabric.StateWrapperImpl, com.facebook.react.modules.core.ChoreographerCompat, com.facebook.react.modules.common.ModuleDataCleaner
- com.facebook.react.fabric.StateWrapperImpl
- com.facebook.react.modules.core.ChoreographerCompat
- com.facebook.react.modules.common.ModuleDataCleaner
- Мы перенесли несколько классов с Java на Kotlin. Если вы используете эти классы, обнуляемость (nullability) и типы некоторых параметров изменились, поэтому вам, возможно, придется скорректировать свой код: все классы внутри com.facebook.react.devsupport, com.facebook.react.bridge.ColorPropConverter, com.facebook.react.views.textinput.ReactEditText, com.facebook.react.views.textinput.ReactTextInputManager
- Все классы внутри com.facebook.react.devsupport
- com.facebook.react.bridge.ColorPropConverter
- com.facebook.react.views.textinput.ReactEditText
- com.facebook.react.views.textinput.ReactTextInputManager
iOS
- Мы удалили поле RCTFloorPixelValue из RCTUtils.h — метод RCTFloorPixelValue не использовался в React Native, и мы полностью его удалили.
Другие небольшие критические изменения перечислены in the CHANGELOG for 0.80.
Благодарности
React Native 0.80 содержит более 1167 коммитов от 127 участников. Спасибо за вашу усердную работу!
Мы хотим выразить особую благодарность тем членам сообщества, которые внесли значительный вклад в этот релиз:
- Christian Falch за работу над предварительными сборками (prebuilds) iOS для зависимостей React Native
- Iwo Plaza, Jakub Piasecki и Dawid Małecki за их работу над строгим TypeScript API.
Кроме того, мы хотим поблагодарить авторов, которые работали над документированием функций в этом посте о релизе:
- Riccardo Cipolleschi за написание части, связанной с предварительными сборками iOS для зависимостей React Native.
- Alex Hunt за отказ от глубоких импортов, опциональный строгий TypeScript API и редзайн экрана нового приложения.
- Nicola Corti за заморозку устаревшей архитектуры и предупреждения.
Обновление до 0.80
Пожалуйста, используйте React Native Upgrade Helper для просмотра изменений кода между версиями React Native для существующих проектов, в дополнение к документации по обновлению.
Для создания нового проекта:
Если вы используете Expo, React Native 0.80 будет поддерживаться в canary-релизе Expo SDK. Инструкции о том, как использовать React Native 0.80 в Expo, также доступны в специальной записи в блоге.
info
0.80 теперь является последней стабильной версией React Native, а 0.77.x переходит в статус неподдерживаемых. Для получения дополнительной информации см. политику поддержки React Native. Мы планируем опубликовать финальное обновление 0.77 по окончании срока службы в ближайшем будущем.
