React Native 0.87: строгий TypeScript API по умолчанию, обновленный Metro, SwiftPM и поддержка AGP 9

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.Комментарии документации теперь добавляются к большинству символов. Благодаря этому при наведении курсора можно сразу получить больше информации о назначении 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.

  • Удалены устаревшие свойства StatusBar backgroundColor, 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

0 0 голоса
Рейтинг новости
1
0
Подписаться
Уведомить о
0 комментариев