内容提要
Expo Harmony 项目旨在让 Expo 应用低成本适配 HarmonyOS。它复用官方 JS API,以 ArkTS 补齐原生模块,并实现兼容 Expo Modules API 的运行时、Autolinking 和 CLI 工具链,支持 CNG 与 Bare 模式,使开发者无需大改业务代码即可完成鸿蒙化。
延伸解读
复用官方 JS API 的适配思路
Expo Harmony 没有重新实现一套 Expo 的 JS API,而是直接复用官方实现,在 HarmonyOS 侧用 ArkTS 补齐对应的原生模块。只要模块名称、接口和行为与官方一致,原有 JS 代码仍可通过 requireNativeModule 获取模块,平台差异被封装在原生实现内部。这种设计让业务侧无需修改代码即可复用同一套 Expo API,迁移成本大幅降低。
运行时与 Autolinking 的关键作用
仅实现 ArkTS 模块还不够,Expo 模块依赖 Expo Modules API 提供的注册、调用、事件、Native View 等运行时能力。Expo Harmony 实现了兼容官方 API 的运行时,基于 RNOH 的 TurboModule 和 JSI 接入,使模块能挂载到 globalThis.expo.modules。同时,HarmonyOS 版 Autolinking 自动扫描依赖、生成注册代码并处理构建依赖,开发者安装 @expo-harmony/expo-* 包后通常无需手动链接和注册。
CNG 模式降低原生工程维护负担
Expo Harmony 支持 Continuous Native Generation,让 HarmonyOS 原生工程从 Expo 配置按需生成,而非长期手工维护。它扩展了 Config Plugin 机制,实现 HarmonyOS 配置字段和 Base Mods,Prebuild 阶段将 app.json 等配置转换为 AppScope、module.json5、资源文件、Hvigor 配置等。harmony/ 目录成为配置和依赖的派生结果,增加权限或安装新模块后重新 Prebuild 即可,还提供 --cl
CLI 工具链统一开发流程
Expo Harmony 实现了 @expo-harmony/cli,将 HarmonyOS 开发涉及的 Metro、Hvigor、HDC 等工具统一组织,提供 start、prebuild、build、run、doctor 等命令。以 run 为例,它会依次处理项目检查、原生工程准备、设备选择、HAP 构建、Metro 启动与端口映射、安装和启动。CLI 还协调不同工具链,如自动 Prebuild、检测配置差异、执行 Autolinking,并通过 doctor 检查 RNOH、HarmonyOS SDK 等依赖
Q&A
Expo Harmony 是什么?它主要解决什么问题?
Expo Harmony 是一个让 Expo 应用低成本适配 HarmonyOS 的项目。它旨在解决 Expo 生态在 HarmonyOS 上支持几乎为零的问题,使开发者能以极少的代码改动,复用现有 Expo 项目的业务代码为应用增加 HarmonyOS 支持。
Expo Harmony 如何做到让开发者几乎不用改业务代码就能适配鸿蒙?
它没有重新实现一套 Expo 的 JS API,而是尽可能直接复用官方实现,并在 HarmonyOS 侧使用 ArkTS 补齐对应的原生模块。只要模块名称、接口和行为与官方实现保持一致,原有 JS 代码依然可以通过 requireNativeModule("ModuleName") 获取模块,从而把平台差异封装在原生实现内部,业务侧无需修改代码。
Expo Harmony 支持哪些接入模式?分别有什么特点?
支持 Expo CNG 和 Bare 两种接入模式。CNG 通过配置生成 HarmonyOS 原生工程,省去人工维护,还支持通过 patch-project 自定义可持久化地修改生成后的原生工程;Bare Installation 允许开发者在已有的 RNOH 原生工程中集成 Expo Harmony。
Expo Harmony 的 CLI 工具链提供了哪些命令和功能?
提供了 @expo-harmony/cli,包含 start、prebuild、build、run、doctor 等统一命令。以 run 为例,它会依次处理项目状态检查、原生工程准备、设备或模拟器选择、HAP 构建、Metro 启动与端口映射、应用安装和启动等步骤。doctor 可提前检查 RNOH、HarmonyOS SDK、OHPM、Hvigor、HDC 和 Expo Modules 等依赖是否满足要求。
Expo Harmony 如何支持 Continuous Native Generation(CNG)?
它扩展了 Expo 的 Config Plugin 机制,实现了 HarmonyOS 对应的配置字段和 Base Mods。开发者通过 app.json、app.config.js 及 Config Plugin 描述原生能力,Prebuild 阶段由 @expo-harmony/prebuild-config 生成 AppScope、Entry Module、module.json5、资源文件、Hvigor 配置、CMake 和 RNOH 相关代码,并执行 Autolinking。harmony/ 目录成为配置和依赖的派生结果,可随时重新生成,还提供 --clean 和 --check 选项。
Expo Harmony 的 Autolinking 是如何工作的?
项目实现了 HarmonyOS 版本的 Expo Modules Autolinking。各个模块只需在配置中声明自己的 HarmonyOS 原生实现,Autolinking 会自动扫描依赖、收集模块信息、生成注册代码,并处理 HAR、RNOH Package 和相关构建依赖,最终将模块统一交给 expo-modules-core 初始化。开发者安装对应的 @expo-harmony/expo-* 包后,通常不需要再逐个处理原生模块的链接和注册。