跳至主内容

React Native 0.84 - 默认启用 Hermes V1

· 1 分钟阅读
Alex Hunt
Alex Hunt
Software Engineer @ Meta
Alan Lee
Alan Lee
Software Engineer @ Meta
Christian Falch
Christian Falch
Software Engineer @ Expo
Gabriel Donadel Dall'Agnol
Gabriel Donadel Dall'Agnol
Software Engineer @ Expo
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

今天我们很高兴发布 React Native 0.84!

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

重点更新

默认启用 Hermes V1

Hermes V1 现已成为 React Native 在 iOS 和 Android 上的默认 JavaScript 引擎,这是在 React Native 0.82 中首次作为实验性可选功能后的正式默认。

Hermes V1 代表了 Hermes 引擎的下一代演进,其编译器和虚拟机均得到显著改进,从而带来可衡量的 JavaScript 性能提升。

这对您的应用意味着什么

  • 自动性能提升:所有应用默认使用 Hermes V1,带来更快的执行速度和更低的内存占用。

  • 无需迁移:如果您已经在使用 Hermes(自 0.70 起为默认引擎),将自动升级到 Hermes V1,无需更改配置。

Opting out from Hermes V1

Package manager override

Force the installation of the legacy hermes-compiler package in your package.json:

package.json
"overrides": { "hermes-compiler": "0.15.0" }

iOS

When installing CocoaPods dependencies, pass the RCT_HERMES_V1_ENABLED=0 and RCT_USE_PREBUILT_RNCORE=0 environment variables.

Android

Add hermesV1Enabled=false inside the android/gradle.properties file, and configure the application to build React Native from source.

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

React Native 0.84 现在默认提供预编译的 iOS 二进制文件。此前作为可选功能引入,现在开箱即用,可显著缩短 iOS 应用的构建时间。

这意味着您不再需要在每次执行 clean build 时从源代码编译 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 构建中,从而减少了构建时间和应用体积。

对于已采用新架构的应用,预计不会出现中断问题 —— 兼容所需的互操作层代码仍保留在原位。

Re-enabling Legacy Architecture code on iOS

If you need to re-enable Legacy Architecture code in your iOS builds, you'll need to build from source. Install CocoaPods dependencies with the following flags:

RCT_USE_PREBUILT_RNCORE=0 RCT_REMOVE_LEGACY_ARCH=0 bundle exec pod install

Android 平台变更

Removed Legacy Architecture classes

The following classes have been removed in this release:

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 特性的支持。

在升级前请务必更新您的 Node.js 版本。我们推荐使用 Node 版本管理器(例如 nvmfnm)来管理 Node 版本。

其他变更

React 19.2.3

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

ESLint v9 扁平化配置

React Native 的 ESLint 配置现在支持 ESLint v9 扁平化配置,让您能更轻松地在项目中采用最新的 ESLint 工具。

平台支持

  • 图片格式:React Native 0.84 新增了对更多图片格式(HEIC 和 HEIF)的支持,让处理现代相机输出和图片库更加便捷。

  • PlatformColor:增强了对 PlatformColor 在动画插值和输出范围中的测试和支持。

  • Android 键盘事件:在 Android 上新增了 onKeyDown/onKeyUp 支持,使得可以处理硬件键盘和电视遥控器的键盘事件。

无障碍

带有 onPressonLongPress 处理函数的文本组件现在会自动获得 accessibilityRole="link",以改进无障碍支持,确保屏幕阅读器能正确播报可交互的文本元素。

在 Android 上,我们进行了大量工作来修复回收视图的无障碍状态问题 —— 确保当视图被回收时 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

  • 已从应用内元素检查器中移除了传统的 Perf 和 Network 选项卡,因为这些功能现在可在 React Native DevTools 中使用。

请在 0.84 的 CHANGELOG 中查看完整的破坏性变更列表。

弃用项

此版本包含两项弃用:

  • 网络: XHRInterceptorWebSocketInterceptor API 已弃用。开发者工具应改用 Chrome DevTools 协议 (CDP) 的 Network 域。

  • TurboModulesTurboModuleProviderFunctionType 已弃用。

致谢

React Native 0.84 包含了来自 95 位贡献者的超过 650 次提交。感谢大家的辛勤工作!

我们想特别感谢在此版本中做出重大贡献的各位:

升级到 0.84

信息

0.84 现已成为 React Native 的最新稳定版本,0.81.x 版本将不再受支持。更多信息请参阅 React Native 的支持政策

升级指南

请使用 React Native 升级助手 查看现有项目在不同 React Native 版本间的代码变更,并参考 升级文档

💡 新功能:尝试实验性的 upgrade-react-native AI 技能(适用于 Community CLI 项目)

创建新项目

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

Expo

对于 Expo 项目,React Native 0.84 将在 expo@canary 版本中提供。下一个 SDK,即 SDK 56,将随 React Native 的下一个稳定版本 0.85 一起发布。