11 августа 2026 состоялся релиз React Native 0.87.
В этом релизе строгий TypeScript API (Strict TypeScript API) становится стандартным JavaScript API фреймворка. Кроме того, обновлен Metro до версии 0.87, добавлена экспериментальная поддержка Swift Package Manager (SwiftPM), а минимальные требования к инструментам сборки стали выше: теперь нужны Node.js 22, Android Gradle Plugin 9 и Kotlin 2.0+.
Главное в релизе
-
строгий TypeScript API теперь используется по умолчанию;
-
Metro стал быстрее и экономнее по ресурсам;
-
появилась экспериментальная поддержка Swift Package Manager для iOS;
-
добавлена поддержка Android Gradle Plugin (AGP) версии 9.
Строгий TypeScript API теперь используется по умолчанию
Публичный JavaScript API React Native теперь основан на строгом TypeScript API.
Впервые этот режим появился как экспериментальная возможность в React Native 0.80 — одновременно с объявлением устаревшими глубоких импортов. В версии 0.87 он становится стандартным для всех проектов.
Это изменение затрагивает всю экосистему и включает ряд несовместимых изменений в API. Взамен разработчики получают несколько важных преимуществ.
-
Типы, которым можно доверять. Теперь типы генерируются непосредственно из исходного кода React Native вместо прежних определений, которые поддерживались вручную. Это устраняет накопившиеся расхождения между типами и реальной реализацией, а также улучшает покрытие и точность описания API.
-
Стабильный API. Для стабильного API важно четко определить его границы. Теперь публичным считается только то, что React Native экспортирует из корневого пакета
react-native. Изменения внутренних файлов больше не должны приводить к неожиданным поломкам в пользовательском коде.
Начиная с версии 0.87 JavaScript API React Native изменяется только тогда, когда команда намеренно меняет публичный контракт.
Новые типы можно увидеть в работе, например, если навести курсор на компонент TextInput.
Комментарии документации теперь добавляются к большинству символов. Благодаря этому при наведении курсора можно сразу получить больше информации о назначении API.Несовместимые изменения
-
Глубокие импорты из внутренних путей (например,
react-native/Libraries/*) теперь считаются ошибкой типов. Такой код необходимо перенести на публичные экспорты. -
Некоторые имена и структуры типов были изменены, поскольку старые определения были неточными или не соответствовали текущей реализации. Самое заметное изменение касается ссылок: теперь для них используются отдельные типы, например
ViewInstanceиTextInputInstance.
После первого экспериментального выпуска в React Native 0.80 команда вместе с сообществом и партнерами дорабатывала API: уточняла корневые экспорты и устраняла несовместимости с популярными библиотеками.
Для многих приложений переход на React Native 0.87 должен пройти без большого количества ошибок или вообще без них. Все несовместимые изменения описаны в руководстве по миграции.
Совет
При обновлении с помощью AI-агентов можно использовать навык
/migrate-to-strict-api. В нем собраны инструкции по переходу на новый API, которые дополняют существующие исправления через ESLint.
Как отказаться от нового API
Разработчики понимают, что не все приложения и библиотеки смогут сразу перейти на новый режим, поэтому оставили возможность временно отключить строгий API.
Этот переключатель предназначен только как промежуточное решение: он будет доступен до React Native 0.88 включительно. В следующем релизе команда планирует удалить устаревшие TypeScript-типы.
Metro стал быстрее и экономнее
В этом релизе Metro обновлён с версии 0.84 до 0.87.
-
Генерация карт исходников теперь работает примерно вдвое быстрее, что ускоряет загрузку React Native DevTools.
-
Metro потребляет примерно вдвое меньше памяти благодаря более эффективному хранению карт исходников.
-
Добавлена стабильная поддержка конфигурационных файлов на TypeScript и ESM, например
metro.config.mts. Поддержка расширения.es6и YAML-конфигураций удалена. -
В механизм разрешения модулей добавлены новые возможности, включая разрешение пакетом самого себя.
-
Также вошли различные исправления и улучшения — подробности есть в примечаниях к выпускам Metro.
Экспериментальная поддержка Swift Package Manager для iOS
В React Native 0.87 появилась экспериментальная поддержка Swift Package Manager как альтернативы CocoaPods для iOS. Она подключается отдельно и дополняет существующий механизм: CocoaPods по-прежнему остаётся стандартным и официально поддерживаемым вариантом. SwiftPM использует те же готовые XCFramework, которые уже публикует React Native.
Для такой конфигурации нужен только Xcode — без Ruby, Bundler и CocoaPods.
Чтобы попробовать SwiftPM в существующем или новом приложении:
cd ios
# deintegrate удалит CocoaPods из проекта
npx react-native spm -- deintegrate
Команда добавляет ссылки на Swift-пакеты в существующий .xcodeproj, не заменяя сам проект. Настройки подписи, capabilities и этапы сборки остаются без изменений. Команда npx react-native spm deinit полностью отменяет внесённые изменения.
Примечание
Эту команду нужно выполнить только один раз. После первоначальной настройки её не требуется запускать снова при изменении зависимостей. Достаточно установить или удалить нативный пакет и собрать проект: изменение будет обнаружено автоматически, после чего React Native повторно выполнит автосвязывание зависимостей.
То есть после каждого изменения зависимостей больше не нужно отдельно запускать
pod install.
Известные ограничения:
-
Сторонняя библиотека должна поставляться с файлом
Package.swift. Если его нет, можно выполнитьnpx react-native spm scaffold, чтобы сгенерировать его на основе podspec библиотеки. -
После свежего клонирования репозитория и в CI перед первой сборкой нужно один раз выполнить
npx react-native spm. Это аналогpod install. -
Команды, параметры и генерируемая структура могут измениться в следующих версиях. Использовать этот вариант в production пока не рекомендуется.
Полное описание архитектуры и плана миграции приведено в RFC #0994.
Несовместимые изменения в заголовочных файлах
Для полноценной интеграции SwiftPM с React Native пришлось изменить способ поставки предварительно собранных бинарных файлов самого React Native. Это связано с тем, что SwiftPM гораздо строже CocoaPods относится к структуре XCFramework и расположению заголовочных файлов.
В результате появились два новых XCFramework:
-
ReactNativeHeaders.xcframework -
ReactNativeDependenciesHeaders.xcframework
Они содержат только заголовочные файлы. Теперь заголовки разрешаются через стандартные механизмы поиска фреймворков и header search path, а у каждого пространства имён есть единственное физическое расположение. Содержимое заголовков побайтно совпадает с исходными pod-пакетами.
Единственное изменение, заметное пользователям, касается импортов заголовков без пространства имён. Если заголовок React Native подключается напрямую, нужно добавить пространство имён:
- #import + #import
Android Gradle Plugin (AGP) v9
Это первый релиз React Native с поддержкой AGP 9.
AGP 9.0 — крупное обновление Android Gradle Plugin, которое принесло несколько изменений API и несовместимых изменений в сборках Gradle.
В этом релизе команда React Native рекомендует отключить встроенную поддержку Kotlin и новый DSL API из AGP 9. Сделать это можно, добавив следующие параметры в файл android/gradle.properties — они также предлагаются в Upgrade Helper:
# Отключаем встроенный Kotlin и новое поведение DSL, появившиеся в AGP 9.android.builtInKotlin=falseandroid.newDsl=false
Начиная с AGP 10.x эти параметры отключения будут удалены.
Следить за переходом экосистемы React Native на AGP 9 можно в RFC #1006.
Несовместимые изменения
Минимальные требования к инструментам
-
Node.js >= 22.13.0 — теперь обязательное требование.
-
Android: минимальная версия Kotlin — 2.0+ (в комплекте используется Kotlin 2.2.0).
-
Android: параметр
minCompileSdkтеперь равен 34 (библиотеки должны использоватьcompileSdkверсии 34 или выше). -
Android: значения
compileSdkиbuildToolsобновлены до 37.
Удаление API
-
Строгий TypeScript API теперь используется по умолчанию (см. раздел выше). Глубокие импорты из
Libraries/недоступны, если явно не включить обратную совместимость через"react-native-legacy-deep-imports". -
Удалены глубокие импорты из
src/private/. -
Устаревшие псевдонимы типов
Properties(например,ViewProperties) больше недоступны в строгом API. Вместо них нужно использовать соответствующие типыProps. -
Удалена поддержка YAML-файлов конфигурации Metro и JavaScript-конфигураций с расширением
.es6. -
Удалён
InteractionManager. Вместо него рекомендуется использоватьrequestIdleCallback. -
Удалено устаревшее свойство
animatedуModal. -
Удалены устаревшие свойства
StatusBarbackgroundColor,translucent,networkActivityIndicatorVisibleи соответствующие методы установки значений. -
Удалена поддержка булевых значений для
ScrollView.keyboardShouldPersistTaps. -
Удалён флаг
useTurboModules— теперь TurboModules всегда включены. -
useColorScheme()теперь возвращаетColorSchemeName | nullи больше не возвращает значение'unspecified'. -
Удалены экспорт
NativeDialogManagerAndroidи недокументированный корневой экспортTouchable. Вместо него рекомендуется расширятьViewProps. -
Удалены типы
NativeMethodsиNativeMethodsMixin. Вместо них нужно использоватьHostInstance.
Пакеты и инструменты
-
@react-native/core-cli-utilsбольше не публикуется как отдельный пакет (при этом реализация остаётся доступной внутри репозитория как пример). -
Удалён
react-native/rn-get-polyfills. Вместо него следует использовать@react-native/js-polyfills. -
@react-native/jest-presetтеперь необходимо подключать как отдельный пакет. -
Удалена поддержка подключения к отдельному пакету
react-devtoolsчерез WebSocket. Вместо него следует использовать React Native DevTools.
Устаревшие API
Следующие API помечены как устаревшие и будут удалены в одном из будущих релизов:
-
react-native/Libraries/Core/InitializeCore→ используйтеreact-native/setup-env. -
@react-native/assets-registry→ используйтеAssetRegistryизreact-nativeи новый пакет@react-native/asset-utils. -
ImageBackground→ используйтеViewс абсолютно позиционированнымImage. -
Интерфейс
NativeMethods→ используйтеHostInstance. -
Appearance.setColorScheme('unspecified')→ используйте'auto'. -
Android:
DrawerLayoutAndroid→ используйтеreact-native-drawer-layout;UIBlock/UIManagerModule.addUIBlock/prependUIBlock→ используйтеUIManagerListenerили команды View; конструкторыDefaultReactActivityDelegateс флагом новой архитектуры. -
iOS:
TimingModule;RCTTurboModuleEnabled()/RCTEnableTurboModule().
Если хотите на практике посмотреть, как TypeScript помогает ловить ошибки до запуска и упрощает поддержку JavaScript-кода, 24 августа в 20:00 преподаватель курса «JavaScript-разработчик. Продвинутый уровень» разберёт это на бесплатном демо-уроке. Присоединяйтесь.
Источник: habr.com