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