天天看點

kg-ui基于hippy-react元件庫設計和工程化思考

UI元件庫-背景

tnpm:http://tnpm.oa.com/package/@tencent/kg-ui 文檔:http://kgui.pages.oa.com/

為什麼要開發元件庫呢?

  1. 從業務角度:快速的業務疊代,元件有較多重複開發 //共性的地方應該複用
  2. 從設計角度:體驗不一緻;// 産品遵循一定規範性,保持産品一緻性
  3. 從開發效率角度:效率低; // 需要快速響應業務開發
  4. 從可維護性角度:可維護性差;// 需要統一代碼管理,不希望到處複制粘貼

UI元件庫目标

  1. 支援hippy/h5
  2. 低耦合可擴充
  3. 項目快速接入
  4. 版本管理
  5. 文檔清晰
  6. 支援換膚

元件庫整體架構

kg-ui基于hippy-react元件庫設計和工程化思考

整體架構

元件設計-高内聚低耦合

元件設計是有一些方法論可以遵循,如内聚性和耦合性,内聚性就是元件封裝的粒度,它主要是讓元件整體穩定一些。

設計原則

  1. 單一原則

單一原則: 每個元件僅提供一個功能。

單一職責的元件的好處很明顯,可以最大可能性地複用元件,但是這也帶來一個問題 , 過度單一也可能會導緻過度抽象,造成元件庫的碎片化;比如在實作小紅點,小紅點基本上是結合文字和圖檔展示,如果我們單獨把小紅點提出來,會導緻過于碎片化。

單一職責元件要建立在可複用的基礎上,對于不可複用的單一職責元件我們僅作為獨立元件的内部元件即可。

  1. 穩定性原則

比如我們有三個元件A、B、C,A不依賴于任何元件,X、Y、Z依賴于A。B不依賴于任何元件,M依賴于B,C是依賴于N,這個穩定性原則,最終的結果是:A>B>C;

kg-ui基于hippy-react元件庫設計和工程化思考

image

原因是在實際情況中,如果你要給X、Y、Z增加一個功能,首先你可能不會改A的代碼,因為這麼多人用了A,改挂了怎麼辦?隻有H依賴B,相對來說,你有可能修改B。這種情況下,A是相對更穩定的。也就是說,我們在依賴時,盡量去依賴很穩定的元件;

基于以上二點,我們設計和規劃我們元件庫的構成

kg-ui基于hippy-react元件庫設計和工程化思考

image

元件是由一些基本的元素組成,文字、顔色、和圖形等,通過這些基本的元素進行不同的組合,進而創造出統一且層次豐富的設計系統。

元件通用性

元件設計盡量靈活,除了豐富props,還支援使用者自定義完成個性化定制需求。

我們在元件封裝過程中發現,單純的props和方法是無法完全滿足使用者個性化需求的;

為此,我們制定靜态成員變量給到使用者去自定義排列組合;

比如Modal彈層的實作:

kg-ui基于hippy-react元件庫設計和工程化思考

image

const { ModalContent, ModalDesc, ModalLink, ModalAction, ModalFeed } = Modal;
<Modal
  isShow
  imageUrl="https://y.gtimg.cn/music/common/upload/t_cm3_photo_publish/1830565.jpg"
  title="标題"
  closeType="white"
  confirmText="确認"
  btnType="primary"
>
  <ModalContent>
    <ModalLink>這是個連結</ModalLink>
    <ModalDesc>這裡是句補充說明的輔助文案。</ModalDesc>
    <ModalFeed
      imageUrl="https://y.gtimg.cn/music/common/upload/t_k_guild_comeptition_join_list/1799661.png"
      title="主文案"
      desc="輔助文案"
    />
  </ModalContent>
</Modal>           

複制

總結:通用性設計其實是一定意義上放棄對 DOM 的掌控, 将 DOM 結構的決定權轉移給開發者。元件隻負責行為和最基本的 DOM 結構;

元件工程化

  1. 本地調試:支援web,hippy調試
  2. 元件依賴更新問題:接入多包管理lerna
一鍵安裝依賴:很多子產品都會依賴babel、eslint等子產品,這些大多都是可以共用的, 我們可以通過lerna link convert指令,将它們自動放到根目錄的package.json檔案中去。           

複制

通過lerna bootstrap 指令安裝依賴并将代碼庫進行npm link。

自動更新依賴:根據 git 資訊,檢查産生修改的元件;更新有過修改的元件的版本号,同時更新引用方元件的版本号;           

複制

支援獨立版本管理           

複制

  1. 代碼規範:

    接入@tencent/kg-lint

提供git hook: husky           

複制

支援eslint(代碼規範) + prettier(風格統一) + commitlint (送出規範)+ 團隊預設config 代碼規範eslint           

複制

送出規範commitlint            

複制

風格prettier           

複制

自動适配本地和CI環境,一鍵執行           

複制

  1. 代碼品質:

接入TS:類型檢查,代碼提示,自動補全;減少更小的BUG

接入Jest:支援 DOM API, 斷言庫,快照, 覆寫率, 生成報告;collectCoverage 生成測試報告;

`

  1. 元件工程化-版本管理
kg-ui基于hippy-react元件庫設計和工程化思考

image

目前我們支援了二種方式發包;

一種是合入master,自動發包;merge_requests 觸發 Orange CI,檢查編譯是否通過;目标分支被合入 master 後,master 分支觸發 Orange CI push hooks,釋出版本;

版本号生産遵循conventionalcommits;

根據 git 資訊,檢查産生修改的元件;

更新有過修改的元件的版本号,同時更新引用方元件的版本号;

将 package.json 修改送出 git, 并以該版本号作為 commit 資訊;

将所有有修改的元件釋出至 npm 釋出完成

fix: 類型 為 fix 的送出表示在代碼庫中修複了一個 bug,修改小版本号。

feat: 類型 為 feat 的送出表示在代碼庫中新增了一個功能,修改次版本号。

一種是分支釋出,手動打beta版本; 分支釋出不推薦;業務代碼必須使用正式版本号的 package;使用commit-hash,可以有效避免沖突;

文檔建設

kg-ui基于hippy-react元件庫設計和工程化思考

image

react-styleguidist是基于JSDOC的一個可以幫助react項目快速建構項目文檔的一個插件。 styleguide會預設為src/components/*/.js的js檔案生成文檔,styleguide讀取了注解、元件Props 我們生成了元件文檔,并且将propTypes的注解放到description中

元件擴充

es子產品規範輸出;es子產品import 和 export 是确定的;

借鑒 antd 接入babel-plugin-import 預設支援基于 ES module 的 tree shaking,

  1. k歌項目接入babel-plugin-importimport { Modal } from “@tencent/kg-ui”;
  2. 手動引入(不使用以下插件也會有按需加載的效果)import Modal from "@tencent/kg-ui/lib/components/Modal/index";

成功展示

目前已經在全民k歌和輕緣APP全面接入

kg-ui基于hippy-react元件庫設計和工程化思考

image

歡迎體驗:

tnpm:http://tnpm.oa.com/package/@tencent/kg-ui

文檔:http://kgui.pages.oa.com/