概述
本次版本带来了多个方面的性能优化及若干 Bug 修复。
首先,Metro 通过引入延迟哈希技术大幅加快了启动速度,并稳定支持 package exports
。Android 端也通过 JS Bundle 压缩方式优化,提升了应用启动速度。
更新亮点
- Metro 工具新特性
- JSC 移至社区维护包
- iOS 支持 Swift 原生模块注册
- Android 应用启动更快
- 移除远程 JS 调试功能
Metro:更快的启动速度 & 包导出支持
本版本内置 Metro 0.82。该版本通过延迟哈希,提升了首次运行
yarn start
的速度,通常超过 3 倍提升,尤其是在大型项目和 monorepo 中效果更显著。
此外,package.json
中的 exports
和 imports
字段支持现已变为稳定,默认启用。
这些特性最早在 0.72 引入,由社区贡献完善,现在在 0.79 全面启用。
这提高了对现代 npm 依赖的兼容性,并提供了更标准的项目结构组织方式。
JSC 迁移至社区包
为缩减 React Native 的核心 API 表面,我们将 JavaScriptCore (JSC) 引擎迁移至社区维护的包:
@react-native-community/javascriptcore
此更改不会影响使用 Hermes 的用户。
从 0.79 起,用户可根据 README 使用该社区版本。核心内置的 JSC 在 0.79 仍可使用,但未来版本将被移除。
迁移至社区包后,JSC 将拥有独立的更新节奏,更快速提供新功能。
iOS:支持 Swift 的原生模块注册方式
本版本重新设计了原生模块注册流程,遵循与组件注册一致的模式(详见官方文档)。
你可以在 package.json
中通过 modulesProvider
字段注册模块:
"codegenConfig": {
"ios": {
"modulesProvider": {
"模块 JS 名称": "ObjC/C++ 模块提供者或符合 RCTTurboModule 的类"
}
}
}
Codegen 将自动从 package.json
生成所需代码。
特别地,该机制支持 纯 C++ 模块 + Swift AppDelegate 的组合,解决了 0.77 引入的限制,适用于 Swift 和 Objective-C 两种实现。
Android:应用启动速度优化
我们对 Android 的启动流程进行了优化。
以往 JS Bundle 会压缩打入 APK,系统需先解压才能启动,导致性能瓶颈。
从 0.79 起,JS Bundle 将默认不压缩,大幅提升启动速度。
实测效果:Margelo 团队在 Discord 应用上测试后,交互准备时间(TTI)减少了 400ms(约 12% 提升),仅需一行配置。
若你希望节省磁盘空间,可在 app/build.gradle
中使用以下配置:
react {
enableBundleCompression = true // 压缩(空间小,启动慢)
enableBundleCompression = false // 默认值(空间大,启动快)
}
注意:APK 文件体积会增加,但下载时仍会压缩,因此不会影响网络下载体积。
不兼容更新(Breaking Changes)
移除远程 JS 调试功能
为改善调试体验,我们彻底移除了使用 Chrome 进行的“远程 JS 调试”功能。
该功能自 0.73 起即标记为弃用,并需手动启用。
请改用 React Native DevTools 进行现代可靠的调试。
同时,这意味着 react-native-debugger 项目将不再兼容。若你使用 Redux DevTools 等第三方插件,建议迁移至:
- Expo DevTools 插件,或
- 独立集成版本的工具
更多信息详见专门文章。
内部模块导出方式变更
为现代化 JavaScript 代码风格,我们统一将 React Native 内部实现模块改为使用 export
语法,而非 module.exports
。
本次共更新约 46 个 API,详情可查看 changelog。
变更影响如下:
- 默认导出不变
- 次级导出需稍作调整
预计该更改对使用 TypeScript 和 import
的项目影响非常小。建议检查类型错误并相应调整代码。
TIP:建议统一从 'react-native' 根路径导入,避免未来深层路径导入被移除时造成破坏。
其他 Breaking Changes
以下变更可能对你的项目产生轻微影响,建议关注:
box-shadow 和 filter 中不再支持无单位长度
为遵循 CSS/Web 标准,React Native 不再支持无单位的 box-shadow
与 filter
值。
错误写法(不再支持):
box-shadow: 1 1 black;
应改为:
box-shadow: 1px 1px black;
移除 hwb()
非标准语法支持
React Native 不再支持 hwb()
中的逗号分隔值:
错误写法:
hwb(0, 0%, 100%)
正确写法:
hwb(0 0% 100%)
ExceptionsManager
导出方式调整
我们将 Libraries/Core/ExceptionsManager
模块调整为:
- 默认导出:
ExceptionsManager
- 次级导出:
SyntheticError