Taro on Harmony :助力业务高效开发纯血鸿蒙应用

背景

纯血鸿蒙逐渐成为全球第三大操作系统,业界也掀起了适配鸿蒙原生的浪潮,用户迁移趋势明显,京东作为国民应用,为鸿蒙用户提供完整的购物体验至关重要。





去年 9 月,京东 APP 纯血鸿蒙 在鸿蒙应用商城正式上线,APP 中核心购物链路,如首页、搜索、商详、购物车、订单、结算和我京等页面,都是通过 Taro on Harmony 方案进行开发,并且一上线就获得了华为的 S 级应用认证。

Taro 介绍

Taro 是由京东发起并维护的开放式跨端跨框架解决方案,支持以 Web 的开发范式来实现小程序、H5、原生 APP 的跨端统一开发,从 18 年开源至今,在 GitHub 已累计获得 36,000+ Stars。





在过去的一年中,Taro 完成了鸿蒙适配方案的开发,Taro on Harmony 方案支持开发者使用 React DSL 来快速开发高性能原生鸿蒙应用,让 Taro 具备了一份代码同时跨鸿蒙、小程序、H5、React Native 多端的能力,可以让开发者以熟悉的方式来开发鸿蒙应用,大幅降低鸿蒙开发门槛,并且存量的 Taro 业务也能快速转成鸿蒙原生应用,可以节约大量研发成本。

Taro on Harmony 适配方案的演进

基于 ArkTS 的初始版本

Taro 适配鸿蒙方案经过了多个版本的演进迭代,最初版本我们采用的是对接到鸿蒙原生 ArkTS 语言的方式来实现,这和 Taro 适配微信小程序的方案类似,都是通过模拟浏览器 DOM/BOM 环境,然后运行 React 代码构建出虚拟 DOM 树,再将虚拟 DOM 树以递归遍历的方式构建出宿主环境(小程序/鸿蒙)的渲染节点树,从而实现页面渲染。





但这个方案的缺陷非常明显,那就是在 ArkTS 之上再桥接一层转换,导致性能相比原生存在一定差异,并且这个差异几乎没有办法可以抹平。

基于 C API 的全新版本

恰逢此时,鸿蒙为了方便三方框架与应用接入鸿蒙生态,在官方开发语言 ArkTS 之外,开放了更底层 C API 能力,提供了 C++ 层的 UI 节点创建、属性设置等能力(类似于 C++ 版本的 DOM),三方框架和应用可以基于 C API 构建高性能的解决方案和应用。





C API 就是 Taro 想要的能力,与 Taro 的架构完美契合,Taro React 构建出来的虚拟 DOM 树可以通过 C API 直接去创建原生 UI 节点,省去了很多流程环节,并且可以将我们大部分的渲染管线处理沉到 C++ 中去,获得飞跃式的性能提升,所以基于 C API 我们首先设计并开发了单线程架构版本。

单线程架构版本

单线程架构版本的示意图如下,整个渲染过程均在主线程实现,业务代码在 ArkVM 中执行获得虚拟 DOM 树,同时读取样式数据,通过 React Reconciler ,在构建虚拟树时会调用 NAPI 在 C++ 侧构建出对应的 Element Tree,同时也会进行样式数据的解析处理,从而构建出 CSSOM 对象,Element Tree 和 CSSOM 对象会进行匹配从而构建出带有样式的 Render Tree,在这一步也会同时创建 yoga 节点,进行布局计算,最后会再基于布局计算的结果生成 C API 的 ArkNode Tree,从而实现上屏渲染。





目前京东鸿蒙 APP 中首页、搜推、我京、核心购物流程均是使用 Taro 单线程版本进行开发,性能和稳定性位于第一梯队。





多线程架构版本

单线程版本上线之后,我们也发现了单线程架构的不足,① 从业务代码的执行到渲染流程的处理都发生在主线程上,这导致了主线程的过载,使得应用无法及时响应用户的操作,从而引发了用户体验上的卡顿,随着业务逻辑的增加和复杂性的提升,这种卡顿现象会越发明显;② 在单线程架构下,代码都是需要内置到应用包里,这样就无法实现业务代码的动态下发更新。

所以,为了解决以上问题,进一步提升应用性能,和应对未来更多业务场景需求的可能性,我们实现了多线程架构。





相较于单线程架构,多线程架构将整个业务代码执行和渲染的过程拆分到了三个线程,每个线程各司其职,让任务的执行更加合理,不会造成主线程的堵塞,这样的架构主要带来三个好处。

1.业务逻辑不再堵塞主流程,完全剥离到了单独的线程执行,之前容易出现卡顿、甚至 APP Freeze 的页面基本不再有问题,例如商详接入之后滑动页面变得更加流畅;

2.动画执行和渲染不再卡顿,动画的执行交由 Background 线程管控,不再和 JS 线程有冲突问题,动画支持满帧渲染;

3.支持动态化的能力,在性能上可以与原生相媲美,同时还能支持动态下发,支持更新远端 JS 资源来实现 APP 内容的更新,让业务具备快速验证和免发版的能力。

目前多线程版本正在我们的业务中进行试点接入,很快就会正式上线。

Taro on Harmony 方案特性

丰富的能力支持

常用组件和 API 支持

在 C-API 版本的 Taro For Harmony 中,我们不仅完整支持了 React 18+,另外支持了 View、Text、Image、Video 等近 33 个 Taro 组件,对于常用的 API,如 getSystemInfo、getStorage 等也是在 C-API 版本中得到了完整的支持,而且针对逻辑较为复杂的 API 如:createSelectorQuery 以及 createIntersectionObserver,我们将这些 API 在 C++ 侧进行了重新的实现,大幅提升了他们的执行性能。

常用样式支持

在 C-API 版本中,我们对支持了大部分常见的 CSS 能力:

•支持常见的 CSS 样式和布局,支持 flex、伪类和伪元素

•支持常见的 CSS 定位,绝对定位、fixed 定位

•支持常见的 CSS 选择器和媒体查询

•支持常见的 CSS 单位,比如 vh、vw 以及计算属性 calc

•支持 CSS 变量以及安全区域等预定义变量

同时,我们参考浏览器 CSSOM 的实现方式,在 C++ 实现了一套 CSSOM 逻辑,里面包含了样式解析、样式匹配、样式合成和应用整个链路的样式处理逻辑。





另外,Taro 引入了 Yoga 布局引擎来计算渲染节点的位置和大小,最大程度保证 Taro 构建出来的鸿蒙应用中渲染样式和 W3C 规范的一致性。





媲美原生 ArkTS 的高性能

运行时逻辑下沉至 C++

在 C-API 的版本中,我们将 ArkVM 层的 Taro 运行时内容削减到极致的薄,将 TaroElement 的大部分内容都下沉到了 C++ 侧,并在 ArkVM 层取消了他们之间父子关系的绑定,极大地提升了 TaroElement 相关逻辑的性能。





另一方面,在 C++ 侧 Taro 会指令式地调用 ArkUI 在 C++ 侧提供的 API,来高效地创建节点、设置属性、绑定事件以及绘制上屏。

提供长列表组件应对长列表场景

Taro 还针对长列表场景针对性地提供了长列表类型组件,并对长列表类型组件进行了优化,提供了懒加载、预加载和节点复用等功能,有效地解决大数据量下的性能问题,提高应用的流畅度和用户体验。





支持 C API 混合原生的渲染模式

Taro 的组件和 API 是以小程序作为基准来进行设计的,因此在实际的鸿蒙应用开发过程中,会出现部分所需的组件和 API 在 Taro 中不存在的情况,因为针对这种情况,在 C-API 版本中,Taro 提供了原生混合开发的能力,支持将原生页面或者原生组件混合编译到 Taro 鸿蒙项目中,支持 Taro 组件和鸿蒙原生组件在页面上的混合使用。





总结

Taro 鸿蒙方案基于鸿蒙 CAPI 进行构建,实现了将 React DSL 直接对接到 C++ 侧来运行整体渲染管线,从而实现了与原生齐平的渲染性能,同时 Taro 鸿蒙方案是多线程架构的方案,在应用渲染性能、操作响应时延上都在业界做到极致,并且 Taro 鸿蒙方案支持动态更新,是行业首创且经过大规模 APP 应用场景验证的开发框架,综合性能、生态以及开发体验来讲,毫无疑问已经成为了开发鸿蒙应用的最佳框架选型之一。

目前,我们也仍然在不断完善着鸿蒙的适配方案,目前在渲染性能提升方面我们正在进行 React C++ 化的探索,整体进展也已经处于验证和测试阶段,同时也在进行自研布局引擎的探索,在进一步提升渲染性能的同时,为业务提供更丰富的样式写法支持;此外,在开发效率提升方面,我们也正在进行开发调试工具的探索开发,为业务提供热重载、源码定位、断点调试、元素审查等能力,提升效率和开发体验。

在近期,我们会将已经在京东鸿蒙 APP 久经考验的单线程架构版本开源出来,为开源社区贡献一份力量,为鸿蒙应用生态的丰富注入强大的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gem5-gpu教程05 内存建模

memory-modeling|Details on how memory is modeled in gem5-gpu gem5-gpu’s Memory Simulation gem5-gpu在很大程度上避开了GPGPU-Sim的单独功能模拟,而是使用了gem5的执行中执行模型。因此,当执行存储/加载时,内存会被更新/读取。没有单独的功能路径。(顺便说一句,这…

【python】lambda用法(结合例子理解)

目录 lambda 是什么? 为什么叫 lambda? 语法 举例 1. 最简单的 lambda:单个数字处理 2. 用 lambda 排序一组字符串(按照长度排序) 3. 在列表里找出绝对值最小的数字 4. 给 map() 用 lambda 5. 组合使用:筛选出偶数 lambda 和 def 的对比 lambda 适合用在什么地…

【ROS2】机器人操作系统安装到Ubuntu22.04简介(手动)

主要参考: https://book.guyuehome.com/ROS2/1.系统架构/1.3_ROS2安装方法/ 官方文档:https://docs.ros.org/en/humble/Installation.html 虚拟机与ubuntu系统安装 略,见参考文档 ubutun换国内源,略 1. 设置本地语言 确保您有…

C 调用 C++:extern “C” 接口详解与实践 C/C++混合编译

C 调用 C:extern “C” 接口详解与实践 核心问题在于 C 编译器会对函数名进行“修饰”(Name Mangling)以支持函数重载等特性,而 C 编译器则不会。此外,C 语言本身没有类、对象等概念。为了解决这个问题,我…

汽车制造行业如何在数字化转型中抓住机遇?

近年来,随着新一轮科技革命和产业变革的深入推进,汽车制造行业正迎来一场前所未有的数字化转型浪潮。无论是传统车企还是新势力品牌,都在积极探索如何通过数字化技术提升竞争力、开拓新市场。那么,在这场变革中,汽车制…

k8s学习记录(五):Pod亲和性详解

一、前言 上一篇文章初步探讨了 Kubernetes 的节点亲和性,了解到它在 Pod 调度上比传统方式更灵活高效。今天我们继续讨论亲和性同时Kubernetes 的调度机制。 二、Pod亲和性 上一篇文章中我们介绍了节点亲和性,今天我们讲解一下Pod亲和性。首先我们先看…

HarmonyOS:Navigation实现导航之页面设置和路由操作

导读 设置标题栏模式设置菜单栏设置工具栏路由操作页面跳转页面返回页面替换页面删除移动页面参数获取路由拦截 子页面页面显示类型页面生命周期页面监听和查询 页面转场关闭转场自定义转场共享元素转场 跨包动态路由系统路由表自定义路由表 示例代码 Navigation组件适用于模块…

雪花算法

目录 一、什么是雪花算法 二、使用雪花算法 ​三、使用UUID 使用自增主键是数据库中常用的唯一标识,今天尝试使用mybatisplus来实现三种方式的主键ID 使用起来也很简单 用注解指定一下使用那种方式的主键 一、什么是雪花算法 一种特殊的算法可以计算得到一个唯…

HarmonyOs @hadss/hmrouter路由接入

参考文档:官方文档 在根目录oh-package.json5配置 {"dependencies": {"hadss/hmrouter": "^1.0.0-rc.11"} }加入路由编译插件 hvigor/hvigor-config.json文件 {"dependencies": {"hadss/hmrouter-plugin": &…

C++学习笔记(三十八)——STL之修改算法

STL 算法分类: 类别常见算法作用排序sort、stable_sort、partial_sort、nth_element等排序搜索find、find_if、count、count_if、binary_search等查找元素修改copy、replace、replace_if、swap、fill等修改容器内容删除remove、remove_if、unique等删除元素归约for…

Crawl4AI 部署安装及 n8n 调用,实现自动化工作流(保证好使)

Crawl4AI 部署安装及 n8n 调用,实现自动化工作流(保证好使) 简介 Crawl4AI 的介绍 一、Crawl4AI 的核心功能 二、Crawl4AI vs Firecrawl Crawl4AI 的本地部署 一、前期准备 二、部署步骤 1、检查系统的网络环境 2、下载 Crawl4AI 源…

32单片机——外部中断

STM32F103ZET6的系统中断有10个,外部中断有60个 1、中断的概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力 eg::你打开火&…

UG NX二次开发(C#)-获取具有相同属性名称的体对象

文章目录 1、前言2、在UG NX中的属性的赋予3、通过UG NX二次开发获取相同属性的体对象1、前言 UG NX中每个对象都可以属于属性的,包括体、面、边、特征、基准等。在QQ群中有个群有提出一个问题,就是获取相同属性的体对象,然后将这个体对象导出到一个part文件中。我们今天先…

手动实现legend 与 echarts图交互 通过元素和js事件实现图标某项的高亮 显示与隐藏

通过html实现legend的样式 提供调用echarts的api实现与echarts图表交互的效果 实现饼图element实现类似于legend与echartstu表交互效果 效果图 配置代码 <template><div style"height: 400px; width: 500px;background-color: #CCC;"><v-chart:opti…

SpringBoot与BookKeeper整合,实现金融级别的日志存储系统

BookKeeper的优势 高吞吐量和低延迟 分布式架构: Apache BookKeeper采用分布式的架构设计&#xff0c;能够支持高并发的写入和读取操作。 批量写入: 支持批量写入日志条目&#xff0c;显著提高写入效率。 异步I/O: 使用异步I/O操作&#xff0c;减少等待时间&#xff0c;提升…

【Bug】 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

当你在进行深度学习相关操作时&#xff0c;若因缺少本地的 CA 证书而无法下载资源&#xff0c;下面为你介绍几种解决办法&#xff1a; 方法一&#xff1a;更新 CA 证书 在大多数 Linux 发行版中&#xff0c;你可以使用包管理器来更新 CA 证书。例如&#xff0c;在基于 Debian…

Vue3中AbortController取消请求的用法详解

在 Vue3 中&#xff0c;AbortController 用于取消 fetch 请求&#xff0c;避免组件卸载后仍执行异步操作导致的潜在问题&#xff08;如内存泄漏或更新已销毁组件的状态&#xff09;。以下是详细用法和最佳实践&#xff1a; 一、基本用法 创建 AbortController 实例 在组件 setu…

【刷题Day26】Linux命令、分段分页和中断(浅)

说下你常用的 Linux 命令&#xff1f; 文件与目录操作&#xff1a; ls&#xff1a;列出当前目录的文件和子目录&#xff0c;常用参数如-l&#xff08;详细信息&#xff09;、-a&#xff08;包括隐藏文件&#xff09;cd&#xff1a;切换目录&#xff0c;用于在文件系统中导航m…

Spring Boot 参考文档导航手册

&#x1f4da; Spring Boot 参考文档导航手册 &#x1f5fa;️ ✨ 新手入门 &#x1f476; 1️⃣ &#x1f4d6; 基础入门&#xff1a;概述文档 | 环境要求 | 安装指南 2️⃣ &#x1f527; 实操教程&#xff1a;上篇 | 下篇 3️⃣ &#x1f680; 示例运行&#xff1a;基础篇 …

卷积神经网络(CNN)详细教程

卷积神经网络&#xff08;CNN&#xff09;详细教程 一、引言 卷积神经网络&#xff08;Convolutional Neural Networks, CNN&#xff09;是一种深度学习模型&#xff0c;广泛应用于图像识别、视频分析、自然语言处理等领域。CNN通过模拟人类视觉系统的层次结构&#xff0c;能够…