1. 为什么要在React Native里写鸿蒙组件?这件事值不值得做
最近很多React Native技术群都在聊鸿蒙适配,私信里问得最多的问题就是:RN项目到底能不能直接跑在HarmonyOS上?能不能在RN里写一个真正的鸿蒙原生组件?先说结论:能,而且现在已经有比较成熟的落地路径。
这件事的背景其实很直白。鸿蒙生态的设备量起来之后,很多团队面临一个现实问题:业务要覆盖鸿蒙,但又不想为了一套独立的UI代码单独养一个原生开发团队。React Native作为跨端方案,天然适合做这件事。RN本身只负责JS逻辑和视图树的构建,真正渲染到屏幕上的UI,在鸿蒙平台上就是HarmonyOS的原生组件。换句话说,你在RN里写的每一个自定义组件,最终都可能落地成一个鸿蒙原生组件,也就是大家常说的“鸿组件”。
这篇文章我不会讲太多空泛的概念,而是直接带你走一遍完整的实操路径:从React Native和鸿蒙的桥接原理,到工程搭建、自定义组件开发、事件通信、分布式适配,最后再整理几个我实际踩过的坑。适合两类人看:一类是有React Native基础、想扩展鸿蒙能力的跨端开发者,另一类是刚接触鸿蒙开发、但对RN架构不陌生的原生开发者。看完之后,你应该能自己动手在RN工程里跑起一个鸿蒙原生组件。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开搞前的认知补齐:RN与鸿蒙到底是怎么接上的
2.1 HarmonyOS的组件体系你至少要知道这些
以前做安卓自定义View,你只需要关心Java/Kotlin和View体系。鸿蒙这边不一样,它从底层就是多语言混合的架构。一个完整的鸿蒙应用,通常会同时涉及ArkTS、C++和资源文件三部分。
先看ArkTS。它基本就是TypeScript的超集,语法上对前端和RN开发者极度友好。UI描述用的是声明式写法,类似SwiftUI和Flutter的结合体。一个典型的鸿蒙页面长这样:
typescript复制@Entry
@Component
struct HomePage {
build() {
Column({ space: 10 }) {
Text('Hello HarmonyOS')
.fontSize(20)
.fontWeight(FontWeight.Bold)
Button('点击')
.onClick(() => {
// 事件处理
})
}
.width('100%')
.padding(16)
}
}
这里有三个东西你必须记住:@Entry表示页面入口,@Component表示这是一个组件,build()里面描述UI结构。你不需要一开始就掌握所有装饰器,但@Component和@Builder这两个你得认识,因为RN自定义组件最终映射的就是它们。
再看C++层。鸿蒙的三方库和底层能力很多是用C++写的,RN在鸿蒙上的适配层也大量依赖C++。比如你后面要写一个高性能的原生组件,C++侧需要实现对应的组件描述器,ArkTS侧只负责暴露给RN的JS层调用。这个后面实操的时候会具体展开。
最后是资源文件。鸿蒙的资源目录以resources为根,下面按base/element、base/media等目录组织。字符串、颜色、图片这些都放在里面。RN组件如果在鸿蒙侧需要用到本地资源,路径引用方式和安卓略有区别,后面排坑环节我会专门提到。
2.2 React Native在鸿蒙上的运行架构:RNOH是什么
React Native本身并没有直接支持鸿蒙,社区里做这件事的核心工程叫React Native OpenHarmony,简写RNOH。它做的工作相当于把RN的C++渲染层重新适配到了鸿蒙的ArkUI框架上。
一句话概括它的架构:RN的JS业务代码在鸿蒙上跑在ArkTS运行时之上,RN的C++核心层通过RNOH提供的中转模块,把视图创建、布局计算、事件分发这些操作映射到ArkUI的原生组件上。你在RN里写的<View>、<Text>,在鸿蒙端实际上被创建成了对应的鸿蒙原生组件实例。
这个架构带来一个直接的好处:你不需要为了让RN跑起来而重写业务逻辑,大部分RN生态的JS库都能直接用。坏处也很明显——性能瓶颈容易出现在JS线程和原生线程的通信上,后面调优那节我会具体说怎么定位这类问题。
还有一点值得提前说清楚。RNOH目前的主线版本是跟随RN官方版本走的,比如适配RN 0.72、0.73这样的版本。所以你在选型的时候,不要盲目追新,建议先确认你当前项目的RN版本有没有对应的RNOH版本支持。版本对不上,后面会遇到一堆莫名其妙的问题。
3. 搭建工程:从RN仓库到鸿蒙原生工程
3.1 初始化RN项目和鸿蒙工程
实测下来,最省事的方案是直接使用RNOH提供的空工程模板,而不是自己手动拼接。整个流程分几步:
第一步,准备好基础环境。你需要Node.js、JDK 17、DevEco Studio以及配套的HarmonyOS SDK。DevEco Studio建议直接用新版本,鸿蒙API版本至少12起步,太老的API在RNOH适配上有不少坑。
第二步,在DevEco Studio里创建一个空的HarmonyOS工程,包名、签名信息先按你自己的业务域填好。注意,鸿蒙工程的模块结构默认是entry,RN代码最终会被打进这个entry模块里运行。
第三步,拉取RNOH仓库,把核心库和模板工程都下载下来。这里不建议手动复制文件,直接用仓库里的初始化脚本会少踩很多坑。脚本会把RN依赖、鸿蒙端的三方库引用、以及JS侧
