配了三年 React Native,每次升级都要靠经验硬猜——今天 0.87 把「哪些改动会影响我」这件事彻底说清楚了

配了三年 React Native,每次升级都要靠经验硬猜——今天 0.87 把「哪些改动会影响我」这件事彻底说清楚了

React Native 0.87 上周发布,距离我上一次发版刚好三个月。升级之前我翻了一圈 release notes,发现这次不一样——不是加了什么新功能,是把整个类型系统的账全算清楚了。

旧类型是人工维护的,漂移了三年

React Native 之前的类型定义是手工写在 @types/react-native 里的,工程师维护类型的时候,源码那边可能早就改了。漂移了几年下来,你写的类型和跑起来的代码之间有缝,TypeScript 报绿但线上崩的事情并不少见。

0.87 把这套换了。类型现在直接从 React Native 源码生成,代码长什么样,类型就是什么样。你在编辑器里 hover 上去看到的文档注释,也是从源码里来的,不再是维护者自己写的说明。

Deep imports 变成类型错误,这件事反而是好事

之前你可能写过这样的 import:

import SomeInternalThing from "react-native/Libraries/Private/..."

这种写法在 0.87 之前是类型警告,现在是类型错误。官方给了迁移路径,要么迁移到 react-native 根导出,要么找维护中的替代包。如果你之前靠 deep import 在撑,这次必须正面处理。

为什么这件事值得认真对待

因为旧的类型系统在 0.89 会被彻底删除。0.87 留了一个 opt-out 开关(react-native-legacy-deep-imports),但这个开关只保留到 0.88。0.89 一出,旧的类型定义就不存在了。现在不动,三个月后就变成紧急迁移。

0.87 这次真正值得注意的四件事

第一,工具链最低要求升了:Node.js 22.13+、Kotlin 2.0+、AGP 9、compileSdk 37。如果你用的老 CI 镜像是 Node.js 20,build 阶段会直接报错,不只是 JavaScript 跑不起来。

第二,Metro 0.87 源映射生成速度快了一倍,内存占用减半。大型项目里 Metro 变慢是长期痛点,这次改进值得在升级后跑一次对比。

第三,Swift Package Manager 支持是实验性的,iOS 构建可以不用 CocoaPods 了。但这是实验功能,生产项目建议等它稳定。

第四,InteractionManager 等一批旧 API 被删了。如果你项目里有用到 InteractionManager.runAfterInteractions(),需要换成 requestIdleCallback

迁移的账怎么算

升级路径不复杂:先把 Node.js 升到 22.13+,再看 @types/react-native 是不是还挂在 package.json 里——如果在,需要移除,因为新类型是内置的。跑一次 npx react-native doctor 检查依赖兼容性,然后处理类型报错和被删的 API 调用。

Instagram、Shopify、Discord 这几个用 React Native 的头部产品,早就基于新架构跑了。Shopify 之前公开过数据:新架构下 Android 冷启动快 10%,内存降了 85MB → 52MB。

下一步

如果你还没升级到 0.87,先在测试分支跑一遍。迁移指南在 React Native 官方博客 8 月 11 日那篇,官方还给了一个 /migrate-to-strict-api 的 Claude Skill,可以直接用来跑迁移检查。工具链准备好、依赖审计完、类型报错清干净——这件事早做比晚做划算。

评论区

0 条评论

登录后可评论。

阿跨·跨端开发 105 阅读