Dev48
ЯЗЫК
  • О нас
  • Услуги
  • Индустрии
  • Технологии
  • Статьи
  • Контакты
Забронировать звонок
    Главная/Статьи/React native 087 strogiy typescript api obnovlenie metro swift package manager p
Dev48

© 2026 · All rights reserved.

React Native 0.87 — Строгий TypeScript API, обновление Metro, Swift Package Manager, поддержка AGP 9

Источник: React Native

React Native 0.87 — Строгий TypeScript API, обновление Metro, Swift Package Manager, поддержка AGP 9

Источник: React Native

Сегодня мы рады объявить о выпуске React Native 0.87!

25 сентября 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. Изначально он был доступен в качестве предварительной версии с возможностью включения в 0.80, одновременно с отказом от глубокого импорта (deep imports). В версии 0.87 он становится стандартным для всех проектов.

Это изменение затрагивает всю экосистему и вносит запланированные изменения, нарушающие обратную совместимость (breaking changes), на уровне API. Преимущества:

  • Типы, которым можно доверять: теперь типы генерируются напрямую из исходного кода React Native, заменяя написанные вручную определения, которые мы поставляли ранее. Это устраняет давнее несоответствие между типами и кодом, а также улучшает покрытие и точность для всего API.
  • Стабильный API: стабильный API начинается с четкого определения того, что именно он охватывает. Теперь API ограничен тем, что экспортирует react-native на верхнем уровне, поэтому изменения в наших внутренних файлах больше не ломают ваш код. Начиная с версии 0.87, JS API в React Native изменяется только тогда, когда мы этого задумываем.

Вот новые типы в действии — при наведении курсора на компонент TextInput:

Документационные комментарии теперь включены для большинства символов, предоставляя более удобную информацию при наведении курсора.

Изменения, нарушающие обратную совместимость

  • Глубокий импорт во внутренние пути (например, react-native/Libraries/*) теперь приводит к ошибке типизации и требует миграции.
  • Некоторые имена и структуры типов были обновлены там, где старые определения были неточными или некорректными — наиболее заметно, что для refs теперь появились выделенные типы (например, ViewInstance, TextInputInstance) (документация).

Начиная с предварительного просмотра в 0.80, мы работали с сообществом и партнерами над улучшением нашего API — финализируя экспорты верхнего уровня и устраняя несовместимости с популярными библиотеками.

Многие приложения смогут обновиться до версии 0.87 с минимальным количеством ошибок или вообще без них. Руководство по миграции описывает каждое изменение, нарушающее обратную совместимость.

совет

Обновления с помощью агентов могут использовать навык /migrate-to-strict-api, который содержит прямые инструкции по миграции в дополнение к существующим средствам исправления ESLint.

Отказ от использования (Opting out)

Мы понимаем, что не каждое приложение или библиотека смогут выполнить миграцию немедленно, поэтому мы сохранили возможность отключения нового поведения пользователем.

Этот переключатель является временным мостом: он останется доступным в 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"]

  • Отказ от нового API влияет на анализ TypeScript только в вашем собственном проекте — приложения и библиотеки мигрируют независимо (подробнее).
  • Если что-то мешает вам внедрить Строгий API, пожалуйста, сообщите нам об этом в нашей ветке отзывов.
  • Часто задаваемые вопросы — ответы на распространенные вопросы, включая то, влияет ли это на рантайм, сроки миграции для авторов библиотек и почему были заменены типы, написанные вручную.
  • Движение к стабильному JavaScript API — наше изначальное обоснование этой миграции из анонса предварительной версии 0.80.
  • Посмотрите доклад — подробный разбор наших мотиваций и работы, проделанной для создания строгого TypeScript API, с конференции App.js 2025.

Более быстрый и эффективный Metro

В этом выпуске Metro обновлен с версии 0.84 до 0.87.

  • Генерация исходных карт (source maps) теперь происходит в 2 раза быстрее, что ускоряет загрузку React Native DevTools.
  • Metro использует вдвое меньше памяти благодаря более эффективному хранению исходных карт.
  • Добавлена стабильная поддержка конфигурационных файлов 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 полностью отменяет это изменение.

информация

Эту команду нужно запустить только один раз. После первоначальной настройки вам не нужно запускать ее снова при изменении зависимостей. Установите или удалите нативный пакет, а затем соберите проект. Проект обнаружит изменения и заново выполнит автосвязывание (autolinking). После каждого изменения зависимостей больше не нужно помнить о выполнении шага 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), и благодаря этому изменению заголовки теперь разрешаются через стандартные механизмы поиска путей к фреймворкам и заголовкам, а каждое пространство имен имеет ровно одно физическое местоположение. Содержимое заголовков побайтово идентично исходным подам. Единственное изменение для разработчика — это использование угловых скобок в форме общего включения (bare-form angle includes): если вы импортируете заголовочный файл React Native без указания пространства имен, добавьте его:

- #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) недоступны в рамках Строгого API — используйте эквиваленты *Props (подробности).
  • Удалена поддержка конфигурационных файлов YAML Metro, а также конфигурационных файлов 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 с абсолютным позиционированием Image.
  • Интерфейс NativeMethods → используйте HostInstance.
  • Appearance.setColorScheme('unspecified') → используйте 'auto'.
  • Android: DrawerLayoutAndroid → используйте react-native-drawer-layout; UIBlock / UIManagerModule.addUIBlock / prependUIBlock → используйте UIManagerListener или команды View; конструкторы флага новой архитектуры в 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​

информация

0.87 теперь является последней стабильной версией React Native, а поддержка 0.84.x прекращена. Для получения дополнительной информации см. политику поддержки React Native.

Обновление​

Пожалуйста, используйте React Native Upgrade Helper для просмотра изменений кода между версиями React Native для существующих проектов, в дополнение к документации по обновлению.

Создание нового проекта​

npx @react-native-community/cli@latest init MyProject --version latest

Expo​

Для проектов Expo версия React Native 0.87 будет доступна в рамках релизов expo@canary.

← Все статьи