Hermes:是什么、功能及 React Native 优化

作者: IT Sectr 发布日期: 2026-06-04 阅读时间: 9 分钟

Hermes — 是一个开源 JavaScript 引擎,专门为 React Native 开发并针对移动设备进行了优化。与 JavaScriptCore 不同,Hermes 在构建阶段预先将 JS 代码编译为字节码,确保应用程序快速启动。根据 Meta, Hermes Docs, 2024,从 0.70 版本开始,Hermes 在 React Native 中默认使用。

要点

  • Hermes — 来自 Meta 的 JavaScript 引擎,针对 React Native 进行了优化。
  • 字节码 — JS 代码在应用程序构建阶段预先编译。
  • 启动速度 — 没有 JIT 编译可将启动时间缩短 50%。
  • 内存 — Hermes 比 JSC 少消耗 30–40% 的内存。
  • 默认 — 在 React Native 0.70+ 中用于所有新项目。

什么是 Hermes?

Hermes — 是一个紧凑的 JavaScript 引擎,由 Meta 团队专门为 React Native 创建。它于 2019 年作为 React Native 中默认使用的 JavaScriptCore (JSC) 的替代品而发布。Hermes 的主要目标是在移动设备上(尤其是资源有限的 Android 设备)确保应用程序尽可能快地启动。

Hermes 的关键特性是预先编译 (AOT — Ahead-of-Time)。与在运行时编译代码的传统 JS 引擎 (JIT — Just-in-Time) 不同,Hermes 在应用程序构建阶段就已经将 JavaScript 编译为字节码。这意味着设备上不进行编译 — 字节码由 Hermes 虚拟机立即执行。

Hermes 不是通用的 JS 引擎 — 它专门针对 React Native 场景进行了优化。它没有移动开发中不需要的功能:eval、生成器、一些 ES6 特性。这使得引擎更加紧凑和快速。根据 Meta 的数据,Hermes 压缩后的大小约为 200–300 KB,远小于 JSC(约 2–3 MB)。

Hermes 架构和字节码

Hermes 的架构与传统 JS 引擎不同,它没有 JIT 编译器。取而代之的是,Hermes 使用高效的虚拟机 (VM) 来执行预先编译的字节码。放弃 JIT 有三个关键优势:可预测的性能、更低的内存消耗和缩短的启动时间。

Hermes 字节码是 JavaScript 代码的紧凑表示形式,针对快速执行进行了优化。在构建阶段(通过 Metro),JavaScript 文件被编译为 .hbc (Hermes Bytecode) 文件。应用程序加载这些文件,Hermes VM 无需额外编译即可执行它们。构建过程通过 hermes-transformer 插件集成到 Metro 中。

代码处理阶段

Hermes 中的 JavaScript 处理过程包括三个阶段:Parse — 源代码的语法分析,Compile — 翻译为字节码,Execute — 虚拟机执行字节码。前两个阶段在构建阶段执行,第三个阶段在设备上执行。这与 JSC 根本不同,JSC 的所有三个阶段都在设备上执行。

bash
# 在构建期间编译 Hermes 字节码
hermes -emit-binary -out index.hbc index.js

# 检查生成的字节码大小
ls -lh index.hbc

# 显示字节码统计信息
hermes -dump-bytecode index.hbc

# 为生产优化字节码
hermes -O index.js -emit-binary -O target.hbc

编译后,所有 .hbc 文件与原生代码一起打包到 APK 或 IPA 中。应用程序启动时,Hermes VM 加载字节码并几乎立即开始执行 — 不需要 V8 和 JSC 典型的 JIT 预热时间。

Hermes vs JSC:对比

比较 Hermes 和 JavaScriptCore (JSC) 有助于理解何时选择哪个引擎。JSC — 来自 Apple 的全功能 JS 引擎,用于 Safari。Hermes — 针对 React Native 的专用引擎。在它们之间进行选择取决于项目的优先级。

特性HermesJavaScriptCore
编译AOT(构建阶段)JIT(设备上)
启动时间50–100 毫秒200–400 毫秒
内存消耗少 30–40%基准水平
大小~250 KB(压缩)~2 MB(压缩)
ES6+ 支持有限完整

Hermes 在启动速度和内存消耗方面胜出,但在复杂计算的执行性能上落后于 JSC。JSC 的 JIT 编译在运行时优化热点代码,这在 CPU 密集型操作中具有优势。对于典型的 React Native 应用程序,其中 UI 更新和导航是主要负载,Hermes 凭借快速启动提供了更好的用户体验。

Hermes 对 React Native 的优化

Hermes 包含多项针对 React Native 的优化。其中最主要的是与 JSI (JavaScript Interface) 的集成。Hermes 原生支持 JSI,这使得无需额外层即可使用新的 React Native 架构(Fabric + Turbo Module)。这使 Hermes 和新架构成为实现最大性能的理想组合。

内存管理

Hermes 使用针对移动设备优化的分代垃圾回收器 (generational GC)。与 JSC 不同,JSC 的垃圾回收可能导致 UI 出现明显的暂停 (jank),而 Hermes 在帧之间以小批量执行 GC,最大限度地减少了对用户体验的影响。据 Meta 称,在典型的 React Native 场景中,Hermes 的 GC 暂停时间比 JSC 短 2–3 倍。

延迟加载和常量

Hermes 支持模块的延迟加载 — JavaScript 模块仅在真正需要时才编译。这减少了字节码的大小并加快了启动速度。此外,Hermes 在编译阶段计算常量表达式,在可能的情况下用常量值替换函数调用。

js
// Hermes 特定优化示例

// 1. Hermes 内联常量表达式
const TAX_RATE = 0.07;
const price = 100;
// Hermes 预计算:TAX_RATE * price 在编译期间
const totalWithTax = price * (1 + TAX_RATE);

// 2. Hermes 优化属性访问链
const config = { api: { timeout: 5000 } };
// Hermes 内部缓存 config.api 访问
const timeout = config.api.timeout;
fetch(url, { timeout });

需要注意的是,Hermes 支持通过 Chrome DevTools 进行调试(从 Hermes 0.12 版本开始)。开发人员可以使用熟悉的工具:断点、内存分析、变量检查。这消除了早期版本中对 Hermes 的主要反对意见之一,当时调试功能有限。

在 React Native 项目中配置 Hermes

Hermes 的配置取决于 React Native 的版本。从 React Native 0.70 开始,新项目默认启用 Hermes。对于之前创建的项目或需要在引擎之间切换时,配置通过构建设置进行。

Android 的配置

对于 Android,Hermes 在 android/app/build.gradle 文件中通过 hermesEnabled 标志启用。对于 iOS,在 Podfile 中通过 :hermes_enabled 变量进行配置。更改配置后,需要重新安装 pod 并重新构建项目。

groovy
// android/app/build.gradle — 启用 Hermes
project.ext.react = [
    enableHermes: true
]

// iOS Podfile — 启用 Hermes
hermes_enabled = true
pod 'hermes-engine'

要检查 Hermes 是否在应用程序中使用,请在 Android 上运行 adb logcat | grep Hermes 或在 iOS 上检查 Xcode 控制台。应用程序启动时,Hermes 会显示 “Hermes VM initialized” 或类似消息。您还可以在 JavaScript 代码中运行 globalThis.HermesInternal — 如果 Hermes 处于活动状态,此属性将可用。

js
// 检查 Hermes 是否正在运行
if (typeof globalThis.HermesInternal !== 'undefined') {
  console.log('✅ Hermes 引擎已激活');
  console.log(
    '版本:',
    globalThis.HermesInternal.getEngineProperties()
  );
} else {
  console.log('❌ Hermes 未激活(回退到 JSC)');
}

常见问题

Hermes 是否与新的 React Native 架构兼容?

是的,Hermes 与新的 React Native 架构(Fabric + Turbo Module)完全兼容。此外,Hermes 和 JSI 是共同开发的,配合使用可提供最佳性能。

可以在 iOS 上使用 Hermes 吗?

是的,Hermes 支持两个平台 — iOS 和 Android。在 iOS 上,Hermes 取代了标准的 JavaScriptCore,提供相同的优势:快速启动和更低的内存消耗。

Hermes 是否支持所有 ES6+ 功能?

Hermes 支持大多数 ES6+ 功能,但有限制:缺少 eval、生成器和 Proxy。建议使用 Babel 转译以确保兼容性,就像在普通 React Native 中一样。

Hermes 如何影响应用程序大小?

Hermes 通过紧凑的字节码和引擎本身更小的尺寸来减小应用程序的大小。字节码通常比相应的 JS 代码紧凑 20–30%,引擎本身只有 ~250 KB,而 JSC 约为 ~2 MB。

如果库与 Hermes 不兼容怎么办?

大多数库与 Hermes 兼容。如果库使用了 eval、Proxy 或非标准功能 — 请检查是否有与 Hermes 兼容的版本。您还可以使用 Babel 插件来替换不支持的构造。

总结

  • Hermes — 来自 Meta 的 JavaScript 引擎,针对 React Native 应用程序的快速启动进行了优化。
  • AOT 编译 — JS 代码在构建阶段编译为字节码,消除了设备上的 JIT 开销。
  • 性能 — 与 JSC 相比,启动时间减少 50%,内存消耗减少 30–40%。
  • 大小 — Hermes 占用约 ~250 KB(压缩),比 JSC 小 8–10 倍。
  • 兼容性 — Hermes 支持 JSI 和新的 React Native 架构,包括 Fabric 和 Turbo Module。
  • 调试 — 可通过 Chrome DevTools 进行调试,包括断点和分析。
  • 建议 — 从 0.70+ 版本开始,在所有 React Native 项目中使用 Hermes,以获得移动设备上的最佳性能。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读