Сегодня мы с радостью выпускаем 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 (Strict TypeScript API). Изначально он был доступен в качестве опционального превью в версии 0.80 наряду с отказом от глубоких импортов (deep imports). В версии 0.87 он становится стандартным для всех проектов.
Это изменение затрагивает всю экосистему и вносит намеренные критические изменения (breaking changes) в поверхность API. Преимущества:
- Типы, которым можно доверять: Типы теперь генерируются напрямую из исходного кода React Native, заменяя создававшиеся вручную определения, которые мы поставляли ранее. Это устраняет давнее расхождение между типами и кодом, а также улучшает покрытие и точность во всем API.
- Стабильный API: Стабильный API начинается с четкого определения того, что именно он охватывает. Теперь API ограничен тем, что react-native экспортирует на верхнем уровне, поэтому изменения в наших внутренних файлах больше не ломают ваш код. Начиная с версии 0.87, JS API в React Native меняется только тогда, когда мы этого задумываемся.
Новые типы в действии — наведение на компонент TextInput:
Документирующие комментарии (doc comments) теперь включены для большинства символов, что обеспечивает лучшую и быструю справку при наведении.
Критические изменения
- Глубокие импорты во внутренние пути (например, react-native/Libraries/*) теперь приводят к ошибке типизации, и их необходимо перенести.
- Некоторые имена и структуры типов были обновлены там, где старые определения были неточными или некорректными — наиболее заметно, что для рефов (refs) теперь предусмотрены отдельные типы (например, ViewInstance, TextInputInstance) (документация).
Со времени выхода оригинального превью в версии 0.80 мы работали с сообществом и партнерами над улучшением нашего API, финализируя экспорт на уровне корня и устраняя несовместимости с популярными библиотеками.
Многие приложения смогут обновиться до версии 0.87 с минимальным количеством ошибок или вообще без них. В руководстве по миграции описано каждое критическое изменение.
совет
Обновления с помощью агентов могут использовать /migrate-to-strict-apiнавык (skill){{/L1}}, который содержит прямые инструкции по миграции в дополнение к существующим исправлениям ESLint.
Отказ от нововведения (Opting out)
Мы понимаем, что не каждое приложение или библиотека смогут перейти на новый API немедленно, поэтому мы сохранили возможность отключения этой функции.
Эта возможность временный мостик: она останется доступной в React Native 0.88, а в следующем релизе мы планируем полностью удалить устаревшие типы TypeScript.
Чтобы временно вернуться к предыдущим типам, добавьте пользовательское условие "react-native-legacy-deep-imports" в ваш tsconfig.json:
tsconfig.json
"extends": "@react-native/typescript-config",
"compilerOptions": {
+ "customConditions": ["react-native", "react-native-legacy-deep-imports"]
- Отказ от нововведения влияет на анализ TypeScript только в вашем собственном проекте — приложения и библиотеки мигрируют независимо (подробнее).
- Если что-то мешает вам внедрить Строгий API, пожалуйста, сообщите нам об этом в нашей теме для отзывов.
- Часто задаваемые вопросы (FAQs) — ответы на распространенные вопросы, в том числе о том, влияет ли это на время выполнения, о сроках миграции для авторов библиотек и о том, почему были заменены ручные типы.
- Движение к стабильному JavaScript API — наше первоначальное обоснование этой миграции из анонса превью 0.80.
- Посмотрите доклад — подробный разбор наших мотивов и проделанной работы за кулисами Строгого TypeScript API с конференции App.js 2025.
Более быстрый и легкий Metro
В этом релизе Metro обновлен с версии 0.84 до 0.87.
- Генерация source map теперь происходит в 2 раза быстрее, что обеспечивает более быструю загрузку React Native DevTools.
- Metro использует вдвое меньше памяти благодаря более эффективному хранению source map.
- Стабильная поддержка конфигурационных файлов на TypeScript и ESM, например metro.config.mts; прекращена поддержка расширений .es6 и конфигов в формате YAML.
- Новые функции резолвера, включая саморазрешение пакетов (package self-resolve).
- Различные исправления и улучшения, см. примечания к релизу Metro.
Экспериментальная поддержка Swift Package Manager для iOS
React Native 0.87 добавляет экспериментальную поддержку Swift Package Manager в качестве альтернативы CocoaPods на iOS. Эта функция является опциональной и дополняющей; CocoaPods остается стандартным и поддерживаемым путем. Вариант со SwiftPM использует те же предсобранные XCFrameworks, которые React Native уже публикует.
Для этой новой настройки требуется только Xcode — никаких Ruby, Bundler или CocoaPods.
Чтобы попробовать это в существующем или новом приложении:
cd ios
# deintegrate удалит CocoaPods из вашего проекта
npx react-native spm --deintegrate
Команда внедряет ссылки на пакеты Swift в ваш существующий файл .xcodeproj вместо замены всего проекта. Ваши настройки подписи (signing), возможности (capabilities) и фазы сборки (build phases) остаются нетронутыми. Команда npx react-native spm deinit полностью отменяет это изменение.
информация
Эту команду нужно выполнить всего один раз. После первичной настройки вам больше не придется запускать ее при изменении зависимостей. Установите или удалите нативный пакет, а затем соберите проект. Проект обнаружит изменения и автоматически выполнит автолинковку для вас. После каждого изменения зависимостей больше не нужно помнить о шаге pod install.
Известные ограничения:
- Сторонняя библиотека должна поставлять файл Package.swift. Если его нет, выполните npx react-native spm scaffold для его генерации из podspec-файла библиотеки.
- После свежего клонирования репозитория, а также в CI, выполните npx react-native spm один раз перед сборкой. Это аналог команды pod install.
- Команды, флаги и генерируемая структура могут измениться в последующих релизах. Пока не используйте это в продакшене.
Полный дизайн и план миграции смотрите в RFC #0994.
Чтобы должным образом поддержать интеграцию SwiftPM с React Native, нам пришлось переосмыслить способ поставки предкомпилированных бинарных файлов самого React Native. Это необходимо, поскольку SwiftPM гораздо строже, чем CocoaPods, относится к структуре XCFramework и расположению заголовочных файлов (headers).
Вы можете заметить пару новых XCFrameworks:
- ReactNativeHeaders.xcframework
- ReactNativeDependenciesHeaders.xcframework
Это фреймворки, состоящие только из заголовков (Headers only), и благодаря этому изменению заголовочные файлы теперь разрешаются с помощью стандартной механики путей поиска фреймворков и заголовков, а каждое пространство имен имеет ровно одно физическое расположение. Содержимое заголовков побайтово идентично исходным подам.
- #import <RCTAppDelegate.h>
+ #import <React/RCTAppDelegate.h>
Android Gradle Plugin (AGP) версии 9
Это первый релиз React Native, в который добавлена поддержка AGP 9.
AGP 9.0 — это мажорный релиз AGP, который приносит несколько изменений API и критических изменений в сборках Gradle.
В частности, в этом релизе рекомендуется отказаться от встроенного Kotlin и нового DSL API из AGP 9. Вы можете сделать это, добавив следующие флаги в свой файл android/gradle.properties, как также предлагается в помощнике по обновлению:
# Отказ от встроенного Kotlin и нового поведения DSL, поставляемых с AGP 9.
# Начиная с AGP 10.x, эти параметры отключения будут удалены.
android.builtInKotlin=false
android.newDsl=false
Вы можете следить за прогрессом внедрения 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) недоступны в рамках Strict API — используйте эквиваленты *Props (подробности).
- Удалена поддержка конфигурационных файлов Metro в формате YAML и файлов конфигурации JavaScript с расширениями .es6.
- Удален InteractionManager — вместо него используйте requestIdleCallback.
- Удалено устаревшее анимированное свойство 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 являются устаревшими и будут удалены в одном из будущих релизов:
- react-native/Libraries/Core/InitializeCore → используйте react-native/setup-env (подробности).
- @react-native/assets-registry → используйте AssetRegistry из react-native и новый @react-native/asset-utils.
- ImageBackground → используйте View с изображением с абсолютным позиционированием.
- Интерфейс NativeMethods → используйте HostInstance.
- Appearance.setColorScheme('unspecified') → используйте 'auto'.
- Android: DrawerLayoutAndroid → используйте react-native-drawer-layout; UIBlock / UIManagerModule.addUIBlock / prependUIBlock → используйте UIManagerListener или View Commands; конструкторы флага новой архитектуры в DefaultReactActivityDelegate.
- iOS: TimingModule; RCTTurboModuleEnabled() / RCTEnableTurboModule().
Благодарности
React Native 0.87 содержит 265 коммитов от 74 контрибьюторов. Спасибо за вашу усердную работу!
Мы хотим выразить особую благодарность тем участникам сообщества, которые внесли значительный вклад в этот релиз.
- Alex Hunt за работу над Строгим TypeScript API
- Christian Falch за добавление поддержки Swift Package Manager
- Rob Hogan за улучшения в Metro
- Hur Ali за внедрение AGP V9
- Christoph Purrer за очистку старой архитектуры
Обновление до 0.87
info
0.87 теперь является последней стабильной версией React Native, а 0.84.x переходит в категорию неподдерживаемых. Для получения дополнительной информации см. политику поддержки React Native.
Обновление
Пожалуйста, используйте Помощник по обновлению React Native для просмотра изменений кода между версиями React Native для существующих проектов, в дополнение к документации по обновлению.
Создание нового проекта
npx @react-native-community/cli@latest init MyProject --version latest
Expo
Для проектов на Expo React Native 0.87 будет доступен в рамках релизов expo@canary.
