開源React Native元件庫beeshell 2.0釋出
2018年,我們開源了React Native元件庫——beeshell 1.0。時隔一年,我們對React Native元件庫繼續最佳化,實現beeshell 2.0升級,開源38個功能。希望更好的服務社群,同時也希望利用社群力量豐富React Native元件庫。
引言
背景
UI 風格一致性。在同一個業務中,各個元件要有一致的 UI 風格,保證使用者體驗、塑造品牌形象。
通用性。可以支援不同的業務方,可以靈活定製不同的業務需求,最大化元件複用率,減少重複開發。
易用性。元件的功能、行為表現符合開發者的直觀感受,易於學習和使用、減輕記憶負擔;功能豐富,可以支援多種業務場景,支援特定業務場景的多種情況。 穩定性。RN 元件庫需要同時支援 iOS、Android、Web 三個平臺,元件要在三個平臺可用、可靠、穩定。
簡而言之,元件庫的目標是通用、易用、穩定、靈活。
系統設計
我們的目標是提供一套通用、易用、穩定、靈活的元件。然而,對一個元件來說,如果通用性、靈活性強,則易用性、穩定性勢必較差。如何合理的處理這個矛盾呢?
架構升級
圖F
beeshell 2.0 與 1.0 的架構在整體上保持一致,共分成四層:業務層、元件庫(體系)、RN 層、系統層。而 beeshell 2.0 的架構升級,則主要體現在第二層與第三層。
MTD 的關注點是通用性、靈活性,所以提供的是基礎、通用的元件。元件的擴充套件能力極強,可以滿足多個業務方的定製化需求。
Roo 是對 MTD 的繼承與擴充套件,定製了外賣業務的 UI 風格與功能,通用性減弱,功能性和業務性增強,關注易用性、業務性、一致性。
beeshell(準確說是 2.0 版本)是對 Roo 的繼承與擴充套件,與 Roo 相比,去除了過於業務化的元件與功能,納入並整合社群的需求,關注通用性、易用性、穩定性。
元件庫體系的三個版本,內部的架構設計一致,本文只詳細介紹 beeshell 開源版本。
介面層。彙總所有元件,統一輸出,使用全部引入的方式,方便元件使用。另外,為了避免引入過多無用元件,引起資源包過大,也支援元件的按需引入。
元件層。細分為原子、分子、擴充套件元件。
與 beeshell 1.0 相比,我們對元件在更細的粒度上進行拆分。同時,層次劃分也更加精細、明確。如上圖 F 所示:基礎元件細分為分子、原子元件。這樣,元件的繼承、組合方式更加靈活,能夠最大化程式碼複用。而且,原子、分子、擴充套件元件,各層次元件各司其職,“關注度分離”,兼顧通用性和易用性。工具層。與 beeshell 1.0 相比,工具更加完備。不但新增了樹形結構處理器、校驗器等;而且工具的獨立性更強,與元件完全解耦,與元件配合實現功能。
這樣,一方面,使得元件實現更加簡潔,提升了元件的可維護性;另一方面,可以將工具提供給使用者,方便使用者開發,提升元件庫的功能性、易用性。而且,工具與元件的解耦遵循“關注度分離”的原則。三端適配。RN 在整體上實現了跨平臺,iOS、Android、Web 三端使用一套程式碼,但是在一些細節方面,例如:特殊 API 的支援、相對位置計算等,各個平臺有較大差異。為了更好的支援三端,保證跨平臺穩定性,還需要在這一層做很多適配工作。
第三層:RN 層
MRN 是基於開源的 RN 框架改造並完善而成的一套動態化方案。MRN 從三個方面彌補 RN 的不足:
動態化能力。RN 本身不支援熱更新,MRN 藉助公司內釋出平臺,實現包的上傳發布、下載更新、下線回滾等操作。 雙端(未來三端)複用問題。從設計原則上保證開發者對平臺的差異無明顯感知。 保障措施。在開發保障方面:提供腳手架工具、模版工程、開發文件等,方便開發者日常的 MRN 開發工作。提供多級分包機制,業務內部和業務之間能夠靈活組織程式碼;在執行保障方面,提供執行環境隔離,使得不同業務之間頁面執行無干擾。提供資料採集和指標大盤,及時發現執行中的問題,同時提供降級能力以應對緊急情況。
協作模式
圖X
結構方面:MTD 包含 beeshell 1.0 的全部內容,並進行了元件數量的擴充、元件功能的增強;Roo 包含 MTD,進行了定製與業務擴充套件;beeshell 2.0 與 Roo 基本一致,去除業務部分,納入社群需求。
首先,我們在 beeshell 1.0 的開發以及開源中,積累了豐富的經驗。在建設 MTD 公司通用版元件庫時,貢獻了 50% 的元件;同時,貢獻了許多設計模式與思路,大大加速了元件庫的建設。
其次,在 MTD 建設完成後,為了更加方便、快速的接入外賣的相關業務,以 MTD 為基礎,定製了外賣主題的元件庫 Roo,提升了元件庫的業務功能性和易用性。外賣相關的業務專案,在接入 Roo 後直接使用,無需再進行主題的定製與調整,在一定程度上節省開發成本。
第三,我們將共建的成果貢獻出來,以 Roo 為基礎,升級 beeshell 2.0 並開源。將部分過於業務化的元件移除,納入了社群的相關需求,保證元件庫的通用性、易用性與穩定性。
最後,對於公司內部,各個業務方可以以 MTD 為基礎進行擴充套件,定製自己的業務主題元件庫(Roo 就是第一個業務擴充套件);對於社群,各個開發者可以根據實際的業務需求,以 beeshell 為基礎,定製擴充套件元件庫。
綜上所述,我們以 beeshell 開發團隊為橋樑,建立了美團公司與開源社群之間進行技術交流的通道,美團公司、beeshell 團隊以及社群,可以在技術上互幫互助,共同建設、進步。
方案實現
UI 風格一致性
Roo Theme 向上實現了 UI 規範具體內容,將設計規範統一收斂,向下輸出主題變數、元件樣式類、通用樣式工具等,供各個元件庫以及業務方使用。
樣式一致性。透過繼承、擴充套件 Roo Theme,定義全域性性的主題變數,用於元件的樣式部分定義。主題變數範圍涉及品牌色、灰度、字型尺寸、間距以及元件級變數,為元件以及元件之間樣式一致性,提供了全面的保障。同時,元件庫提供了自定義主題變數的介面,可以重置相關變數的值,對 UI 風格進行一致性調整,實現一鍵換膚。另外,使用“內部樣式 < 主題 < 擴充套件樣式”的樣式優先順序覆蓋策略,保證了樣式部分的定製能力(在下文“定製化能力分級設計”章節中詳細介紹)。
動效一致性。一方面,依賴主題變數中定義的動畫開關變數(主要考慮到一些低端 Android 機器的效能問題),使用者可以關閉某個元件的動畫;另一方面,依賴元件庫的良好分層設計,我們將動畫類獨立實現,這樣可以使用策略模式,將動畫方便的整合到任意元件中。
下文詳細介紹樣式一致性和動效一致性。
樣式一致性
通常,一個產品的 UI 只會有一個品牌主色。然而,像 beeshell 這種品牌主色色值較淺的情況,一個品牌主色並不能夠支撐所有的應用場景。此時,可以透過加深主色的方式,再增加幾個色值,beeshell 的品牌主色還包括一個加深的色值 #ffa000,用於某些元件的啟用狀態,如下圖所示:
對於品牌主色的個數,需要根據色值的情況而定,不必過於拘泥規則,只要能有一致性的使用者體驗即可。
圖U
這四個色值,分別用於一般資訊、成功、警告、失敗這四種業務場景,以及從這四種業務場景所衍生出的場景。在一定程度上,保證色彩的一致性。
圖B
這樣的排版比例,可以使得介面的文字內容更加協調、流暢,進而提升了排版的一致性。
圖L
beeshell 使用了預設的字型行高,在一定程度保證了可讀性和排版的一致性。
圖S
邊線
動效一致性
引導使用者在檢視中的視覺焦點。
提示使用者完成手勢操作後會發生什麼。
暗示元素間的等級和空間關係。
讓使用者忽視系統背後發生的事情(比如抓取內容、或載入下一個檢視)。
使應用更有個性、更優雅、體驗更加一致。
beeshell 元件庫基於 Animated 進行了二次封裝,提供 FadeAnimated 和 SlideAnimated 兩個動畫類,支援淡入淡出動畫和滑動動畫,可以使用策略模式整合到任何元件中。
Modal 元件使用 FadeAnimated 類實現動畫,動效如下圖所示:
Dropdown 元件使用 SlideAnimated 類實現動畫,動效如下圖所示:
定製化能力分級設計
如上圖所示:第一個例子比較通用、規範。“區域文字內容”的文案與樣式需要支援自定義;第二個例子,需要支援多行文字以及圖示,即“區域內容”需要支援自定義;第三個例子,自定義的重點,由區域以及區域內部,轉移到區域之間的佈局,“區域佈局”需要支援自定義。
第一級定製化:定製主題變數
第二級定製化:提供定製屬性
程式碼實現為:
<Text style={this.props.labelTextStyle}>{this.props.labelText || '完成'}</Text>
LabelText 用於定製文案內容,將 LabelTextStyle 整體暴露出來,而不是隻暴露顏色單個屬性,這樣有兩點好處:
開發者都熟悉 Style 這個名稱與用法,但並不知道 xxxColor 是什麼,元件更加易用。
Style 不僅可以定製 Color,還支援 fontSize、fontWeight 等屬性,定製能力更強。
以上兩級主要是樣式部分的定製,使用了樣式優先順序覆蓋的策略,擴充套件樣式(labelTextStyle)覆蓋主題,主題覆蓋內部樣式。
到這裡,區域以及區域內部的定製化需求,就都可以滿足了。但是區域佈局的定製化,因為佈局情況太多,並不容易實現。如果再提供幾個屬性,用於定製佈局方式、頭部邊框樣式、底部按鈕,按照這種方式,屬性會無節制增加,勢必造成元件難以維護,易用性也會大打折扣。那應該如何實現?我們設計了第四級。
第四級定製化:繼承/組合基類
然後,元件庫實現了 BottomModal 元件,繼承 SlideModal,固定滑動的方向和開始位置,彈框內容橫向拉伸至全屏、縱向自適應,功能增強而定製化能力減弱。實現效果如下:
第四級定製化,是使用了新的思路,不再盲目的增加一個元件的功能,來幫助開發者滿足產品需求,而是提供了基礎工具。基礎工具實現了底層、複雜的部分,表現層的部分則讓渡給開發者,使用者自己實現,“授人以魚不如授人以漁”。
功能豐富
元件豐富度
雖然,beeshell 的元件數量還比不上 Antd Mobile RN(用不了多久也會超過),但已經超過 NativeBase 和 React Native Element。beeshell在元件數量上有很大優勢,可以支援更多的業務場景,且支援全部引入和按需引入,使用者無需擔心打包過多無用程式碼的問題。
功能豐富度
功能豐富度針對的是單個元件所支援的功能,旨在覆蓋特定業務場景的多種情況。
圖O
對於一個元件的功能豐富度,我們透過多方式收集、功能綜合分析、UI 模型抽象、技術實現、驗證反饋幾個步驟來保證。
多方式收集。透過多種方式來收集元件功能,收集方式包括:元件既有功能、業務新需求、標杆專案特性。
功能綜合分析。對收集的功能進行全面、綜合分析與考慮,得出元件需要支援的功能特性。
UI 模型抽象。對元件功能進行抽象設計,根據 UI 模型,明確抽象設計的合理性和有效性。
技術實現。根據平臺特性、技術選型來完成程式碼實現。
驗證反饋。元件實現後,會應用到業務或者示例工程來驗證,如果元件並不能滿足需求,需要重複執行以上幾步。
下文以 SlideModal 元件的實現,舉例說明:
其次,綜合分析得出,SlideModal 元件需要支援的功能有:彈出位置自定義、滑動方向自定義、全屏/半屏自定義。
由 UI 模型得出,SlideModal 元件透過 (offsetX, offsetY) 座標值來定義彈出位置;為了支援全屏/半屏效果,將螢幕分割為 4 個區域,分別自定義觸控效果(阻斷點選或者擊穿);彈框內容在一個區域展示,每個區域有 3 種滑動方向(圖 N-2),共支援 12 種滑動動效。
對比業界開源 RN 元件庫,針對滑動彈框場景,沒有幾個可以超過 SlideModal 的業務支援能力。
易用性提升
命名
元件名稱。
元件描述。
引入方式,包括全部、按需兩種引入方式。
示例演示,動圖與靜圖。
示例程式碼,使用虛擬碼,言簡意賅,能說明使用方式即可,同時,附有完整示例程式碼的連結。
API 說明,分成 Props 和 Methods 兩部分。
Props 包含 Name | Type | Required | Default | Description。 Methods 格式借鑑 RN 官方文件格式。
示例
測試
不僅如此,beeshell 2.0 在測試領域繼續探索,整合了“灰盒測試”(基於開源方案 Detox 實現)。
灰盒測試,是介於白盒測試與黑盒測試之間的一種測試,灰盒測試多用於整合測試階段,不僅關注輸出、輸入的正確性,同時也關注程式內部的情況。灰盒測試不像白盒那樣詳細、完整,但又比黑盒測試更關注程式的內部邏輯,常常是透過一些表徵性的現象、事件、標誌來判斷內部的執行狀態。
透過黑盒測試、白盒測試、灰盒測試,三種測試方案,更加全面的保證元件庫的程式碼質量,大大提高了程式碼可維護性。
開發除錯
未來規劃
第一階段,beeshell 1.0 版本,開源 20+ 元件,主要提供基礎功能。
第二階段,對我們在開發 React Native 應用幾年時間積累的元件進行整理,同時參考業界的標杆專案,開源 50+ 元件。
第三階段,調研移動端 APP 常用的功能與場景,分析與整理,然後在 beeshell 中實現,開源 100+ 元件。
此次 beeshell 2.0 升級,共計開源 38 個功能,而且已經詳細的規劃了另外的 15+ 元件,也會在近期開源,目前處於第二階段的收尾階段。
開源相關
Github 地址:beeshell
核心貢獻者
參考資料
beeshell 1.0 開源推廣文章 MATERIAL DESIGN
團隊介紹
在使用者方向上,構建了全鏈路的高可用體系,客戶端、Web前端和小程式等多終端的可用性在99%左右;跨多端高複用的區域性動態化框架在首頁、廣告、營銷等核心路徑的落地,提升了30%的研發效率;
在商家方向上,從提高程式優先順序、VoIP Push拉活、doze等方面進行保活定製,並提供了Shark、短鏈和Push等多條觸達通道,訂單到達率提升至98%以上; 在運營方向上,透過標準化研發流程、建設元件庫和Node服務以及前端應用的管理與頁面配置等提升10%的研發效率。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559353/viewspace-2658512/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- beeshell:開源的 React Native 元件庫React Native元件
- 美團React Native開源元件庫beeshell詳解React Native元件
- 開源| 呼叫ARUICalling開源元元件釋出UI元件
- React Native常用三方元件庫大全React Native元件
- 從Android到React Native開發(四、打包流程解析和釋出為Maven庫)AndroidReact NativeMaven
- uiw 1.2.16 釋出,基於 React 16 的元件庫UIReact元件
- uiw 1.2.14 釋出,基於 React 16 的元件庫UIReact元件
- uiw 1.2.15 釋出,基於 React 16 的元件庫UIReact元件
- React Native選擇器元件-react-native-slidepickerReact Native元件IDE
- React Native釋出重構路線圖React Native
- Element 2.7.2 釋出,基於 Vue 2.0 的桌面端元件庫Vue元件
- Vue3 企業級優雅實戰 - 元件庫框架 - 12 釋出開源元件庫Vue元件框架
- React Native第三方元件庫彙總React Native元件
- expo 搭建 react-native 元件庫【圖文並茂】React元件
- React Native釋出APP之打包iOS應用React NativeAPPiOS
- React Native專案自動化打包釋出React Native
- 從Android到React Native開發(四、打包流程解析和釋出AndroidReact Native
- 使用jitPack釋出android開源庫Android
- 使用Jitpack釋出開源Java庫Java
- 基於 React 的 UI 元件庫 uiw v1.2.10 釋出ReactUI元件
- React Native 實現 Slider 元件React NativeIDE元件
- G6 2.0 開源釋出 — 裂變·聚變
- G6 2.0 開源釋出 -- 裂變·聚變
- 11個React Native 元件庫和 Javascript 資料視覺化庫React Native元件JavaScript視覺化
- 2018,React Native第三方元件庫彙總React Native元件
- 輕鬆釋出 react 元件到 npmReact元件NPM
- Vue多元件倉庫開發與釋出Vue元件
- 開源一個天氣APP Build with React NativeAPPUIReact Native
- React Native 圖片檢視元件React Native元件
- React Native圖片快取元件React Native快取元件
- React Native 效能優化元件-PureComponentReact Native優化元件
- React Native 互動元件之 SwitchReact Native元件
- 【原始碼解析】React Native元件渲染原始碼React Native元件
- React Native開發封裝Toast與載入Loading元件React Native封裝AST元件
- 如何開發React UI元件庫ReactUI元件
- 《React Native高效開發》之create-react-native-appReact NativeAPP
- 浪潮資訊釋出源2.0基礎大模型,千億引數全面開源大模型
- React Native日期時間選擇元件React Native元件