你以为 Taro 只能编译到小程序?RNOH 今天把它的边界推到了鸿蒙原生应用

团队用 Taro 跑了三年微信、抖音、支付宝三端,现在要上鸿蒙——结果发现 Taro 在鸿蒙上只能跑 WebView,应用市场上那套「纯血鸿蒙」根本沾不上边。

这不是 Taro 的问题,是之前的架构选择。Taro 对鸿蒙的适配只到 H5 编译目标,相当于给浏览器打了个包,和真正调用鸿蒙原生能力的 App 差了十万八千里。团队要么重招一个 ArkTS 团队从头写,要么把三端积累的业务逻辑扔掉,用鸿蒙原生重新来过。

这件事今天被 RNOHReact Native OpenHarmony)彻底接上了。

RNOH 是什么

RNOH 是社区和华为共建的 React Native 适配层,把 Meta 的 React Native 完整移植到鸿蒙系统。核心区别在于它不走 WebView,用的是 Fabric 架构下的 C-API 直连——JSX 组件直接映射为鸿蒙原生 ArkUI 控件,渲染不走浏览器内核,走的是鸿蒙自己的图形引擎。

这意味着两件事:第一,前端工程师不需要学 ArkTS,用熟悉的 React + TypeScript 写业务;第二,产出的不是 Web 应用,是可以上架华为应用市场的原生 hap 包。

对 Taro 用户来说,RNOH 的关键在于它解决的不是「如何写鸿蒙」,而是「如何让现有的 Taro 代码跑在鸿蒙原生上」。

Taro 4 + RNOH 的具体接法

来看一个已经落地的 Monorepo 方案,目录结构长这样:

packages/
  shared/          # 跨端通用纯 TS 内核
    types/         # API 响应结构、分页定义
    constants/     # 枚举、全局常量
    utils/         # 纯函数
    http/          # HttpClient 契约接口
    services/      # 工厂模式 API 服务
    store/slices/  # Redux Toolkit Slices 业务流
apps/
  miniapp/         # Taro 4.2.1 → 微信/抖音/支付宝 + H5
  rnoh-app/        # React Native 0.82 + RNOH → 鸿蒙 Next/Android/iOS

关键设计原则:什么坚决下沉,什么严禁共享

✅ 坚决下沉到 shared:

  • types/:统一 API 响应结构(ApiResponse)、分页定义、实体模型
  • http/:平台无关的 HttpClient 契约接口
  • services/:工厂模式 API 服务函数
  • store/slices/:Redux Toolkit Slices 业务状态流
  • utils/:纯函数,零平台依赖

❌ 严禁放入 shared:

  • 平台特定的 UI(Taro Components vs React Native Components)
  • 平台特定的路由(Taro 页面栈 vs React Navigation)
  • 平台特有的原生 API(相机调用、文件沙箱等)

网络层的适配是这里最值得看的地方。小程序端只能走 Taro.request,App 端走 Axios,但两端的 API 调用代码可以完全一样,靠的是在 shared 层定义一个 HttpClient 契约接口:

// shared/http/types.ts
interface HttpClient {
  get<T>(url: string, config?: RequestConfig): Promise<T>
  post<T>(url: string, data: unknown, config?: RequestConfig): Promise<T>
}

// miniapp/services/http.ts(小程序适配)
import Taro from @tarojs/taro
export const httpClient: HttpClient = {
  get: (url, config) => Taro.request({ url, method: GET, ...config }),
  post: (url, data, config) => Taro.request({ url, method: POST, data, ...config }),
}

// rnoh-app/services/http.ts(App 适配)
import axios from axios
export const httpClient: HttpClient = {
  get: (url, config) => axios.get(url, config),
  post: (url, data, config) => axios.post(url, data, config),
}

业务层调用的始终是同一个 httpClient,两端的适配器各自实现,零侵入。

三步落地路径

第一步:拆出 shared 层。先不动 UI,把现有 Taro 项目里的 types、constants、utils、http 契约、Redux store 提取到一个独立的 shared 包里,用 pnpm-workspace 管理。这一步的验证标准是——两端都能跑同一套 API 调用代码。

第二步:RNOH 接入。在现有 React Native 项目里引入 RNOH 0.82(基于 Fabric C-API 架构),验证能否正常渲染现有 RN 组件。京东 APP 核心购物链路已经在这条路上跑通过了,属于 S 级应用认证过的方案。

第三步:UI 适配层建立。Taro Components 在小程序端的组件和 RNOH 端的 React Native 组件,接口相同但实现不同。这一层需要逐个页面过一遍,原则是:能用 shared 解决的逻辑绝不在平台层硬写。

和竞品的对比

Taro 不是这条路唯一的探索者。uni-app 靠 Vue 生态和小程序全覆盖打天下,2026 年的新版本已经在推 UTS 编译到原生 Kotlin/Swift/ArkTS,性能差距在缩小。但对 React 技术栈的团队来说,Taro + RNOH 是目前最直接的路——不需要换框架,不需要重学 Vue,也不需要在 Taro 和 RN 之间二选一。

Flutter 在性能上仍然是天花板,但学习 Dart 的成本和国内小程序生态的适配成熟度是另一道门槛。RNOH 则选择了「复用现有 React 资产」这条中间路线。

下一步可落地的事情

今天就可以做一件事:打开你的 Taro 项目,用上面那个「坚决下沉 vs 严禁共享」的框架审计一遍现有代码,数一数有多少平台特定的逻辑混在了共享层里。这个数字决定了你迁移到多端架构的真实成本。

配了三年的 Taro,边界今天被 RNOH 推到了原生鸿蒙。下一步不是重写,是先拆清楚。

评论区

0 条评论

登录后可评论。

阿跨·跨端开发 13 阅读