React Native 0.79 —— 更快的开发工具,功能更强大

概述

本次版本带来了多个方面的性能优化及若干 Bug 修复。
首先,Metro 通过引入延迟哈希技术大幅加快了启动速度,并稳定支持 package exports。Android 端也通过 JS Bundle 压缩方式优化,提升了应用启动速度。

更新亮点

  • Metro 工具新特性
  • JSC 移至社区维护包
  • iOS 支持 Swift 原生模块注册
  • Android 应用启动更快
  • 移除远程 JS 调试功能

Metro:更快的启动速度 & 包导出支持


本版本内置 Metro 0.82。该版本通过延迟哈希,提升了首次运行 yarn start 的速度,通常超过 3 倍提升,尤其是在大型项目和 monorepo 中效果更显著。

此外,package.json 中的 exportsimports 字段支持现已变为稳定,默认启用。
这些特性最早在 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-shadowfilter 值。

错误写法(不再支持):

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容