React Native 0.87 重磅发布:强类型 TypeScript API 默认开启,Metro 性能飙升
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 |
悬停显示完整类型定义,包含 State、currentlyFocusedInput、focusTextInput 等所有属性和方法 |
| 无文档注释 | 大多数符号附带文档注释,一目了然 |
⚠️ 破坏性变更需注意:
- 深层导入(如
react-native/Libraries/*)现在会报类型错误,必须迁移到根导入。 - Refs 类型更新为专用类型(如
ViewInstance、TextInputInstance)。 - 部分类型名称和结构已调整。
迁移建议: 大多数应用可以平滑升级。官方提供了完整的迁移指南,同时支持通过 /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.xcframework和ReactNativeDependenciesHeaders.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→ 使用requestIdleCallbackModal的animatedpropStatusBar的backgroundColor/translucent/networkActivityIndicatorVisibleScrollView的keyboardShouldPersistTaps布尔值支持useTurboModules特性标志(TurboModules 已默认启用)useColorScheme()不再返回'unspecified',改为返回ColorSchemeName | nullNativeMethods/NativeMethodsMixin类型 → 使用HostInstance- 独立
react-devtoolsWebSocket 连接支持 → 使用 React Native DevTools
📋 已废弃 API(将在未来版本移除)
react-native/Libraries/Core/InitializeCore→react-native/setup-env@react-native/assets-registry→AssetRegistry(来自react-native)和@react-native/asset-utilsImageBackground→ 使用绝对定位的Image嵌套在View中Appearance.setColorScheme('unspecified')→'auto'- Android:
DrawerLayoutAndroid→react-native-drawer-layout - Android:
UIBlock/UIManagerModule.addUIBlock→UIManagerListener或 View Commands - iOS:
TimingModule、RCTTurboModuleEnabled()/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 已停止维护。建议尽快规划升级。
更多推荐
所有评论(0)