在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Taro鴻蒙技術內幕系列(一):如何將React代碼跑在ArkUI上

京東云 ? 來源:jf_75140285 ? 2024-10-25 17:24 ? 次閱讀

作者:京東零售 朱鳴輝

基于 Taro 打造的京東鴻蒙 APP 已跟隨鴻蒙 Next 系統公測,本系列文章將深入解析 Taro 如何實現使用 React 開發高性能鴻蒙應用的技術內幕

背景

隨著鴻蒙操作系統的快速發展,開發者們期待將現有跨平臺應用遷移到鴻蒙平臺。Taro作為一個流行的跨平臺開發框架,其支持鴻蒙系統的可能性引起了廣泛關注。

然而,鴻蒙系統采用全新的ArkUI框架作為原生UI開發方案,與Taro原本支持的平臺存在顯著差異。將Taro的React開發模式與ArkUI的聲明式UI開發范式進行有效對接成為了一個技術難題。

本文將探討Taro框架如何通過創新方案實現React代碼在ArkUI上的運行。我們將解析Taro的運行時原理,剖析其如何將React組件轉換為ArkUI可識別的結構,以及相關技術挑戰和解決方案。

Taro運行時原理介紹

為了理解Taro適配ArkUI的核心機制,我們首先需要深入了解Taro的運行時原理。Taro通過巧妙的設計,將React代碼轉換為各平臺可執行的形式,其中包括對鴻蒙平臺的適配。下面將詳細介紹 Taro 是如何將 React 代碼轉換為ArkUI可執行的形式,以及節點轉換的流程細節。

wKgaoWcXQA-AX6UzABGMbiseADc620.png

1. 從 React 到 Taro

React 跨平臺的秘訣

在 Taro 的運行時中,首先執行的是開發者編寫的 React 業務代碼。這些代碼定義了業務應用的結構、邏輯和狀態管理。那么既然要對接React,那肯定先得了解它的核心架構,React是怎么運作的:

wKgZoWcXQBOAUyutABPiFdo-BPA686.png

?

了解了React的基本架構后,我們可以清晰地看到,Renderer 作為渲染器,負責將React的虛擬節點操作最終映射到相應的平臺上。例如,react-dom將這些操作對接到瀏覽器上,而react-native則將其對接到iOSAndroid平臺。這種設計使得React能夠適配不同的運行環境。

wKgZoWcXQBaAXIhDABLU5H_VvK4697.png

正是基于這種思路,Taro 團隊設計了 Taro Renderer。這個渲染器充當了 React 與 Taro 虛擬節點樹之間的橋梁,使得 React 的操作可以被轉換為 Taro 的中間表示。

通過實現 Taro Renderer 生成 Taro 虛擬節點樹

wKgaoWcXQBeASkU4AAU2ooqu32s867.png

HostConfig接口實現

?

要實現 Taro 的 Renderer,我們需要實現 React Reconciler 所需的 hostConfig 接口。這個接口定義了一系列方法,用于創建、更新和管理渲染目標平臺的元素。以下是一些關鍵的 hostConfig 方法:

?createElement:創建ArkUI對應的元素。

?createTextInstance:創建文本節點。

?appendChild:將子元素添加到父元素。

?removeChild:從父元素中移除子元素。

?insertBefore:在指定位置插入元素。

?commitUpdate:更新元素屬性。

通過實現這些方法,Taro Renderer 能夠將 React 的操作轉換為 Taro 虛擬節點樹的相應操作。這個虛擬節點樹是 Taro 實現跨平臺的核心,它為不同平臺的渲染提供了統一的中間表示。

// 部分HostConfig接口實現的代碼

const hostConfig: HostConfig {
    // 創建Taro虛擬節點
  createInstance (type, props: Props, _rootContainerInstance, _hostContext, internalInstanceHandle: Fiber) {
    const element: TaroElement = TaroNativeModule.createTaroNode(type)
    precacheFiberNode(internalInstanceHandle, element)
    updateFiberProps(element, props)
    return element
  },
  // 更新屬性
    commitUpdate (dom, updatePayload, _, oldProps, newProps) {
      updatePropsByPayload(dom, oldProps, updatePayload)
      updateFiberProps(dom, newProps)
    },
    // 插入節點
    insertBefore (parent: TaroElement, child: TaroElement, refChild: TaroElement) {
      parent.insertBefore(child, refChild)
    },
    // 移除節點
    removeChild (parent: TaroElement, child TaroElement) {
      parent.removeChild(child)
    },
    // ...
}

2. 從 Taro 到 ArkUI

在將 Taro 虛擬節點樹轉換為 ArkUI 的過程中,我們需要進行幾個關鍵步驟:

?

wKgZoWcXQBuAXDLKAAiIYMZZYbo181.png

Taro Element轉換 ArkUI過程

首先,我們需要在 ArkUI 層面實現一套與 Taro 組件對應的組件庫。這個步驟至關重要,因為它建立了 Taro 組件和 ArkUI 組件之間的映射關系。例如,我們需要為 Taro 的 View、Text、Image 等基礎組件創建對應的 ArkUI 組件。這樣,當我們遍歷 Taro 虛擬節點樹時,就能找到每個節點在 ArkUI 中的對應實現。

?

在節點映射的過程中,我們注意到 Taro 虛擬節點樹與實際 ArkUI 視圖結構存在差異。這些差異主要體現在以下幾個方面:

?復合組件結構:某些 Taro 組件在 ArkUI 中可能需要多個組件配合實現。例如,ScrollView 組件在 ArkUI 中可能需要一個 Scroll 節點搭配一個 Stack 來實現完整功能。

?層級位置調整:一些特殊定位的節點(如 Fixed 定位的元素)在最終渲染時的位置可能與其在虛擬節點樹中的層級不一致。這需要在生成渲染樹時進行特殊處理。

?平臺特定組件:某些 Taro 組件可能需要使用 ArkUI 特有的組件或布局方式來實現,這要求我們在轉換過程中進行適當的調整和映射。

wKgaoWcXQB2AKlzcAAkvMJEcN_w449.png

因此,在生成渲染樹時,我們需要一個更復雜的轉換過程,不僅要考慮簡單的一對一映射,還要處理這些結構性的差異,確保最終生成的 ArkUI 組件樹能夠正確反映預期的視圖結構和布局。因此,在Taro > ArkUI的節點對接中,我們需要維護一棵 Render Tree,用于做中間的橋梁。

?

1. 根據組件類型 創建 Taro Element

在創建 Taro Element 的過程中,我們根據組件的類型來實例化相應的 Taro 元素。這一步驟是將 React 組件轉換為 Taro 內部表示的關鍵。

// 根據組件類型創建對應的Taro節點
std::shared_ptr TaroDocument::CreateElement(napi_value &node) {
        // 獲取組件類型
    TAG_NAME tag_name_ = TaroDOM::TaroElement::GetTagName(node);
    // 根據組件類型,創建對應的實例
    std::shared_ptr item;
    switch (tag_name_) {
        case TAG_NAME::SCROLL_VIEW: {
            item = std::make_shared(node);
            break;
        }
        case TAG_NAME::IMAGE:
            item = std::make_shared(node);
            break;
        }
        case TAG_NAME::SPAN:
        case TAG_NAME::TEXT: {
            item = std::make_shared(node);
            break;
        }
        case TAG_NAME::SWIPER: {
            item = std::make_shared(node);
            break;
        }
        // ...
    }
    return item;
}

2. Taro Element 創建 Taro RenderNode

在創建完 Taro Element 之后,下一步是將其轉換為 Taro RenderNode。這個過程是將 Taro 的內部表示進一步轉化為更接近 ArkUI 結構的渲染節點。

// 創建 Taro RenderNode
void TaroSwiper::Build() {
    if (!is_init_) {
        // create render node
        TaroElementRef element = std::static_pointer_cast(shared_from_this());
        auto render_swiper = std::make_shared(element);
        render_swiper->Build();
    }
}

3. Taro RenderNode 創建 ArkUI Node

最后一步是將 Taro RenderNode 轉換為實際的 ArkUI 節點。這個過程涉及到直接與 ArkUI 的底層 API 交互,創建和配置 ArkUI 的原生節點。實現了從 Taro 的渲染節點到 ArkUI 實際可渲染節點的最終轉換。

 // 創建 ArkUI Node
void TaroSwiperNode::Build() {
    NativeNodeApi *nativeNodeApi = NativeNodeApi::getInstance();
    // 創建一個Swiper的ArkUI節點
    SetArkUINodeHandle(nativeNodeApi->createNode(ARKUI_NODE_SWIPER));
}

通過這三個步驟,我們在 C++ 層面成功實現了 React 組件結構到 ArkUI 原生組件結構的映射。這一過程使 Taro 應用能夠在鴻蒙系統上準確地渲染和運行,為跨平臺開發提供了有力支持。

總結

最后總結下,本文探討了Taro框架如何將React代碼成功運行在鴻蒙系統的ArkUI上。這個過程主要分為兩個關鍵部分:

wKgaoWcXQB-AfkaKAAmbVAbNNpQ388.png

React > ArkUI 架構圖

1. Taro對接React

Taro通過實現自定義的Renderer來對接React。這個Renderer包含了一系列方法,如createInstance、commitUpdate等,用于將React的操作轉換為Taro虛擬節點樹的操作。這個虛擬節點樹是Taro實現跨平臺的核心,為不同平臺的渲染提供了統一的中間表示。

2. Taro對接ArkUI

Taro通過自定義Renderer將React操作轉換為虛擬節點樹,然后通過三步轉換過程將其映射到ArkUI結構。這個過程涉及Taro Element、Taro RenderNode和ArkUI Node這三棵樹的維護,主要通過這三個流程步驟實現:

1.創建Taro Element:這一步將React組件轉換為Taro內部表示。

2.創建Taro RenderNode:將Taro的內部表示進一步轉化為更接近ArkUI層級結構的渲染節點。

3.創建ArkUI Node:最后一步是將Taro RenderNode轉換為實際的ArkUI節點,直接與ArkUI的底層API交互。

通過這種方式,Taro成功地將React組件結構映射到ArkUI原生組件結構,使得Taro應用能夠在鴻蒙系統上準確地渲染和運行,同時也為跨平臺開發提供了有力支持。

?
系列往期精選:

?《京東鴻蒙上線前瞻——使用 Taro 打造高性能原生應用》?

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 操作系統
    +關注

    關注

    37

    文章

    7001

    瀏覽量

    124619
  • APP
    APP
    +關注

    關注

    33

    文章

    1584

    瀏覽量

    73585
  • 代碼
    +關注

    關注

    30

    文章

    4874

    瀏覽量

    69930
收藏 人收藏

    評論

    相關推薦

    鴻蒙開發學習:初探【ArkUI-X】

    **簡單來說,ArkTS + ArkUI-X 對標的框架為 flutter,代碼,編譯為 native 全平臺運行**
    的頭像 發表于 05-13 15:58 ?1406次閱讀
    <b class='flag-5'>鴻蒙</b>開發學習:初探【<b class='flag-5'>ArkUI</b>-X】

    鴻蒙開發ArkUI-X基礎知識:【ArkUI代碼工程及構建介紹】

    ArkUI作為OpenHarmony的默認開發框架,本項目(ArkUI-X)中需要做到代碼同時支持多平臺構建,所以會采取共倉開發的方式
    的頭像 發表于 05-25 16:45 ?2521次閱讀
    <b class='flag-5'>鴻蒙</b>開發<b class='flag-5'>ArkUI</b>-X基礎知識:【<b class='flag-5'>ArkUI</b><b class='flag-5'>代碼</b>工程及構建介紹】

    鴻蒙Flutter實戰:07混合開發

    # 鴻蒙Flutter實戰:混合開發 鴻蒙Flutter混合開發主要有兩種形式。 ## 1.基于har flutter module打包成har包,原生
    發表于 10-23 16:00

    鴻蒙Taro實戰:01-搭建開發環境

    ,點擊右下角 Apply, OK, 完成簽名 運行 DevEcho 中,點擊運行按鈕,待控制臺執行完成,查看設備,頁面中將輸出以下內容 首頁 Hello world! 注意事項 運動 Taro
    發表于 11-06 16:42

    Taro下拉加載更多,拉刷新是什么

    Taro下拉加載更多,拉刷新
    發表于 06-15 17:10

    如何將RF與數模電路設計PCB

    如何將RF與數模電路設計PCB
    發表于 01-12 21:59 ?17次下載

    如何將手機系統升級為鴻蒙系統

    如何將手機系統升級為鴻蒙系統?具體操作還是很簡單的,下面就跟小編起來學學看吧!
    的頭像 發表于 07-07 10:03 ?6137次閱讀

    如何在鴻蒙系統ArkUI應用

    ? ? ? 大家可以看到很明顯這是ArkUI 的應用,遠程模擬器目前還只可以 P4
    的頭像 發表于 11-15 09:28 ?3259次閱讀
    如何在<b class='flag-5'>鴻蒙</b>系統<b class='flag-5'>上</b>弄<b class='flag-5'>一</b>個<b class='flag-5'>ArkUI</b>應用

    鴻蒙ArkUI開發-Tabs組件的使用

    鴻蒙ArkUI開發-Tabs組件的使用
    的頭像 發表于 01-19 16:01 ?2342次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>開發-Tabs組件的使用

    使用 Taro 開發鴻蒙原生應用 —— 快速上手,鴻蒙應用開發指南

    鴻蒙原生應用。 《使用 Taro 開發鴻蒙原生應用》 系列文章中,我們已經介紹了 鴻蒙的基
    的頭像 發表于 02-02 16:09 ?1175次閱讀
    使用 <b class='flag-5'>Taro</b> 開發<b class='flag-5'>鴻蒙</b>原生應用 —— 快速上手,<b class='flag-5'>鴻蒙</b>應用開發指南

    鴻蒙ArkUI:【從代碼到UI顯示的整體渲染流程】

    方舟開發框架(簡稱ArkUI)是鴻蒙開發的UI框架,提供如下兩種開發范式,我們 **只學聲明式開發范式**
    的頭像 發表于 05-13 16:06 ?1308次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>:【從<b class='flag-5'>代碼</b>到UI顯示的整體渲染流程】

    鴻蒙跨平臺框架:【ArkUi-X】創建工程

    鴻蒙推出了鴻ArkUi-X 框架所以就寫個文章分享
    的頭像 發表于 05-13 17:48 ?1298次閱讀
    <b class='flag-5'>鴻蒙</b>跨平臺框架:【<b class='flag-5'>ArkUi</b>-X】創建工程

    鴻蒙ArkUI-X跨平臺開發:【 編寫第ArkUI-X應用】

    通過構建個簡單的ArkUI頁面跳轉示例,快速了解資源創建引用,路由代碼編寫和UI布局編寫等應用開發流程。
    的頭像 發表于 05-21 17:36 ?999次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>ArkUI</b>-X跨平臺開發:【 編寫第<b class='flag-5'>一</b>個<b class='flag-5'>ArkUI</b>-X應用】

    Taro 鴻蒙技術內幕系列(二):如何讓 W3C 標準的 CSS鴻蒙

    作者:京東零售 馬銀濤 ? 基于 Taro 打造的京東鴻蒙 APP 已跟隨鴻蒙 Next 系統公測,本系列文章深入解析
    的頭像 發表于 10-31 10:54 ?359次閱讀
    <b class='flag-5'>Taro</b> <b class='flag-5'>鴻蒙</b><b class='flag-5'>技術</b><b class='flag-5'>內幕</b><b class='flag-5'>系列</b>(二):如何讓 W3C 標準的 CSS<b class='flag-5'>跑</b><b class='flag-5'>在</b><b class='flag-5'>鴻蒙</b>上

    Taro 鴻蒙技術內幕系列(三) - 多語言場景下的通用事件系統設計

    作者:京東零售 朱天健 基于 Taro 打造的京東鴻蒙 APP 已跟隨鴻蒙 Next 系統公測,本系列文章深入解析
    的頭像 發表于 11-27 11:42 ?445次閱讀
    <b class='flag-5'>Taro</b> <b class='flag-5'>鴻蒙</b><b class='flag-5'>技術</b><b class='flag-5'>內幕</b><b class='flag-5'>系列</b>(三) - 多語言場景下的通用事件系統設計
    主站蜘蛛池模板: 六月婷婷综合激情 | 特黄视频 | 床上激情四射 | 美女被拍拍拍拍拍拍拍拍 | 免费人成在观看 | 四虎影酷 | 国产精品美女久久久久网 | 免费精品一区二区三区在线观看 | bt天堂在线最新版www | 日韩三级小视频 | 狠狠乱| 日韩欧美卡通动漫在线观看 | 每日最新avhd101天天看新片 | 亚洲va欧美va国产综合久久 | 久久久久久久综合色一本 | 伦理片第一页 | 欧美成人午夜精品一区二区 | 亚洲一区二区三 | 免费在线观看的视频 | 欧美日韩亚洲国内综合网俺 | 男人女人的免费视频网站 | bt天堂在线观看 | 欧美zooz人禽交免费观看 | 欧美一区福利 | 欧美日韩你懂的 | 好男人社区www在线观看 | 日本三级在线观看免费 | 日本加勒比在线视频 | 色综合天天综合网国产成人 | 香蕉久久夜色精品国产2020 | 老色鬼久久综合第一 | 天天插天天操天天射 | 一本大道高清在线视频 视频 | 一区二区三区四区视频 | 欧美日韩一日韩一线不卡 | 午夜精品aaa国产福利 | 情久久| 激情综合激情 | 一丝不遮视频免费观看 | 男人的天堂欧美 | 国产精品嫩草影院人体模特 |