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.pswp.cn/pingmian/78538.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78538.shtml
英文地址,請注明出處:http://en.pswp.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;能夠…