React Native 0.87 正式发布:TypeScript 严格 API 成为默认、Swift Package Manager 实验性支持、Metro 性能翻倍

React Native 0.87 来了。

这不是一次普通的版本迭代。官方将其定义为"生态级变革"——TypeScript 严格 API 全面转正、Swift Package Manager 实验性落地、Metro 打包性能翻倍、Android 工具链全面升级。

如果你正在维护 React Native 项目,这篇文章值得你花 5 分钟读完。


🔥 四大核心亮点

1. Strict TypeScript API 成为默认(生态级变革)

从 0.87 开始,React Native 的公共 JavaScript API 全面切换为严格 TypeScript API。这项功能在 0.80 版本中作为可选预览推出,如今正式成为所有项目的默认配置。

这意味着什么?

  • 类型可信:类型定义直接从 React Native 源码生成,取代了以往手工维护的 .d.ts 文件。长期存在的"类型与代码脱节"问题被彻底解决,API 覆盖率和准确性全面提升。
  • API 稳定:公共 API 被严格限定在 react-native 根导出范围内。官方内部的文件结构调整不再成为你的 breaking change——只有根导出的变更才算真正的 API 变更。

IDE 体验对比:

之前(旧类型) 现在(严格 API)
悬停只显示 class TextInput 悬停显示完整类型定义,包含 StatecurrentlyFocusedInputfocusTextInput 等所有属性和方法
无文档注释 大多数符号附带文档注释,一目了然

⚠️ 破坏性变更需注意:

  • 深层导入(如 react-native/Libraries/*)现在会报类型错误,必须迁移到根导入。
  • Refs 类型更新为专用类型(如 ViewInstanceTextInputInstance)。
  • 部分类型名称和结构已调整。

迁移建议: 大多数应用可以平滑升级。官方提供了完整的迁移指南,同时支持通过 /migrate-to-strict-api skill 进行自动化迁移。如果实在无法立即迁移,可通过 "react-native-legacy-deep-imports" 临时回退——但该选项仅在 0.88 之前有效,0.89 将彻底移除旧类型


2. Metro 0.87:更快、更省内存

Metro 从 0.84 升级至 0.87,带来显著的性能提升:

  • Source Map 生成速度提升 2 倍——React Native DevTools 加载更快
  • 内存占用减半——得益于更高效的 source map 存储机制
  • 稳定支持 TypeScript 和 ESM 配置文件(如 metro.config.mts
  • 新增包自解析(package self-resolve)等功能
  • 移除对 .es6 扩展名和 YAML 配置文件的支持

3. 实验性 Swift Package Manager 支持(iOS 重大利好)

React Native 0.87 为 iOS 带来实验性 Swift Package Manager(SwiftPM)支持,作为 CocoaPods 的替代方案。

最大亮点:只需要 Xcode,不需要 Ruby、Bundler 或 CocoaPods。

如何尝试:

cd ios
# 移除 CocoaPods 集成
npx react-native spm --deintegrate

该命令会在现有 .xcodeproj 中注入 Swift 包引用,不会替换你的项目文件。签名、Capability、构建阶段等配置完全保留。npx react-native spm deinit 可精确回退。

使用体验:

  • 首次配置后,无需在每次依赖变更时重复运行命令。安装或移除原生包后直接构建,项目会自动检测变更并重新运行 autolinking——没有 pod install 步骤
  • 新引入的 XCFramework:ReactNativeHeaders.xcframeworkReactNativeDependenciesHeaders.xcframework,用于标准化头文件解析。

⚠️ 已知限制:

  • 社区库必须提供 Package.swift,否则需运行 npx react-native spm scaffold 从 podspec 生成。
  • 全新克隆或 CI 环境中,构建前需运行一次 npx react-native spm(相当于 pod install)。
  • 目前不建议用于生产环境

4. Android Gradle Plugin 9 支持

React Native 0.87 首次支持 AGP 9。由于 AGP 9.0 带来了大量 API 和构建行为的破坏性变更,官方建议在当前版本中显式关闭内置 Kotlin 和新 DSL 行为

# android/gradle.properties
android.builtInKotlin=false
android.newDsl=false

注意:AGP 10.x 将移除这些 opt-out 选项。


🔧 最低工具链要求全面升级

工具 最低版本
Node.js >= 22.13.0
Android Kotlin 2.0+(捆绑版本 2.2.0)
Android minCompileSdk 34
Android compileSdk / buildTools 37

⚠️ 重要 API 移除清单

  • InteractionManager → 使用 requestIdleCallback
  • Modalanimated prop
  • StatusBarbackgroundColor / translucent / networkActivityIndicatorVisible
  • ScrollViewkeyboardShouldPersistTaps 布尔值支持
  • useTurboModules 特性标志(TurboModules 已默认启用)
  • useColorScheme() 不再返回 'unspecified',改为返回 ColorSchemeName | null
  • NativeMethods / NativeMethodsMixin 类型 → 使用 HostInstance
  • 独立 react-devtools WebSocket 连接支持 → 使用 React Native DevTools

📋 已废弃 API(将在未来版本移除)

  • react-native/Libraries/Core/InitializeCorereact-native/setup-env
  • @react-native/assets-registryAssetRegistry(来自 react-native)和 @react-native/asset-utils
  • ImageBackground → 使用绝对定位的 Image 嵌套在 View
  • Appearance.setColorScheme('unspecified')'auto'
  • Android: DrawerLayoutAndroidreact-native-drawer-layout
  • Android: UIBlock / UIManagerModule.addUIBlockUIManagerListener 或 View Commands
  • iOS: TimingModuleRCTTurboModuleEnabled() / RCTEnableTurboModule()

🚀 如何升级

新建项目:

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

现有项目:
使用 React Native Upgrade Helper 查看版本间代码差异。

Expo 用户:
React Native 0.87 将通过 expo@canary 版本提供。


版本支持提示: 0.87 现为最新稳定版,0.84.x 已停止维护。建议尽快规划升级。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐