辛宝Otto

辛宝Otto 的玄酒清谈

北漂前端程序员儿 / 探索新事物 / Web Worker 主播之一/内向话痨
xiaoyuzhou
email

速通-TinyVue 組件庫如何同時支持 vue23 react solid

速通 - TinyVue 组件库如何同时支持 vue23 react solid

參考《原來 TinyVue 組件庫跨框架(vue2、vue3、react、solid)是這樣實現的?

這篇文章介紹了跨框架組件庫的必要性和操作實踐。看標題挺感興趣的,這裡做個速通,原文引用我會標註,默認是自己的理解和思考。

背景#

OpenTiny 是華為出的組件庫,包含 TinyNG TinyVue TinyEngine 等內容。

統一輸出一套組件庫的能力、API ,能夠在不同技術棧保持相通,可以增強用戶使用信心,增加開發效率,跨技術棧實現相同 UI 表現。再者,給自己的組件庫建立人設標籤,挖掘潛在的用戶。

當然難度肯定也是有的。需要去抽象邏輯,抹平不同方案的差異。

image

這是官方給的架構圖。圖畫得不是特別好哈哈,文章寫的也不夠好,但是 Talk is cheap, show me the code ,給了 GitHub 倉庫 demo。可以輔助理解。

文章提到了兩個技術或者思路,抽象如下:

  • common 適配層
  • renderless 無渲染邏輯層

比如同樣一個 tab 菜單或者 button 按鈕,可以分成 UI 表現和邏輯兩塊,UI 表現可以歸類到 common 適配層,有哪些輸入輸出可以歸類到邏輯層。

技術實現#

使用 pnpm + monorepo 實現組件庫管理。

技術實現思路:

準備環境#

創建 monorepo 環境

準備不同的 scripts,比如 vue3 vue2 react solid ,使用微前端無界實現管理

依賴處理#

某些依賴需要區分 vue2 vue3 所以使用 pnpm.packageExtensions 進行區分,頭一次見這種用法。

  • 文章舉例如何同時兼容 react solid,首先是設定 react-button 和 solid-button
  • 還需要創建 packages/components/{platform}/common 文件夾。
  • 很有趣的文章提到了 ahooks 依賴的目的是提供 react 的響應式能力對標 vue 的響應式數據,哈哈哈還真看到了 https://ahooks.gitee.io/zh-CN/hooks/use-reactive

image.png

  • solid 本身就是 Signal 起家的,自帶響應式
  • react 使用 ahooks 進行模擬響應式數據
  • 模擬 vue 的 emit
  • 模擬 vue 的 nextTick

文章進行舉例,如何編寫 react solid 的代碼,依次實現 emit useNextTick useSetup,其中 useSetup 中返回 render 方法的內容。

代碼忽略。

理解 renderless 邏輯#

這部分代碼可以區分成兩部分:

  • 框架有關的入口函數
  • 框架無關的純函數

文章寫的不夠清楚,讀了幾遍還是有些困惑,可能還得實際操作才理解。

舉例 button 組件,在不同的平台需要實現 click 事件、需要實現 timer 重複點擊禁用的事件。

比如 renderless 中 react/solid 如何編寫,同需要實現 renderless 方法,返回 state 需要引用的 handleClick timer 等方法。因為這裡是適配層,只關注定義通用的 state 和框架有關的方法。

index 中實現框架無關的邏輯。在這裡實現 handleClicktimer 相關邏輯。

對於 button 來說:

  • react.js solid.js 去實現狀態管理、實現 click timer 方法
  • 具體 click 和 timer 如何實現在 index.js 通過框架無關的方式去實現

大致理解的邏輯如何實現,接下來是 UI 表現,這裡沒有黑科技,也是自己去實現 render 方法,只不過 react/vue 都支持 JSX,邏輯相近。

說到最後,還是放了一個 demo 實例,這樣就清楚多了
https://github.com/opentiny/cross-framework-component

image.png

舉例 packages/components/react ,這是 react 組件庫 demo 內容,可以看到 common/src/index.js 這個文件是用來模擬框架差異,定義 useSetup 的,在 solid vue2 vue3 裡也有

再看 src/button/src/pc.jsx 這裡是定義 button 組件 UI 表現的。

這兩個文件定義了 UI 部分,那邏輯部分如何處理呢,看下圖

image.png

renderless/src/button 內部是 button 組件的邏輯,通用的放入 index.js ,適配的放到 react.js 裡。

繼續舉例子,vue 中如何定義 button 組件呢,在 vue/buttonvue/common 兩處內容裡定義。

image.png

剛才說到微前端,這是為了做 playground ,在一套頁面中展示不同的框架展示效果。

image.png

這裡對應 packages/home 目錄,這裡使用微前端 wujie 來完成不同頁面的嵌入。

image.png

展望#

這展示了一種組件設計的思路,抽象、抹平差異。

有機會做進一步的理解。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。