Windows 11 OpenHarmony版React Native开发环境搭建完整指南

📝 适合人群 :React Native 开发者、HarmonyOS 应用开发者

⏱️ 预计时间 :2-3 小时(包含下载和配置时间)

🎯 学习目标:成功搭建 React Native for OpenHarmony 开发环境


📖 什么是 React Native for OpenHarmony?

React Native 是 Facebook(Meta)开发的跨平台移动应用开发框架,可以用 JavaScript 和 React 开发原生应用。

React Native for OpenHarmony 是 React Native 针对 OpenHarmony/HarmonyOS 系统的适配版本,让你可以用 React Native 开发 HarmonyOS 应用。

主要优势

  • ✅ 一套代码,多平台运行(Android、iOS、HarmonyOS)
  • ✅ 使用熟悉的 React 和 JavaScript 技术栈
  • ✅ 接近原生应用的性能
  • ✅ 热重载,快速开发调试

🖥️ 测试环境

本文档基于以下环境进行测试:

  • 💻 设备规格
    • 处理器:13th Gen Intel® Core™ i5-13500H (3.19 GHz)
    • 内存:16.0 GB
    • 系统类型:64 位操作系统, 基于 x64 的处理器
  • 🪟 Windows规格
    • 版本:Windows 11 家庭版
    • 版本号:25H2

📋 前置条件

在开始搭建环境之前,请确保已经完成以下软件的安装:

⚠️ 重要提示

  • 请按照顺序完成前置软件的安装,特别是 DevEco Studio 和 Git,它们是必需的
  • 确保 DevEco Studio 已下载并配置好 OpenHarmony SDK
  • 确保 Node.js 已安装(建议版本 16 或以上)

📋 安装前准备

在开始之前,请确保:

  • ✅ 已完成所有前置软件的安装
  • ✅ 已注册并实名认证华为开发者账号(用于签名和模拟器)
  • ✅ 网络连接正常(需要下载大量依赖包)
  • ✅ 至少 5 GB 可用磁盘空间
  • ✅ 管理员权限(配置环境变量需要)

💡 小提示:整个搭建过程需要下载约 2-3 GB 的文件,建议在网络较好的环境下进行。

⚙️ 第一步:配置开发环境

在开始创建项目之前,我们需要配置一些环境变量和工具,这些配置是 React Native for OpenHarmony 开发所必需的。


📌 步骤 1:配置 hdc 环境变量

hdc(HarmonyOS Device Connector)是 OpenHarmony 提供的命令行调试工具,用于连接真机进行调试。

找到 hdc 工具路径

hdc 工具位于 OpenHarmony SDK 的 toolchains 目录下,路径格式为:

复制代码
{DevEco Studio安装路径}/sdk/{SDK版本}/openharmony/toolchains

如何找到这个路径?

  1. 打开 DevEco Studio
  2. "File""Settings""OpenHarmony SDK"
  3. 查看 SDK Location,然后找到 openharmony/toolchains 目录

示例路径:

  • C:\Users\你的用户名\AppData\Local\Huawei\Sdk\default\openharmony\toolchains
  • D:\Tools\Huawei\Sdk\default\openharmony\toolchains
添加到 PATH 环境变量
  1. 🖱️ 右键点击 "开始" 按钮(或按 Win + X
  2. 👆 点击 "系统""高级系统设置""环境变量"
  3. 🔍 在 "系统变量" 区域,找到 "Path" 变量
  4. ✏️ 点击 "编辑",添加 hdc 工具的完整路径

💡 小提示 :确保路径正确,指向 toolchains 目录,这样系统才能找到 hdc.exe 命令。


📌 步骤 2:配置 HDC_SERVER_PORT 环境变量

hdc 需要一个端口来连接设备,我们需要配置端口号。

  1. ➕ 在 "系统变量" 区域,点击 "新建" 按钮

  2. 📝 填写变量信息:

    • 变量名HDC_SERVER_PORT
    • 变量值7035(或任意未被占用的端口号)
  3. ✅ 点击 "确定" 保存

💡 小提示 :端口号可以是任意未被占用的端口,7035 是常用的默认值。


📌 步骤 3:配置 CAPI 版本环境变量

当前 React Native for OpenHarmony 框架默认使用 CAPI(Component API)架构,需要配置环境变量来启用。

  1. ➕ 在 "系统变量" 区域,点击 "新建" 按钮

  2. 📝 填写变量信息:

    • 变量名RNOH_C_API_ARCH
    • 变量值1
  3. ✅ 点击 "确定" 保存

💡 小提示1 表示启用 CAPI 架构,这是当前推荐的架构方式。


📌 步骤 4:配置 npm 镜像源(可选但推荐)

为了加快 npm 包的下载速度,建议配置国内镜像源。

创建 .npmrc 文件
  1. 📁 打开文件资源管理器,导航到 C:\Users\你的用户名\

  2. 📝 如果没有 .npmrc 文件,创建一个新文件(注意文件名以点开头)

  3. ✏️ 编辑文件,添加以下内容:

    strict-ssl=false
    sslVerify=false
    registry=https://repo.huaweicloud.com/repository/npm/

⚠️ 安全提示 :关闭 SSL 证书校验可以加快下载速度,但会降低安全性。如果对安全性要求较高,可以只配置 registry,不关闭 SSL 校验。

清理 npm 缓存

配置完成后,在命令提示符中执行:

bash 复制代码
npm cache clean --force

⚠️ 重要提示 :修改 registry 后必须执行 npm cache clean --force 清理缓存,否则新的镜像源不会生效。


📌 步骤 5:验证环境配置

配置完成后,验证环境变量是否生效:

  1. 🔄 关闭所有已打开的命令提示符窗口

  2. 🆕 重新打开命令提示符

  3. ✅ 验证 hdc 命令:

bash 复制代码
hdc version

如果显示版本信息,说明 hdc 配置成功!

⚠️ 必须重新打开命令提示符:配置环境变量后,必须关闭所有已打开的命令提示符窗口,然后重新打开,环境变量才会生效!

📦 React Native 鸿蒙化版本信息

当前 React Native 鸿蒙版本基于社区 RN 0.72.5 进行适配,以下是版本信息:

核心包版本

名称 版本号
react-native-harmony.tgz 0.72.90
react-native-harmony-cli.tgz 0.0.37
react_native_openharmony-6.0.0.508.har 0.72.90
react_native_openharmony_release-6.0.0.508.har 6.0.0.508

配套工具版本

名称 版本号
DevEco Studio Deveco Studio 6.0.0.847SP1(配套SDK6.0.0.47(SP10))
HarmonyOS SDK HarmonyOS SDK 6.0.0.47(SP15)
手机ROM ALN-AL00 206.0.0.47(SP15DEVC00E47R4P6) ALN-AL80 206.0.0.47(SP15DEVC00E47R4P6) BRA-AL00 206.0.0.47(SP15DEVC00E47R4P4)

💡 重要提示

  • 该版本依赖的 OpenHarmony SDK 最低版本为 API 20
  • 目前 React Native for OpenHarmony 仅支持 0.72.5 版本的 React Native
  • 其他版本信息可查看 React Native For OpenHarmony 版本说明

⚠️ 约束条件

如果你需要自定义 CMakeLists.txt,请将 so 库命名为 rnoh_app

cmake 复制代码
add_library(rnoh_app SHARED
    ···
    "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
)

💡 小提示 :库名称必须为 rnoh_app,否则可能导致编译或运行错误。


🆕 第二步:创建 React Native 工程

现在开始创建第一个 React Native 项目。我们将使用 React Native 内置的命令行工具,它不需要单独安装,可以直接使用 Node.js 自带的 npx 命令。


📌 步骤 1:选择项目存储位置

  1. 📂 选择一个合适的目录来存放项目(例如:D:\ProjectsC:\Development

  2. 🖱️ 在该目录右键,点击 "在终端中打开""Open in Terminal"

  3. 📋 命令提示符会自动定位到当前目录

💡 小提示

  • 建议选择一个空间充足的磁盘位置
  • 路径中不要包含中文字符,避免潜在问题
  • 确保有足够的磁盘空间(至少 500 MB)

📌 步骤 2:创建 React Native 工程

执行以下命令创建新工程(以 AtomGitNews 为例,你可以替换为你自己的项目名称):

shell 复制代码
npx react-native@0.72.5 init AtomGitNews --version 0.72.5

⚠️ 重要提示 :必须使用 0.72.5 版本,这是目前 React Native for OpenHarmony 唯一支持的版本。


📌 步骤 3:确认安装

首次创建 React Native 工程时,会提示需要安装 react-native@0.72.5

  1. 📋 查看提示信息

  2. ✅ 按回车键确认安装

💡 小提示:这个过程可能需要几分钟,取决于网络速度。


📌 步骤 4:等待工程创建完成

等待工程创建完成,你会看到类似以下的输出:

🎉 恭喜! React Native 工程创建成功!
💡 小提示

  • 工程创建完成后,会自动安装依赖包
  • 如果依赖安装失败,可以进入项目目录后手动执行 npm install
  • 创建的项目已经包含了基本的 React Native 代码结构

📱 第三步:创建鸿蒙工程

React Native 工程创建完成后,我们需要创建一个对应的鸿蒙应用工程。这个工程将作为 React Native 代码在 HarmonyOS 平台上的载体。


📌 步骤 1:打开 DevEco Studio

  1. 🚀 启动 DevEco Studio

  2. 👆 在欢迎界面,点击 "Create Project" 按钮,打开工程创建向导


📌 步骤 2:选择工程模板

  1. 📋 在工程创建向导界面,选择 "Empty Ability" 模板

  2. 👆 点击 "Next" 按钮继续

💡 小提示:Empty Ability 是一个空的应用模板,适合集成 React Native。


📌 步骤 3:配置工程信息

  1. 📝 填写工程配置信息:

    • 工程名称:可以保持默认或自定义
    • 工程包名 :保持默认即可(例如:com.example.myapplication
    • 工程存储位置重要 - 选择 React Native 工程根目录,并设置子目录名称为 harmony
    • 最低兼容SDK版本:选择 API 20 或更高版本
    • 模块名称:保持默认即可
    • 设备类型 :选择 Phone(手机)
  2. ⚠️ 重要:工程存储位置必须设置为:

    复制代码
    {React Native工程根目录}/harmony

    例如:D:\Projects\AtomGitNews\harmony

⚠️ 重要提示

  • 鸿蒙工程必须创建在 React Native 工程根目录下
  • 目录名称必须为 harmony(小写)
  • 这样可以减少 bundle 文件的拷贝流程,简化开发

📌 步骤 4:完成工程创建

  1. ✅ 检查配置信息无误后,点击 "Finish" 按钮

  2. ⏳ 等待工程创建完成

🎉 恭喜! 鸿蒙工程创建成功!
💡 小提示:工程创建完成后,DevEco Studio 会自动打开项目,等待索引完成即可开始开发。

📦 第四步:安装鸿蒙依赖包并生成 bundle

现在我们需要为 React Native 工程安装 OpenHarmony 适配包,并配置 Metro 打包工具来生成 bundle 文件。


📌 步骤 1:添加 harmony 脚本

使用 VS Code 或其他工具打开创建的 AtomGitNews 工程,打开根目录下的 package.json 配置文件,在配置文件 scripts 属性中新增 OpenHarmony 依赖"harmony": "react-native bundle-harmony --dev"

json 复制代码
{
  "name": "AtomGitNews",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "android": "react-native run-android",
    "ios": "react-native run-ios",
    "lint": "eslint .",
    "start": "react-native start",
    "test": "jest",
    "harmony": "react-native bundle-harmony --dev"
  },
  "dependencies": {
    "react": "18.2.0",
    "react-native": "0.72.5"
  },
  "devDependencies": {
    "@babel/core": "^7.20.0",
    "@babel/preset-env": "^7.20.0",
    "@babel/runtime": "^7.20.0",
    "@react-native/eslint-config": "^0.72.2",
    "@react-native/metro-config": "^0.72.11",
    "@tsconfig/react-native": "^3.0.0",
    "@types/react": "^18.0.24",
    "@types/react-test-renderer": "^18.0.0",
    "babel-jest": "^29.2.1",
    "eslint": "^8.19.0",
    "jest": "^29.2.1",
    "metro-react-native-babel-preset": "0.76.8",
    "prettier": "^2.4.1",
    "react-test-renderer": "18.2.0",
    "typescript": "4.8.4"
  },
  "engines": {
    "node": ">=16"
  }
}

📌 步骤 2:安装鸿蒙化依赖包

  1. 📂 在 AtomGitNews 根目录下打开命令提示符工具

  2. 📥 执行以下命令安装依赖包(版本必须为 0.72.90):

bash 复制代码
npm i @react-native-oh/react-native-harmony@0.72.90

⚠️ 重要提示 :依赖包版本必须为 0.72.90,与 React Native 鸿蒙化版本信息保持一致。

  1. ⏳ 等待安装完成(可能需要几分钟)

💡 小提示

  • 如果安装失败,检查网络连接或尝试使用代理
  • 确保已配置 npm 镜像源(参考第一步)
  • 如果遇到权限问题,尝试以管理员身份运行命令提示符

📌 步骤 3:配置 Metro 打包工具

在执行生成 bundle 命令前,需要先为 React Native 工程配置 OpenHarmony 能力。打开工程根目录下的 metro.config.js 文件,增加 OpenHarmony 适配代码。

js 复制代码
const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
const {createHarmonyMetroConfig} = require("@react-native-oh/react-native-harmony/metro.config");

/**
 * Metro configuration
 * https://facebook.github.io/metro/docs/configuration
 *
 * @type {import('metro-config').MetroConfig}
 */
const config = {
    transformer: {
        getTransformOptions: async () => ({
            transform: {
                experimentalImportSupport: false,
                inlineRequires: true
            }
        })
    }
};

module.exports = mergeConfig(getDefaultConfig(__dirname), createHarmonyMetroConfig({
    reactNativeHarmonyPackageName: '@react-native-oh/react-native-harmony'
}), config);

📌 步骤 4:生成 bundle 文件

  1. 📂 在工程 AtomGitNews 根目录下打开命令提示符窗口

  2. 🚀 输入以下命令生成 bundle 文件:

bash 复制代码
npm run harmony
  1. ⏳ 等待 bundle 生成完成
  1. ✅ 生成的文件位置:
    • AtomGitNews/harmony/entry/src/main/resources/rawfile/bundle.harmony.js - JavaScript bundle 文件
    • AtomGitNews/harmony/entry/src/main/resources/rawfile/assets/ - 图片资源文件夹

💡 小提示

  • bundle 文件包含了你的 React Native 代码和依赖
  • 每次修改代码后,需要重新运行 npm run harmony 生成新的 bundle
  • 开发模式下使用 --dev 参数,生产环境使用 --release 参数
  • 如果生成失败,检查 metro.config.js 配置是否正确

🔧 第五步:在原生工程鸿蒙侧配置 React Native for OpenHarmony

现在我们需要在鸿蒙原生工程中集成 React Native for OpenHarmony,这样才能让 React Native 代码在 HarmonyOS 平台上运行。


📌 步骤 1:添加 React Native 配置

  1. 📂 在 AtomGitNews/harmony/entry 目录下打开命令提示符窗口

    或者:

  2. 🖱️ 在 DevEco Studio 中,右键点击 entry 目录,选择 "Open In > Terminal" 在底部控制台打开命令提示符

  1. 📥 输入以下命令安装依赖包:
bash 复制代码
ohpm i @rnoh/react-native-openharmony@0.72.90

⚠️ 重要提示 :版本必须为 0.72.90,与 React Native 引入的 @react-native-oh/react-native-harmony 依赖版本保持一致。

  1. ⏳ 执行完成后,会在工程级目录以及模块级目录下生成 oh_modules 文件夹

💡 小提示ohpm 是 OpenHarmony 的包管理器,类似于 npm。


📌 步骤 2:集成 RNOH

现在需要补充 CPP 侧和 ArkTS 侧的代码来完成集成。

补充 CPP 侧代码

右键AtomGitNews/harmony/entry/src/main目录选择"New > Directory"创建cpp文件夹。

cpp 目录右键选择"New > File "创建 CMakeLists.txt文件,并将 RNOH 的适配层代码添加到编译构建中生成 librnoh_app.so

cmake 复制代码
project(rnapp)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_SKIP_BUILD_RPATH TRUE)
set(OH_MODULE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
set(RNOH_APP_DIR "${CMAKE_CURRENT_SOURCE_DIR}")

set(RNOH_CPP_DIR "${OH_MODULE_DIR}/@rnoh/react-native-openharmony/src/main/cpp")
set(RNOH_GENERATED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/generated")
set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments")
set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -pie")
add_compile_definitions(WITH_HITRACE_SYSTRACE)
set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to use

add_subdirectory("${RNOH_CPP_DIR}" ./rn)

add_library(rnoh_app SHARED
    "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
)

target_link_libraries(rnoh_app PUBLIC rnoh)

CMakeLists.txt代码编写完成后,点击右上角的Sync Now进行同步。

继续在cpp 目录右键选择"New > File "或者"New > C/C++ Source File"创建PackageProvider.cpp,需要导入RNOH/PackageProvider头文件并实现getPackages方法,getPackages方法用于创建三方库或自定义TurboModuleFabricpackage对象。

注:当前不涉及三方库与自定义TurboModule或组件,需要返回空对象。

cpp 复制代码
#include "RNOH/PackageProvider.h"

using namespace rnoh;

std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {
    return {};
}

PackageProvider.cpp代码编写完成后,点击右上角的Sync Now进行同步。

同步完成后,会发现PackageProvider.cpp中代码有红色标记,可以先不处理。打开 AtomGitNews\entry\build-profile.json5,将cpp中的代码添加到应用工程的编译构建任务中;如果在 x86_64 架构的模拟器上运行应用,需在 externalNativeOptions 配置中额外添加 abiFilters 字段,并包含 x86_64 架构参数,如下所示,abiFilters 字段当前被注释,默认仅构建适用于 arm64-v8a 架构的版本。最后点击编辑器右上角Sync Now同步工程。

json 复制代码
{
  "apiType": "stageMode",
  "buildOption": {
    "externalNativeOptions": {
      "path": "./src/main/cpp/CMakeLists.txt",
      "arguments": "",
      "cppFlags": "",
      "abiFilters": ["arm64-v8a", "x86_64"]
    },
    "resOptions": {
      "copyCodeResource": {
        "enable": false
      }
    }
  },
  "buildOptionSet": [
    {
      "name": "release",
      "arkOptions": {
        "obfuscation": {
          "ruleOptions": {
            "enable": false,
            "files": [
              "./obfuscation-rules.txt"
            ]
          }
        }
      }
    },
  ],
  "targets": [
    {
      "name": "default"
    },
    {
      "name": "ohosTest",
    }
  ]
}

最后,打开CMakeLists.txt文件,会发现自动加入的PackageProvider.cpp路径有误,需要调整成正确的,调整完成后点击编辑器右上角Sync Now同步工程,这时PackageProvider.cpp中的红色信息将消失。

cmake 复制代码
// 原代码
// add_library(rnoh_app SHARED
//    "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp" PackageProvider.cpp)

// 调整为
add_library(rnoh_app SHARED
    "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp" "./PackageProvider.cpp")
补充ArkTS侧的代码

CPP侧代码完成后,需要继续补全ArkTS侧代码。在AtomGitNews/entry/src/main/ets/entryability/EntryAbility.ets中原有的UIAbility替换为react-native-openharmony依赖包提供的RNAbility,并重写getPagePath返回,使其返回程序的入口page

typescript 复制代码
// 原写法
// import { UIAbility } from '@kit.AbilityKit';
// export default class EntryAbility extends UIAbility {...}

// 修改为
import { RNAbility } from '@rnoh/react-native-openharmony';
export default class EntryAbility extends RNAbility {...}

修改后,会提示错误信息,将鼠标放置在EntryAbility类名上,会显示具体的错误信息。

提示信息告诉我们少了getPagePath方法,可以手动添加该方法,也可以直接点击错误提示框中的Implement inherited abstract class自动添加getPagePath方法,当然还需要我们手动增加返回程序入口page的代码。

typescript 复制代码
export default class EntryAbility extends RNAbility {
  protected getPagePath(): string {
    return "pages/Index"
  }
}

接着将鼠标放置在onCreate方法上,提示我们RNAbility提供的onCreate方法只需要一个参数,而目前是两个参数,需要手动修改并增加调用super方法来确保原有功能不丢失。

注意事项:

  • 需确保函数的参数列表与父类保持兼容。
  • 建议添加override关键字,以提升代码可读性并增强编译器检查。
typescript 复制代码
// 原有代码
// onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {}

// 修改后的代码
override onCreate(want: Want): void {
    super.onCreate(want);
    ...
}

接下来我们需要在AtomGitNews/entry/src/main/ets目录右键选择"New > ArkTS File"创建RNPackagesFactory.ets文件,该文件需要导入@rnoh/react-native-openharmonyRNPackageContextRNPackage,并导出用于创建TurboModuleFabricpackage对象的createRNPackages方法。

若不涉及三方库与自定义TurboModule或组件,需要返回空数组。

typescript 复制代码
import { RNPackageContext, RNPackage } from '@rnoh/react-native-openharmony/ts';
export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
  return [];
}

最后,打开AtomGitNews/entry/src/main/ets/pages/Index.ets添加RNOH的使用代码。

RNApp的参数appKey需要与React Native工程中AppRegistry.registerComponent注册的appName保持一致,否则会导致白屏。

typescript 复制代码
import {
  AnyJSBundleProvider,
  ComponentBuilderContext,
  FileJSBundleProvider,
  MetroJSBundleProvider,
  ResourceJSBundleProvider,
  RNApp,
  RNOHErrorDialog,
  RNOHLogger,
  TraceJSBundleProviderDecorator,
  RNOHCoreContext
} from '@rnoh/react-native-openharmony';
import { createRNPackages } from '../RNPackagesFactory';

@Builder
export function buildCustomRNComponent(ctx: ComponentBuilderContext) {}

const wrappedCustomRNComponentBuilder = wrapBuilder(buildCustomRNComponent)

@Entry
@Component
struct Index {
  @StorageLink('RNOHCoreContext') private rnohCoreContext: RNOHCoreContext | undefined = undefined
  @State shouldShow: boolean = false
  private logger!: RNOHLogger

  aboutToAppear() {
    this.logger = this.rnohCoreContext!.logger.clone("Index")
    const stopTracing = this.logger.clone("aboutToAppear").startTracing();

    this.shouldShow = true
    stopTracing();
  }

  onBackPress(): boolean | undefined {
    // NOTE: this is required since `Ability`'s `onBackPressed` function always
    // terminates or puts the app in the background, but we want Ark to ignore it completely
    // when handled by RN
    this.rnohCoreContext!.dispatchBackPress()
    return true
  }

  build() {
    Column() {
      if (this.rnohCoreContext && this.shouldShow) {
        if (this.rnohCoreContext?.isDebugModeEnabled) {
          RNOHErrorDialog({ ctx: this.rnohCoreContext })
        }
        RNApp({
          rnInstanceConfig: {
            createRNPackages,
            enableNDKTextMeasuring: true, // 该项必须为true,用于开启NDK文本测算
            enableBackgroundExecutor: false,
            enableCAPIArchitecture: true, // 该项必须为true,用于开启CAPI
            arkTsComponentNames: []
          },
          initialProps: { "foo": "bar" } as Record<string, string>,
          appKey: "AtomGitNews",
          wrappedCustomRNComponentBuilder: wrappedCustomRNComponentBuilder,
          onSetUp: (rnInstance) => {
            rnInstance.enableFeatureFlag("ENABLE_RN_INSTANCE_CLEAN_UP")
          },
          jsBundleProvider: new TraceJSBundleProviderDecorator(
            new AnyJSBundleProvider([
              new MetroJSBundleProvider(),
              // NOTE: to load the bundle from file, place it in
              // `/data/app/el2/100/base/com.rnoh.tester/files/bundle.harmony.js`
              // on your device. The path mismatch is due to app sandboxing on OpenHarmony
              new FileJSBundleProvider('/data/storage/el2/base/files/bundle.harmony.js'),
              new ResourceJSBundleProvider(this.rnohCoreContext.uiAbilityContext.resourceManager, 'hermes_bundle.hbc'),
              new ResourceJSBundleProvider(this.rnohCoreContext.uiAbilityContext.resourceManager, 'bundle.harmony.js')
            ]),
            this.rnohCoreContext.logger),
        })
      }
    }
    .height('100%')
    .width('100%')
  }
}

📱 第六步:在模拟器运行 RNOH 跨平台应用

配置完成后,我们可以在模拟器上运行应用进行验证。


📌 步骤 1:打开设备管理

  1. 🔍 在 DevEco Studio 工具栏,点击 "No Devices" 下拉菜单

  2. 👆 选择 "Device Manager" 打开设备管理窗口


📌 步骤 2:创建模拟器

  1. ➕ 在设备管理窗口中点击 "New Emulator" 按钮,打开新建模拟器窗口
  1. 📥 下载 Version(API) 对应版本为 HarmonyOS 6.0.0(20)Huawei_Phone 模拟器镜像

  2. ⏳ 下载完成后点击 "Next" 按钮创建模拟器

⏱️ 下载时间:镜像文件较大(约 1-2 GB),下载可能需要 10-30 分钟。

  1. ⚙️ 保持默认模拟器参数即可,点击 "Finish" 按钮完成创建

📌 步骤 3:启动模拟器

  1. 📱 创建成功后,会在设备管理列表中显示当前创建的模拟器

  2. ▶️ 点击 "Actions" 列的运行按钮,启动模拟器

  1. ⏳ 等待模拟器启动完成(首次启动可能需要 1-2 分钟)

  2. ✅ 模拟器启动成功后,工具栏 "No Devices" 会显示当前已连接的设备名称


📌 步骤 4:运行应用

  1. ▶️ 点击工具栏的运行或调试按钮(绿色三角形图标)

  2. 📱 应用程序会自动安装到已选择的设备上(此处为模拟器)

  1. ⏳ 等待工程编译构建安装完成(首次运行可能需要几分钟)

  2. 🎉 模拟器显示应用界面,即为成功!

💡 小提示

  • 如果运行失败,检查错误信息
  • 确保 bundle 文件已正确生成
  • 确保 appKey 配置正确
  • 查看 DevEco Studio 的日志输出

至此,已初步完成原生工程鸿蒙侧React Native for OpenHarmony的所有配置并能够正常在模拟器运行。


🎉 总结

恭喜你完成了 React Native for OpenHarmony 开发环境的搭建!现在你已经可以:

  • ✅ 使用 React Native 开发 HarmonyOS 应用
  • ✅ 在模拟器或真机上运行和调试应用
  • ✅ 生成和部署 HAP 安装包
  • ✅ 开始你的跨平台应用开发之旅

❓ 常见问题(FAQ)

Q1: 环境变量配置后不生效怎么办?

A:

  1. 必须重新打开命令提示符:配置环境变量后,已打开的命令提示符不会自动更新
  2. 关闭所有命令提示符窗口
  3. 重新打开命令提示符
  4. 如果还不行,尝试重启电脑

Q2: npm i 安装依赖失败怎么办?

A: 可能的原因:

  1. 网络连接问题
  2. npm 镜像源未配置
  3. 权限问题

解决方法

  • 检查网络连接
  • 配置 npm 镜像源(参考第一步)
  • 执行 npm cache clean --force 清理缓存
  • 尝试使用代理或 VPN
  • 以管理员身份运行命令提示符

Q3: npm run harmony 生成 bundle 失败?

A: 可能的原因:

  1. Metro 配置不正确
  2. 依赖包未正确安装
  3. 路径问题

解决方法

  • 检查 metro.config.js 配置是否正确
  • 确保已安装 @react-native-oh/react-native-harmony
  • 检查项目路径中是否包含中文字符
  • 查看错误信息,根据具体错误进行排查

Q4: 应用运行时出现白屏?

A: 可能的原因:

  1. appKeyAppRegistry.registerComponent 注册的名称不一致
  2. bundle 文件未正确生成或路径错误
  3. 代码错误导致崩溃

解决方法

  • 检查 Index.ets 中的 appKey 是否与 React Native 代码中的注册名称一致
  • 确保 bundle 文件已正确生成并放在正确位置
  • 查看 DevEco Studio 的日志输出,查找错误信息
  • 检查 React Native 代码是否有语法错误

Q5: 模拟器无法启动?

A: 可能的原因:

  1. 虚拟化功能未启用(BIOS 中启用 VT-x 或 AMD-V)
  2. 磁盘空间不足
  3. 模拟器镜像损坏

解决方法

  • 检查 BIOS 中是否启用了虚拟化功能
  • 确保有足够的磁盘空间(至少 5 GB)
  • 尝试删除并重新创建模拟器
  • 检查模拟器日志,查看具体错误信息

Q6: 编译构建失败?

A: 可能的原因:

  1. CMakeLists.txt 配置错误
  2. PackageProvider.cpp 路径错误
  3. build-profile.json5 配置错误

解决方法

  • 检查 CMakeLists.txt 中的路径是否正确
  • 确保 PackageProvider.cpp 路径使用 "./PackageProvider.cpp"
  • 检查 build-profile.json5 中的 externalNativeOptions 配置
  • 点击 DevEco Studio 右上角的 Sync Now 同步工程
  • 查看编译错误信息,根据提示修复

Q7: hdc 命令找不到?

A: 可能的原因:

  1. hdc 路径未添加到 PATH 环境变量
  2. 路径配置错误
  3. SDK 未正确安装

解决方法

  • 检查 PATH 环境变量中是否添加了 hdc 工具路径
  • 确保路径指向 toolchains 目录
  • 检查 DevEco Studio SDK 是否正确安装
  • 重新打开命令提示符

Q8: 如何更新 React Native for OpenHarmony 版本?

A:

  1. 查看 React Native For OpenHarmony 版本说明
  2. 更新 package.json 中的依赖版本
  3. 执行 npm install 更新依赖
  4. 更新 ohpm 包版本
  5. 重新生成 bundle 文件

Q9: 真机调试连接失败?

A: 可能的原因:

  1. hdc 环境变量未配置
  2. 设备未启用 USB 调试
  3. 驱动问题

解决方法

  • 确保 hdc 环境变量已正确配置
  • 在设备上启用 USB 调试模式
  • 检查 USB 驱动是否正确安装
  • 使用 hdc list targets 查看连接的设备

Q10: 如何查看详细的错误日志?

A:

  1. 在 DevEco Studio 底部查看 "Log" 窗口
  2. 在模拟器或真机上查看应用日志
  3. 使用 hdc hilog 命令查看系统日志
  4. 检查 React Native Metro 打包器的输出
    ckageProvider.cpp路径使用"./PackageProvider.cpp"`
  • 检查 build-profile.json5 中的 externalNativeOptions 配置
  • 点击 DevEco Studio 右上角的 Sync Now 同步工程
  • 查看编译错误信息,根据提示修复

Q7: hdc 命令找不到?

A: 可能的原因:

  1. hdc 路径未添加到 PATH 环境变量
  2. 路径配置错误
  3. SDK 未正确安装

解决方法

  • 检查 PATH 环境变量中是否添加了 hdc 工具路径
  • 确保路径指向 toolchains 目录
  • 检查 DevEco Studio SDK 是否正确安装
  • 重新打开命令提示符

Q8: 如何更新 React Native for OpenHarmony 版本?

A:

  1. 查看 React Native For OpenHarmony 版本说明
  2. 更新 package.json 中的依赖版本
  3. 执行 npm install 更新依赖
  4. 更新 ohpm 包版本
  5. 重新生成 bundle 文件

Q9: 真机调试连接失败?

A: 可能的原因:

  1. hdc 环境变量未配置
  2. 设备未启用 USB 调试
  3. 驱动问题

解决方法

  • 确保 hdc 环境变量已正确配置
  • 在设备上启用 USB 调试模式
  • 检查 USB 驱动是否正确安装
  • 使用 hdc list targets 查看连接的设备

Q10: 如何查看详细的错误日志?

A:

  1. 在 DevEco Studio 底部查看 "Log" 窗口
  2. 在模拟器或真机上查看应用日志
  3. 使用 hdc hilog 命令查看系统日志
  4. 检查 React Native Metro 打包器的输出
相关推荐
摘星编程17 小时前
在OpenHarmony上用React Native:SectionList吸顶分组标题
javascript·react native·react.js
摘星编程17 小时前
React Native鸿蒙版:StackNavigation页面返回拦截
react native·react.js·harmonyos
摘星编程18 小时前
React Native鸿蒙:ScrollView横向滚动分页实现
javascript·react native·react.js
摘星编程18 小时前
OpenHarmony + RN:TextInput密码强度检测
javascript·react native·react.js
摘星编程20 小时前
React Native鸿蒙:Button自定义样式按钮
react native·react.js·harmonyos
摘星编程20 小时前
OpenHarmony环境下React Native:FlatList多选功能
javascript·react native·react.js
摘星编程21 小时前
OpenHarmony + RN:TabNavigation动态切换标签
javascript·react native·react.js
Easonmax1 天前
基础入门 React Native 鸿蒙跨平台开发:简单模拟一个温度计
react native·react.js·harmonyos
Xxtaoaooo1 天前
React Native 跨平台鸿蒙开发实战:UI 适配与响应式布局策略
react native·ui·harmonyos
摘星编程1 天前
在OpenHarmony上用React Native:StackNavigation页面传参
javascript·react native·react.js