本文档介绍了 Hermes JavaScript 引擎如何集成到 React Native 中。它涵盖了 Hermes 在不同平台的构建过程、Hermes 工件如何与 React Native 打包,以及 Hermes 在 React Native 架构中的运行时集成。
有关原生模块与 JavaScript 接口的信息,请参阅 TurboModule 系统。
Hermes 是 Meta 专为 React Native 开发的、针对移动应用程序优化的 JavaScript 引擎。与 JSC(JavaScriptCore)等其他 JavaScript 引擎相比,它能提供更快的启动时间、更低的内存占用和更小的应用体积。
来源
Hermes 的构建过程为多个平台(iOS、Android、macOS、Windows)生成二进制文件,并集成到 React Native 的构建系统中。
来源
React Native 使用 GitHub Actions 为其 CI/CD 流程中不同平台的 Hermes 进行构建。工作流包含几个关键步骤:
| 作业 | 描述 | 依赖项 |
|---|---|---|
prepare_hermes_workspace | 设置 Hermes 工作区并确定版本 | 无 |
build_hermesc_apple | 为 Apple 平台构建 Hermes 编译器 | prepare_hermes_workspace |
build_apple_slices_hermes | 为各种 Apple 平台(iOS、macOS 等)构建 Hermes | build_hermesc_apple |
build_hermes_macos | 为 macOS 打包 Hermes | build_apple_slices_hermes |
build_hermesc_linux | 为 Linux 构建 Hermes 编译器 | prepare_hermes_workspace |
build_hermesc_windows | 为 Windows 构建 Hermes 编译器 | prepare_hermes_workspace |
build_npm_package | 将 Hermes 工件打包到 React Native npm 包中 | 所有 Hermes 构建作业 |
来源
CI 过程中构建的 Hermes 二进制文件会被打包到 React Native npm 包中。这由工作流中的 build_npm_package 作业处理。
来源
Hermes 二进制文件存储在 React Native 包内的特定位置:
packages/react-native/sdks/hermesc/{platform}-bin/packages/react-native/ReactAndroid/external-artifacts/artifacts/packages/react-native/ReactAndroid/external-artifacts/artifacts/来源
在 Android 上,Hermes 被包含为一个原生库(libhermes.so),在 React Native 初始化时在运行时加载。
集成通过几个关键组件实现:
来源
在 iOS 上,Hermes 被集成作为一个框架,通过 CocoaPods 进行链接。
React Native 的 CocoaPods 设置根据 USE_HERMES 环境变量条件性地包含 Hermes。
来源
Hermes 使用 CMake 集成到 React Native 的构建系统中。该集成支持 Hermes 的构建过程和运行时链接。
来源
Hermes 可以通过 React Native 中的功能标志来启用或禁用。默认情况下使用 Hermes,但也可以切换到 JavaScriptCore。
在 Android 上,Hermes 可以通过 DefaultNewArchitectureEntryPoint.load() 方法控制。
在 iOS 上,Hermes 可以通过 Podfile 中的环境变量进行控制。
来源
React Native 包含全面的测试套件,以验证 Hermes 在各个平台上的集成情况。
CI 过程包含端到端测试,以验证 Hermes 集成是否正常工作。
| 测试 | 平台 | 描述 |
|---|---|---|
test_e2e_ios_rntester | iOS | 在 iOS 上测试 RNTester 应用与 Hermes |
test_e2e_android_rntester | Android | 在 Android 上测试 RNTester 应用与 Hermes |
test_ios_helloworld | iOS | 在 iOS 上测试 HelloWorld 模板与 Hermes |
test_android_helloworld | Android | 在 Android 上测试 HelloWorld 模板与 Hermes |
来源
Hermes 集成的常见问题包括:
要调试 Hermes 问题,检查原生日志通常能提供有关运行时错误和崩溃的宝贵信息。
来源