duxapp框架是如何实现对鸿蒙的兼容,开发过程中遇到了哪些问题
Taro 4.0 版本已经搭建好了兼容鸿蒙的基础框架,duxapp 是在这个基础上进一步开发,降低了开发者上手门槛,提供了统一的 UI 库。
duxapp 是一个模块化的 多端开发框架,其中提供了多端 UI 库,能真正实现一套代码开发小程序、React Native、H5、鸿蒙
兼容鸿蒙之前
在开始兼容鸿蒙之前,我们来讲一下,duxapp 是一个什么状况
1、样式兼容性
现在 duxapp 已经兼容 小程序、React Native以及H5了,因为 React Native 端在这些端中兼容的样式是最少的,我们是按照React Native的标准去做,我们针对 H5 端和 小程序端的基础样式做了调整
需要将 View 组件调整为默认 Flex 竖向布局、默认的定位方式、模型盒、以及边框等,像下面这样:
/* H5 端 */
taro-view-core {
display: flex;
flex-direction: column;
position: relative;
border-style: solid;
border-width: 0;
}
input,
textarea,
taro-view-core {
box-sizing: border-box;
}
/* 小程序端 */
view {
display: flex;
flex-direction: column;
position: relative;
border-style: solid;
border-width: 0;
}
input,
textarea,
view {
box-sizing: border-box;
}
通过这样的调整,我们在项目中使用 View 组件的时候将默认使用 Flex 竖向布局,这样编写的 css 就能做到同时兼容多个端了
2、现有模块
duxapp 框架中现在已提供了很多的公开模块了,这里介绍三个相关的基础模块,这三个模 块在我们兼容鸿蒙的过程中都有很大的关联
- duxapp
这个和框架名称相同的模块,是所有模块的根模块,所有的模块都需要依赖于这个模块
这个模块内提供了一些非常基础的组件、函数、配置等,且一些东西是必须使用的
用来包裹页面的容器组件
TopView
路由跳转函数route
导出的用户配置
- duxui
这个是提供的UI组件库,模块内提供了大量兼容多端的组件库,使用这些组件,能快速开发出兼容多端的应用
- duxappReactNative
React Native端支持,要兼容 React Native,必须使用这个模块,模块内有 React Native 端的三方依赖、用户协议、版本更新、权限管理等
Taro 和鸿蒙的现状
Taro 4.0 目前有两套实现鸿蒙的方案
- @tarojs/plugin-platform-harmony-hybrid
webview方案,将 H5 运行在 webview 上,和小程序类似
- @tarojs/plugin-platform-harmony-ets
duxapp 中为了更好的性能和体验,选择的的是这个方案
底层通过 arkts 以及 arkui 实现,将 Taro 的组件转化为对应的 arkui 里面对应的组件,并实现了 React 的运行时
例如 View
组件会通过 arkui 的 Flex
、Row
、Column
这三个组件来实现,会根据编写的不同样式选择不同的原生组件去渲染,从这里也大概能看出,鸿蒙的 arkui 里面也是 Flex 布局
兼容过程
1、创建一个鸿蒙模块
就像上面介绍的 React Native 端那样,鸿蒙端也需要创建一个模块,用来处理鸿蒙端的基础内容,例如用到的三方依赖、配置插件等
这个模块的名称为 duxappHarmony
2、添加需要的三方依赖
目前鸿蒙端仅支持使用 vite
编译,因此鸿蒙端需要添加编译的相关的依赖,在模块内创建 package.json
,内容如下
{
"scripts": {
"build:harmony": "duxapp runtime enterFile && duxapp harmony create && taro build --type harmony",
"dev:harmony": "npm run build:harmony -- --watch"
},
"dependencies": {
"@tarojs/plugin-platform-harmony-ets": "4.0.7",
"vite": "^5.4.10",
"terser": "^5.36.0",
"@tarojs/vite-runner": "4.0.5",
"@vitejs/plugin-react": "^4.3.3",
"vite-plugin-commonjs": "^0.10.3"
}
}
这个完整的文件中还包含了编译鸿蒙的两个命令
3、配置依赖项
添加了依赖这些依赖并不会自动起作用,需要配置 Taro 编译配置,我们在这个模块内创建一个 Taro 的配置文件 taro.config.js
,内容如下
// eslint-disable-next-line import/no-commonjs
const commonjs = require('vite-plugin-commonjs').default
module.exports = {
// 鸿蒙编译插件
plugins: [
'@tarojs/plugin-platform-harmony-ets'
],
harmony: {
compiler: {
// 指定 vite 编译
type: 'vite',
vitePlugins: [
commonjs()
]
},
projectPath: './dist/harmony'
}
}