閑魚前端組件庫的建設(shè)
2022-11-13|14:42|發(fā)布在分類 / 引流推廣| 閱讀:104
2022-11-13|14:42|發(fā)布在分類 / 引流推廣| 閱讀:104
閑魚經(jīng)過這些年發(fā)展已經(jīng)變成了一個業(yè)務(wù)豐富,數(shù)量眾多且功能復(fù)雜的產(chǎn)品;而且業(yè)務(wù)高速發(fā)展,需求井噴,需要開發(fā)同學(xué)能夠快速做出響應(yīng)。同時這些產(chǎn)品線與閑魚的設(shè)計風(fēng)格有很多的共性,但各自不同的定位也導(dǎo)致了更多的差異性;制定一套各產(chǎn)品業(yè)務(wù)線通用的規(guī)范,并在各端提供一套靈活配置的組件物料庫,得到一些穩(wěn)定且高復(fù)用性的內(nèi)容對當前階段的閑魚前端來說是有極大的業(yè)務(wù)和技術(shù)價值的。
對于組件庫的目標整理如下
下圖是我們在建設(shè)前期分析的實現(xiàn)上述組件庫的關(guān)鍵技術(shù)點,后面我將圍繞這個思維導(dǎo)圖進行具體的分析
把所有的組件看成一個整體,一起打包發(fā)布。
單個倉庫,單個包,統(tǒng)一維護統(tǒng)一管理,比如Antd。
優(yōu)點
缺點
每個組件彼此獨立,單獨打包發(fā)布,單個倉庫多個包,統(tǒng)一維護單獨管理。
例如下面的目錄結(jié)構(gòu),所有的組件均在packages下面管理如下圖四左圖所示,每個組件的目錄結(jié)構(gòu)如圖三右圖所示。
優(yōu)點
缺點
根據(jù)我們項目的特點:多人參與、長期維護、組件分層,最后我們選擇基于管理工具lerna的多包管理方式。
但是由于我們的組件庫在分級上有「原子組件」和「通用業(yè)務(wù)組件」之分,考慮上面的使用成本問題,我們決定將原子組件以單包的形式管理,「原子組件」和「通用業(yè)務(wù)組件」同級,則以多包的形式放在packages下管理。
When babel-plugin-react-css-modules cannot resolve CSS module at a compile time, it imports a helper function (read Runtime styleNameresolution). Therefore, you must install babel-plugin-react-css-modules as a direct dependency of the project.
考慮我們提供的是基礎(chǔ)的組件,不希望引入過多的依賴所以最后放棄了社區(qū)插件的方案。
上面也提到不同的業(yè)務(wù)線存在主題定制、樣式差異化的需求,雖然我們在上面提供了pre最為props的方式,但是其不夠靈活且修改多個組件時成本過高,所以我們又去參考了社區(qū)主題替換的方案,基于css3 的var()能力輕易地就能實現(xiàn)想要的效果,修改樣式變量對應(yīng)的值就可以實現(xiàn)該變量對應(yīng)的樣式值的變化。
這里我們定義了全局的樣式變量,其拆分的緯度如下:
統(tǒng)一UI樣式規(guī)范
統(tǒng)一的交互動畫
將拆分后的樣式變量放在:root上定義并提供global-css的cdn地址到組件腳手架中,讓組件開發(fā)同學(xué)直接使用變量。經(jīng)過一段時間實踐這里我們也發(fā)現(xiàn)該方式會引入一定的開發(fā)成本,后期會考慮通過插件的方式關(guān)聯(lián)提醒消除樣式變量的使用成本。
前端經(jīng)過一段時間的發(fā)展對于低級bug的規(guī)避已經(jīng)有了不少工具,這里我們統(tǒng)一了開發(fā)語言TypeScript,并且添加了各個linter:
讓代碼在各種編輯器和IDE中保持風(fēng)格一致
需要注意的是有的編輯器可以直接使用,比如:WebStorm ;而有的編輯器需要安裝對應(yīng)的插件,比如大部分同學(xué)使用的編輯器Visual Studio Code。
最后使用的.editorconfig配置如下:
[*] # 匹配所有文件charset = utf-8 # 文件編碼是utf-8indent_style = space # 空格縮進indent_size = 2 # 縮進空格為2end_of_line = lf # 使用Unix-style 換行符trim_trailing_whitespace = true # 除去換行行首的任意空白字符insert_final_newline = true # 每個文件以換行結(jié)束
Find and fix problems in your JavaScript code
ESLint是針對js進行檢查,而我們?nèi)粘i_發(fā)時很多時候使用的是ts,對應(yīng)的工具是TSLint,TypeScript 官方在 19 年放棄 TSLint標記為廢棄,全面采用 ESLint
module.exports = getESLintConfig('rax-ts');
安裝stylelint插件,保存就會自動fix,同時也會對有問題的樣式進行告警
詳見官網(wǎng):https://stylelint.io/
安裝下面的插件,會調(diào)整你的樣式順序讓代碼更有可讀性
添加了Commitlint檢查,其規(guī)范如下
對組件進行分類最底層是原子組件,比如button,它會被通用業(yè)務(wù)組件引用,不會經(jīng)常輕易修改;在這上面是通用業(yè)務(wù)組件,它是基于UI規(guī)范的產(chǎn)物,是隨著設(shè)計需求實時豐富的;最上面是各個行業(yè)或者業(yè)務(wù)的通用業(yè)務(wù)組件,它不基于UI規(guī)范,只是某一時期各個業(yè)務(wù)線通用的交互能力。
腳手架構(gòu)建方面主要基于集團現(xiàn)有的能力不做過多介紹。我們知道lerna 提供了不少Lerna Script供開發(fā)者使用,但是我們需要接入集團的腳手架、需要接入天馬組件的發(fā)布流程等閑魚業(yè)務(wù)定制化的需求,所以在這里我們對其在各個生命周期進行了一定修改,讓業(yè)務(wù)開發(fā)還是使用Lerna Script的指令,但是實現(xiàn)了我們需要定制化的各個需求。
在有了上述基礎(chǔ)后我們已經(jīng)開發(fā)組件了,為了保證組件的質(zhì)量,我們制定了上面的組件開發(fā)流程。目前組件質(zhì)量腳本檢查還不夠完善,需要人工cr保障。
s
demo部分我們的技術(shù)方案是基于Storybook:
Storybook運行在主應(yīng)用程序之外,用戶可以獨立地開發(fā)UI組件,而不必擔(dān)心應(yīng)用程序特定的依賴關(guān)系和需求,使開發(fā)人員能夠獨立地創(chuàng)建組件,并在孤立的開發(fā)環(huán)境中交互地展示組件
Storybook雖然好用但同時也引入了開發(fā)同學(xué)的學(xué)習(xí)成本他們不能像以前一樣寫md,參考了shopify 的polaris項目后我們決定采用將md文件轉(zhuǎn)化為storybook的方式進行。
同時在實踐中我們也發(fā)現(xiàn)由于我們組件的整體基礎(chǔ)是Rax,而Storybook對Rax的支持是有些一言難盡的,目前我們也遇到了不少問題后面有機會可以再詳細介紹。
目前組件庫的還在進一步的豐富中,開發(fā)可擴展性強、上手成本低的組件也是我們這一段時間以來遇到的一大挑戰(zhàn)。
已有的部分組件已經(jīng)在各個業(yè)務(wù)線使用,其提效的效果還是非常明顯的,減少了重復(fù)開發(fā)工作,業(yè)務(wù)開發(fā)可以無腦使用不用擔(dān)心UI還原問題,甚至還能對一些UI進行規(guī)范。
以上內(nèi)容如有不對之處,歡迎指正。
這個問題還有疑問的話,可以加幕.思.城火星老師免費咨詢,微.信號是為: msc496。
推薦閱讀:
更多資訊請關(guān)注幕 思 城。
微信掃碼回復(fù)「666」
別默默看了 登錄\ 注冊 一起參與討論!