【翻译】React Native 0.84 发布:默认启用 Hermes V1 引擎

5 阅读6分钟

原文链接:React Native 0.84 - Hermes V1 by Default

作者: Alex Hunt Alan Lee Christian Falch Gabriel Donadel Dall'Agnol

今天,我们激动地宣布 React Native 0.84 正式发布!

本次版本将 Hermes V1 设为默认 JavaScript 引擎,为所有 React Native 应用带来显著的性能提升。我们还在持续移除 iOS 和 Android 平台上的旧架构相关代码,并默认提供 iOS 预编译二进制文件。

核心亮点

  • 默认启用 Hermes V1 引擎
  • iOS 平台默认提供预编译二进制文件
  • 移除旧架构相关组件
  • 最低要求 Node.js 22 版本

默认启用 Hermes V1 引擎

继 React Native 0.82 版本中首次推出实验性可选功能后,Hermes V1 现已成为 iOS 和 Android 平台上 React Native 的默认 JavaScript 引擎。

Hermes V1 代表了 Hermes 引擎的下一代演进,编译器和虚拟机均得到重大改进,JavaScript 性能实现可量化的提升。

对应用的影响

  • 性能自动提升:所有应用默认使用 Hermes V1,执行速度更快,内存占用更低。
  • 无需迁移操作:若你已在使用 Hermes(0.70 版本起默认启用),将自动升级至 Hermes V1,无需修改任何配置。

关闭Hermes V1

包管理器覆盖配置

package.json 中强制安装旧版 hermes-compiler 包:

  • npm:在 package.json 中添加 "overrides": { "hermes-compiler": "0.15.0" }
  • yarn:在 package.json 中添加 "resolutions": { "hermes-compiler": "0.15.0" }
  • pnpm:在 package.json 中添加 "pnpm": { "overrides": { "hermes-compiler": "0.15.0" } }

iOS 平台

安装 CocoaPods 依赖时,传入环境变量 RCT_HERMES_V1_ENABLED=0RCT_USE_PREBUILT_RNCORE=0

Android 平台

android/gradle.properties 文件中添加 hermesV1Enabled=false,并配置应用从源码构建 React Native

iOS 平台默认提供预编译二进制文件

React Native 0.84 现已在 iOS 平台默认提供预编译二进制文件。该功能此前为可选启用,如今默认开启,将大幅缩短 iOS 应用的构建时间。

这意味着你无需在每次执行清洁构建时都从源码编译 React Native 核心库。预编译的 .xcframework 二进制文件将在 pod install 过程中自动下载并使用。

提示:若你需要从源码构建 React Native(例如退出 Hermes V1 启用),可在安装 pods 时设置 RCT_USE_PREBUILT_RNCORE=0 以禁用预编译二进制文件。

移除旧架构相关组件

继 0.82 版本(将新架构设为唯一运行时选项)之后,React Native 0.84 继续在 iOS 和 Android 平台移除旧架构代码。根据 RFC 文档规划,我们将在每个版本中逐步移除多个旧架构类。

iOS 平台

0.83 版本中,我们引入了实验性标志 RCT_REMOVE_LEGACY_ARCH 以编译移除旧架构代码。0.84 版本中,该行为成为默认配置 ——iOS 构建将不再包含旧架构代码,从而缩短构建时间并减小应用体积。

对于已迁移至新架构的应用,预计不会出现兼容性问题 —— 用于兼容的互操作层代码将保留。

重新启用 iOS 旧架构代码

若需在 iOS 构建中重新启用旧架构代码,需从源码构建。通过以下命令安装 CocoaPods 依赖:

RCT_USE_PREBUILT_RNCORE=0 RCT_REMOVE_LEGACY_ARCH=0 bundle exec pod install

Android 平台

已移除的旧架构类

本版本移除了以下旧架构相关类:

com.facebook.react.LazyReactPackage
com.facebook.react.bridge.CxxModuleWrapper
com.facebook.react.bridge.CxxModuleWrapperBase
com.facebook.react.bridge.CallbackImpl
com.facebook.react.bridge.NotThreadSafeBridgeIdleDebugListener
com.facebook.react.bridge.OnBatchCompleteListener
com.facebook.react.bridge.ReactCxxErrorHandler
com.facebook.react.bridge.ReactInstanceManagerInspectorTarget
com.facebook.react.modules.debug.DidJSUpdateUiDuringFrameDetector
com.facebook.react.devsupport.BridgeDevSupportManager
com.facebook.react.uimanager.NativeKind
com.facebook.react.uimanager.debug.NotThreadSafeViewHierarchyUpdateDebugListener
com.facebook.react.uimanager.layoutanimation.LayoutAnimationController
com.facebook.react.uimanager.layoutanimation.LayoutAnimationListener

最低要求 Node.js 22 版本

React Native 0.84 要求 Node.js v22.11 或更高版本。此次版本升级将提升 React Native 工具生态中现代 JavaScript 特性的可用性。

请在升级 React Native 前更新你的 Node.js 版本。建议使用 nvmfnm 等 Node 版本管理器来管理多个 Node 版本。

其他变更

React 19.2.3 同步

本版本将 React 版本同步至 19.2.3,包含 React 团队最新的修复和改进。

支持 ESLint v9 扁平配置

React Native 的 ESLint 配置现已支持 ESLint v9 扁平配置(Flat Config),让你的项目更易适配最新的 ESLint 工具链。

平台支持增强

  • 图片格式:React Native 0.84 新增对 HEIC 和 HEIF 图片格式的支持,更便于处理现代相机输出和图片库资源。
  • PlatformColor:增强了 PlatformColor 在动画插值和输出范围中的测试与支持。
  • Android 键盘事件:新增 Android 平台的 onKeyDown/onKeyUp 事件支持,实现对硬件键盘和电视遥控器的键盘事件处理。

可访问性优化

  • 带有 onPressonLongPress 处理器的文本组件,将自动设置 accessibilityRole="link",提升可访问性支持,确保屏幕阅读器能正确播报交互式文本元素。
  • Android 平台:修复了循环利用视图(recycled views)的可访问性状态问题 —— 确保视图循环利用时,isClickableOnClickListener 状态能正确重置,避免屏幕阅读器播报错误状态。

URL API 改进

  • URL 对象补充了缺失的标准属性(hashhostpathname 等)。
  • URLSearchParams 补充了标准方法(getsetdelete 等),使 React Native 的 URL 实现更贴近 Web 标准。
  • 修复了 URLSearchParams 的重复条目问题。

其他重大变更

iOS 平台

通过将观察者封装在引用计数指针中,修复了 ImageResponseObserverCoordinator 中罕见的 EXC_BAD_ACCESS 崩溃问题。这一变更修改了 RCTImage 观察者 API 中的对象声明,可能会影响 react-native-svg 等依赖库。

Android 平台

移除了 BridgeDevSupportManager 类。

C++ 层面

JSBigString 现在直接实现 jsi::Buffer 接口,移除了 BigStringBuffer 中间层(目前处于废弃状态)。直接继承或依赖 BigStringBuffer 的代码可能需要进行更新。

JS 层面

应用内元素检查器(Element Inspector)中移除了旧版性能(Perf)和网络(Network)标签页,这些功能现已迁移至 React Native DevTools

废弃功能

本版本宣布两项功能废弃:

  1. 网络相关:XHRInterceptorWebSocketInterceptor API 被废弃,开发工具应改用 Chrome 开发者工具协议(CDP)的 Network 域。
  2. TurboModules:TurboModuleProviderFunctionType 被废弃。

致谢

React Native 0.84 包含来自 95 位贡献者的超过 650 次提交。感谢所有开发者的辛勤付出!

特别感谢为本版本做出重大贡献的开发者:

升级至 0.84 版本

提示:0.84 现已成为 React Native 的最新稳定版本,0.81.x 版本不再提供支持。更多详情请参阅 React Native 支持政策。

升级现有项目

除参考升级文档外,建议使用 React Native 升级助手(React Native Upgrade Helper)查看不同版本间的代码变更

新功能:可尝试社区 CLI 项目的实验性 upgrade-react-native AI 工具。

创建新项目

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

Expo 项目

React Native 0.84 将随 expo@canary 版本提供。下一个 SDK(SDK 56)将搭载 React Native 的下一个稳定版本 0.85 发布。