小編給大家分享一下如何使用React進(jìn)行組件庫開發(fā),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
為華龍等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及華龍網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站建設(shè)、做網(wǎng)站、華龍網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!概述
我們都知道,組件化的開發(fā)模式對于我們的開發(fā)效率有著極大的提升,針對我們?nèi)粘J褂玫幕窘M件進(jìn)行封裝,可以大量的簡化我們對于基本UI的關(guān)注度,讓我們的工作聚焦在業(yè)務(wù)邏輯上,很好的分離業(yè)務(wù)與基礎(chǔ)UI的代碼,使得整個(gè)項(xiàng)目更有調(diào)理,這也是我們要進(jìn)行本組件庫開發(fā)的原因。
然而現(xiàn)有React開源組件有很多,像ant-design和material-ui等等,是否需要花費(fèi)精力打造適合自身團(tuán)隊(duì)的組件庫往往需要酌情考慮。我們來看下我現(xiàn)有團(tuán)隊(duì)及業(yè)務(wù)的幾個(gè)特點(diǎn):
前端人員較多,需要相互協(xié)作,且有余力對組件進(jìn)行開發(fā)
產(chǎn)品業(yè)務(wù)相對復(fù)雜,需對某些組件進(jìn)行定制化開發(fā)
已經(jīng)有成熟的設(shè)計(jì)規(guī)范,針對各種基礎(chǔ)組件、基礎(chǔ)樣式等進(jìn)行定義
目前的項(xiàng)目較為凌亂,第三方組件引用雜亂無章
可以看出,我們擁有封裝自己組件的精力和基礎(chǔ),并且擁有通過基礎(chǔ)組件封裝改變目前開發(fā)現(xiàn)狀的需求。所以,這件事情是我們應(yīng)該并且需要盡快完成的事情。
技術(shù)選型
針對組件庫的封裝,我們首先面對的是技術(shù)選型以及方案的規(guī)劃。大概包括以下兩點(diǎn):
最基本的技術(shù)方案
開發(fā)流程和規(guī)范
技術(shù)方案選擇
Webpack + React + Sass
由于團(tuán)隊(duì)現(xiàn)有的項(xiàng)目都是基于React+Redux進(jìn)行開發(fā)的,那我們選擇的開發(fā)語言無疑是React。
SASS
針對css選擇,雖然現(xiàn)在針對組件化開發(fā),比較流行CSS Modules和CSS-IN-JS兩中模塊化解決方案,我們更希望我們的組件是可進(jìn)行定制的。因此針對組件,我們以Sass作為預(yù)編譯語言,提搞效率和規(guī)范性。配合css-modules,我們可以很方便的進(jìn)行針對實(shí)際需求進(jìn)行樣式更改。例如我們有一個(gè)Tab組件,我們已經(jīng)定義好了其通用的樣式:
.tip-tab { border: 1px solid #ccc; } .tip-tab-item { border: 1px solid #ccc; &.active { border-color: red; } }
而在業(yè)務(wù)中,針對某一個(gè)需求,我們需要針對Tab組件的樣式進(jìn)行微調(diào)。讓其在激活(active)狀態(tài)下border-color是藍(lán)色的。你當(dāng)然可以說,我們可以讓我們的組件暴露出一些props,針對這些修改進(jìn)行配置,傳入不同的props對應(yīng)不同的風(fēng)格。但是我們往往無法滿足所有的業(yè)務(wù)需求,不可能針對組件把各種樣式都封裝進(jìn)去。針對這種方案,我們采用css-modules為其添加唯一的模塊樣式:
<Tab styleName="unique-tab" />
針對該模塊,對其進(jìn)行基本樣式的修改:
.unique-tab { :global { .tip-tab-item { border-color: #eee; &.active { border-color: blue; } } } }
這樣,針對該模塊的定制樣式,能很好的進(jìn)行針對需求的樣式定制,同時(shí)不對全局樣式進(jìn)行污染。
Icon
針對項(xiàng)目圖標(biāo),計(jì)劃使用svg-sprite方案。但是由于產(chǎn)品處于在不斷迭代的過程中,新的圖標(biāo)不斷在增加。目前我們并不會對圖標(biāo)統(tǒng)一進(jìn)行打包,而是在每次進(jìn)行組件打包的過程中,從項(xiàng)目中導(dǎo)入所有的圖標(biāo)。用以下方式進(jìn)行引入:
import Icon from '@common/lib' import errorIcon from '@images/error.svg' <Icon link={errorIcon} />
其實(shí)更好的方式是針對所有的圖標(biāo)進(jìn)行統(tǒng)一打包,生成svg-spirte文件(具體原理可以查詢svg-sprite,在此不再贅述)。當(dāng)我們進(jìn)行使用時(shí),只需直接引用即可,避免每次都進(jìn)行打包,減少webpack處理依賴的時(shí)間:
<Icon type="error" />
開發(fā)流程和規(guī)范
針對開發(fā)流程和規(guī)范,我們遵循以下幾個(gè)原則:
組件庫完全獨(dú)立于項(xiàng)目進(jìn)行開發(fā),便于后續(xù)多個(gè)項(xiàng)目進(jìn)行使用等
組件庫包含三種模式:開發(fā),測試,打包,文檔案例,區(qū)分不同的入口及狀態(tài)
使用pure-renderautobind等盡可能保證組件的性能及效率
保證props和回調(diào)的語義性,如回調(diào)統(tǒng)一使用handleXXX進(jìn)行處理
為了便于后續(xù)的擴(kuò)展,我們更希望整個(gè)組件庫完全脫離于項(xiàng)目進(jìn)行開發(fā)。保證組件庫僅對于最基本的組件進(jìn)行封裝,將項(xiàng)目UI代碼與業(yè)務(wù)邏輯進(jìn)行分離。
針對不同的模式下,我們有不同的文件入口,針對開發(fā)模式,我們啟動一個(gè)dev-server, 在里面對組件進(jìn)行基本的封裝,并進(jìn)行調(diào)試。打包時(shí),我們只需對組件內(nèi)容進(jìn)行封裝,暴露統(tǒng)一的接口。在文檔中,我們需要進(jìn)行案例和說明的展示。所以我們在利用webpack的特性進(jìn)行各種環(huán)境的配置:
npm run dev // 開發(fā) npm run test // 測試 npm run build // 構(gòu)建 npm run styleguide // 文檔開發(fā) npm run styleguide:build // 文檔打包
組件庫作為項(xiàng)目的最小力度支持,我們需要保證其最基本的渲染效率,因此我們采用pure-render/autobind等對其進(jìn)行基本的優(yōu)化。React有很多優(yōu)化方式,在此不進(jìn)行贅述。
打包
基礎(chǔ)
針對組件庫的打包,我們以UMD格式對其進(jìn)行打包。webpack可以針對輸出進(jìn)行格式設(shè)置:(引自cnode)
“var” 以變量方式輸出
“this” 以 this 的一個(gè)屬性輸出: this[“Library”] = xxx;
“commonjs” 以 exports 的一個(gè)屬性輸出:exports[“Library”] = xxx;
“commonjs2” 以 module.exports 形式輸出:module.exports = xxx;
“amd” 以 AMD 格式輸出;
“umd” 同時(shí)以 AMD、CommonJS2 和全局屬性形式輸出。
配置如下:
output: { path: config.build.assetsRoot, filename: utils.assetsPath('js/[name].js'), chunkFilename: utils.assetsPath('js/[id].js'), library: 'TipUi', libraryTarget: 'umd' }
依賴
很明顯,我們封裝的是一個(gè)針對React的組件庫,并不應(yīng)該把React引用進(jìn)去。一般我們可以采用externals的方式對其進(jìn)行處理。
在這里, 我們采用dll方式將其與其他第三方依賴統(tǒng)一進(jìn)行打包,并將manifest.json和三方依賴的輸出文件輸出到項(xiàng)目中去,在項(xiàng)目中也使用dllReference進(jìn)行引用。避免在項(xiàng)目中使用到這些依賴時(shí)重復(fù)進(jìn)行打包。
同時(shí),由于我們的組件庫處于一個(gè)不斷維護(hù)的狀態(tài)。這就需要我們維持好項(xiàng)目庫和項(xiàng)目之間的打包關(guān)系,具體的流程如圖所示:
在每次進(jìn)行項(xiàng)目打包的時(shí)候,首先檢測UI庫是否有更新,若沒有更新,則直接進(jìn)行打包。反之繼續(xù)檢測dll的依賴是否有變化,若有,則打包dll,否則直接打包組件庫內(nèi)容。然后將輸出結(jié)果同步到項(xiàng)目中,再進(jìn)行最終打包。
當(dāng)然,以上的這些流程都是自動進(jìn)行的。
文檔和示例
一個(gè)完善的文檔對于一個(gè)組件庫是及其重要的,每個(gè)組件有什么樣的配置參數(shù),擁有哪些事件回調(diào),對應(yīng)的Demo和展示效果。假設(shè)沒有這些,除了封裝組件的人,沒有人知道它該如何使用。但是寫文檔的過程往往是痛苦的,在這里推薦幾個(gè)文檔生成庫,可以極大的簡化文檔工作:
docsify 基于Vue的組件生成器,輕量好用
react-styleguidist 基于React的組件庫文檔生成器,自動根據(jù)注釋生成文檔,支持Demo展示。超好用
bisheng ant design自己寫的文檔生成器
我們使用的styleguidist, 可以將md自動轉(zhuǎn)化為文檔,支持在md內(nèi)直接調(diào)用你封裝好的組件并進(jìn)行展示,簡單好用。最后封裝的文檔大概長這樣:
其實(shí)封裝組件庫這種工作有很多的東西值得琢磨和鉆研,由于篇幅原因,在這里只對開發(fā)過程中比較糾結(jié)的選型和打包等進(jìn)行討論,后續(xù)再對具體組件的封裝進(jìn)行討論。在書寫的同時(shí),不斷參考下ant design這種優(yōu)秀的組件庫,能學(xué)到很多的東西。更深刻的理解封裝組件的思想,是一個(gè)很好的過程。
以上是“如何使用React進(jìn)行組件庫開發(fā)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
本文標(biāo)題:如何使用React進(jìn)行組件庫開發(fā)-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://muchs.cn/article34/pgjse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、App設(shè)計(jì)、自適應(yīng)網(wǎng)站、全網(wǎng)營銷推廣、網(wǎng)站建設(shè)、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容