上个文章中我们已经准备好了react-nativ和OpenHarmony的开发环境,现在正式开始进行我们第一个项目的开发。

        创建React Native工程

        选择一个目录作为workspace,按照React Native 的入门教程,使用 React Native 内置的命令行工具来创建一个名为 “AwesomeProject” 的新项目。这个命令行工具不需要安装,可以直接用 node 自带的 npx 命令来创建,目前 React Native for OpenHarmony 仅支持 0.72.5 版本的 React Native:

npx react-native@0.72.5 init AwesomeProject --version 0.72.5

        错误1:

        npx : 无法加载文件 D:\soft\developMent\nodejs\npx.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.micro soft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies。

        问题原因:

        Windows 系统的 PowerShell 执行策略限制了脚本的运行,导致无法正常执行 npx 命令        

        解决方案:

                 1、以管理员身份打开 PowerShell
                 2、查看当前执行策略

        在管理员模式的 PowerShell 中输入以下命令并回车:

Get-ExecutionPolicy

        输出是 Restricted(受限),这就是问题的根源。

                3、修改执行策略

        执行以下命令:

Set-ExecutionPolicy RemoteSigned

        经过上诉三步后,关闭当前powershell窗口,重新打开一个,即可解决此问题。

        错误2:

        我执行了React Native官方文档初始化命令:

npx @react-native-community/cli init AwesomeProject

        出现错误。错误信息 npm warn Unknown user config "sslVerify". This will stop working in the next major version of npm. error Invalid Version: latest. TypeError: Invalid Version: latest

        错误原因:

        这个错误主要包含两部分:一是 npm 警告 Unknown user config "sslVerify"(未知的用户配置项),二是核心错误 Invalid Version: latest(无效的版本号:latest),本质是我在执行 npm 命令时使用了不合法的版本号格式,同时还有一个即将废弃的配置项警告。

        解决方法:

        1、查看当前配置,确认是否有 sslVerify
 npm config get sslVerify
        2、删除这个无效配置:
npm config delete sslVerify
        3、指定React Native版本号
npx react-native@0.72.5 init AwesomeProject --version 0.72.5

        经过上述处理,初始化react-native项目成功。

        

        引入鸿蒙化依赖

        1、引入依赖

        打开 AwesomeProject 目录下的 package.json,在 scripts 下新增 OpenHarmony 的依赖:"dev": "react-native bundle-harmony --dev"。

{
 "name": "AwesomeProject",
 "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",
   "dev": "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": ">=20"
 }
}

        2、安装依赖

        在 AwesomeProject 目录下运行安装依赖包命令

npm i @react-native-oh/react-native-harmony

        错误1:

        错误信息 PS D:\soft\developMent\Android\workspace\AwesomeProject>

npm i @react-native-oh/react-native-harmony npm error code ERESOLVE npm error ERESOLVE unable to resolve dependency tree npm error npm error While resolving: AwesomeProject@0.0.1 npm error Found: react-native@0.72.5 npm error node_modules/react-native npm error react-native@"0.72.5" from the root project npm error npm error Could not resolve dependency: npm error peer react-native@"0.77.1" from @react-native-oh/react-native-harmony@0.77.44 npm error node_modules/@react-native-oh/react-native-harmony npm error @react-native-oh/react-native-harmony@"*" from the root project npm error npm error Fix the upstream dependency conflict, or retry npm error this command with --force or --legacy-peer-deps npm error to accept an incorrect (and potentially broken) dependency resolution.

        

        错误原因:

        npm 依赖版本冲突:由于RNOH官方文档没有及时更新,目前@react-native-oh/react-native-harmony最新版本是0.77.44。但是我跟着官方文档指导建立的React Native项目使用的版本是0.72.5,版本不匹配导致 npm 无法解析依赖树。

        解决方案:

        前往官网查看鸿蒙最新支持的版本信息,找到支持React Native的切发布了npm仓库的最新版本0.72.101-5,安装此版本。

npm install @react-native-oh/react-native-harmony@0.72.101-5

         运行指令并生成bundle

        1、修改配置文件

        打开 AwsomeProject\metro.config.js,并添加 OpenHarmony 的适配代码。配置文件的详细介绍,可以参考React Native 中文网。修改完成后的文件内容如下:

const {mergeConfig, getDefaultConfig} = require('@react-native/metro-config');
const {createHarmonyMetroConfig} = require('@react-native-oh/react-native-harmony/metro.config');

/**
* @type {import("metro-config").ConfigT}
*/
const config = {
  transformer: {
    getTransformOptions: async () => ({
      transform: {
        experimentalImportSupport: false,
        inlineRequires: true,
      },
    }),
  },
};

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

        2、执行命令

        在 AwesomeProject 目录下运行生成 bundle 文件的命令。运行成功后,会在 AwesomeProject/harmony/entry/src/main/resources/rawfile 目录下生成 bundle.harmony.js 和 assets 文件夹,assets 用来存放图片(如果 bundle 中不涉及本地图片,则没有 assets 文件夹)。

npm run dev

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.csdn.net

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐