欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解使用React進行組件庫開發(fā)

 更新時間:2018年02月06日 10:10:12   作者:callmedadaxin  
本篇文章主要介紹了詳解使用React進行組件庫開發(fā),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

最近針對日常業(yè)務(wù)需求使用react封裝了一套[組件庫], 大概記錄下整個開發(fā)過程中的心得。由于篇幅原因,在這里只對開發(fā)過程中比較糾結(jié)的選型和打包等進行討論,后續(xù)再對具體組件的封裝進行討論。

概述

我們都知道,組件化的開發(fā)模式對于我們的開發(fā)效率有著極大的提升,針對我們?nèi)粘J褂玫幕窘M件進行封裝,可以大量的簡化我們對于基本UI的關(guān)注度,讓我們的工作聚焦在業(yè)務(wù)邏輯上,很好的分離業(yè)務(wù)與基礎(chǔ)UI的代碼,使得整個項目更有調(diào)理,這也是我們要進行本組件庫開發(fā)的原因。

然而現(xiàn)有React開源組件有很多,像ant-design和material-ui等等,是否需要花費精力打造適合自身團隊的組件庫往往需要酌情考慮。我們來看下我現(xiàn)有團隊及業(yè)務(wù)的幾個特點:

  1. 前端人員較多,需要相互協(xié)作,且有余力對組件進行開發(fā)
  2. 產(chǎn)品業(yè)務(wù)相對復(fù)雜,需對某些組件進行定制化開發(fā)
  3. 已經(jīng)有成熟的設(shè)計規(guī)范,針對各種基礎(chǔ)組件、基礎(chǔ)樣式等進行定義
  4. 目前的項目較為凌亂,第三方組件引用雜亂無章

可以看出,我們擁有封裝自己組件的精力和基礎(chǔ),并且擁有通過基礎(chǔ)組件封裝改變目前開發(fā)現(xiàn)狀的需求。所以,這件事情是我們應(yīng)該并且需要盡快完成的事情。

技術(shù)選型

針對組件庫的封裝,我們首先面對的是技術(shù)選型以及方案的規(guī)劃。大概包括以下兩點:

  1. 最基本的技術(shù)方案
  2. 開發(fā)流程和規(guī)范

技術(shù)方案選擇

Webpack + React + Sass

由于團隊現(xiàn)有的項目都是基于React+Redux進行開發(fā)的,那我們選擇的開發(fā)語言無疑是React。

SASS

針對css選擇,雖然現(xiàn)在針對組件化開發(fā),比較流行CSS Modules和CSS-IN-JS兩中模塊化解決方案,我們更希望我們的組件是可進行定制的。因此針對組件,我們以Sass作為預(yù)編譯語言,提搞效率和規(guī)范性。配合css-modules,我們可以很方便的進行針對實際需求進行樣式更改。例如我們有一個Tab組件,我們已經(jīng)定義好了其通用的樣式:

.tip-tab {
 border: 1px solid #ccc;
}
.tip-tab-item {
 border: 1px solid #ccc;
 
 &.active {
  border-color: red;
 }
}

而在業(yè)務(wù)中,針對某一個需求,我們需要針對Tab組件的樣式進行微調(diào)。讓其在激活(active)狀態(tài)下border-color是藍色的。你當(dāng)然可以說,我們可以讓我們的組件暴露出一些props,針對這些修改進行配置,傳入不同的props對應(yīng)不同的風(fēng)格。但是我們往往無法滿足所有的業(yè)務(wù)需求,不可能針對組件把各種樣式都封裝進去。針對這種方案,我們采用css-modules為其添加唯一的模塊樣式:

<Tab styleName="unique-tab" />

針對該模塊,對其進行基本樣式的修改:

.unique-tab {
 :global {
   .tip-tab-item {
    border-color: #eee;
    
    &.active {
     border-color: blue;
    }
   }
 }
}

這樣,針對該模塊的定制樣式,能很好的進行針對需求的樣式定制,同時不對全局樣式進行污染。

Icon

針對項目圖標(biāo),計劃使用svg-sprite方案。但是由于產(chǎn)品處于在不斷迭代的過程中,新的圖標(biāo)不斷在增加。目前我們并不會對圖標(biāo)統(tǒng)一進行打包,而是在每次進行組件打包的過程中,從項目中導(dǎo)入所有的圖標(biāo)。用以下方式進行引入:

import Icon from '@common/lib'
import errorIcon from '@images/error.svg'

<Icon link={errorIcon} />

其實更好的方式是針對所有的圖標(biāo)進行統(tǒng)一打包,生成svg-spirte文件(具體原理可以查詢svg-sprite,在此不再贅述)。當(dāng)我們進行使用時,只需直接引用即可,避免每次都進行打包,減少webpack處理依賴的時間:

<Icon type="error" />

開發(fā)流程和規(guī)范

針對開發(fā)流程和規(guī)范,我們遵循以下幾個原則:

  1. 組件庫完全獨立于項目進行開發(fā),便于后續(xù)多個項目進行使用等
  2. 組件庫包含三種模式:開發(fā),測試,打包,文檔案例,區(qū)分不同的入口及狀態(tài)
  3. 使用pure-renderautobind等盡可能保證組件的性能及效率
  4. 保證props和回調(diào)的語義性,如回調(diào)統(tǒng)一使用handleXXX進行處理

為了便于后續(xù)的擴展,我們更希望整個組件庫完全脫離于項目進行開發(fā)。保證組件庫僅對于最基本的組件進行封裝,將項目UI代碼與業(yè)務(wù)邏輯進行分離。

針對不同的模式下,我們有不同的文件入口,針對開發(fā)模式,我們啟動一個dev-server, 在里面對組件進行基本的封裝,并進行調(diào)試。打包時,我們只需對組件內(nèi)容進行封裝,暴露統(tǒng)一的接口。在文檔中,我們需要進行案例和說明的展示。所以我們在利用webpack的特性進行各種環(huán)境的配置:

npm run dev // 開發(fā)
npm run test // 測試
npm run build // 構(gòu)建
npm run styleguide // 文檔開發(fā)
npm run styleguide:build // 文檔打包

組件庫作為項目的最小力度支持,我們需要保證其最基本的渲染效率,因此我們采用pure-render/autobind等對其進行基本的優(yōu)化。React有很多優(yōu)化方式,在此不進行贅述。

打包

基礎(chǔ)

針對組件庫的打包,我們以UMD格式對其進行打包。webpack可以針對輸出進行格式設(shè)置:(引自cnode)

  1. “var” 以變量方式輸出
  2. “this” 以 this 的一個屬性輸出: this[“Library”] = xxx;
  3. “commonjs” 以 exports 的一個屬性輸出:exports[“Library”] = xxx;
  4. “commonjs2” 以 module.exports 形式輸出:module.exports = xxx;
  5. “amd” 以 AMD 格式輸出;
  6. “umd” 同時以 AMD、CommonJS2 和全局屬性形式輸出。

配置如下:

output: {
 path: config.build.assetsRoot,
 filename: utils.assetsPath('js/[name].js'),
 chunkFilename: utils.assetsPath('js/[id].js'),
 library: 'TipUi',
 libraryTarget: 'umd'
}

依賴

很明顯,我們封裝的是一個針對React的組件庫,并不應(yīng)該把React引用進去。一般我們可以采用externals的方式對其進行處理。

在這里, 我們采用dll方式將其與其他第三方依賴統(tǒng)一進行打包,并將manifest.json和三方依賴的輸出文件輸出到項目中去,在項目中也使用dllReference進行引用。避免在項目中使用到這些依賴時重復(fù)進行打包。

同時,由于我們的組件庫處于一個不斷維護的狀態(tài)。這就需要我們維持好項目庫和項目之間的打包關(guān)系,具體的流程如圖所示:

在每次進行項目打包的時候,首先檢測UI庫是否有更新,若沒有更新,則直接進行打包。反之繼續(xù)檢測dll的依賴是否有變化,若有,則打包dll,否則直接打包組件庫內(nèi)容。然后將輸出結(jié)果同步到項目中,再進行最終打包。

當(dāng)然,以上的這些流程都是自動進行的。

文檔和示例

一個完善的文檔對于一個組件庫是及其重要的,每個組件有什么樣的配置參數(shù),擁有哪些事件回調(diào),對應(yīng)的Demo和展示效果。假設(shè)沒有這些,除了封裝組件的人,沒有人知道它該如何使用。但是寫文檔的過程往往是痛苦的,在這里推薦幾個文檔生成庫,可以極大的簡化文檔工作:

docsify 基于Vue的組件生成器,輕量好用
react-styleguidist 基于React的組件庫文檔生成器,自動根據(jù)注釋生成文檔,支持Demo展示。超好用
bisheng ant design自己寫的文檔生成器

我們使用的styleguidist, 可以將md自動轉(zhuǎn)化為文檔,支持在md內(nèi)直接調(diào)用你封裝好的組件并進行展示,簡單好用。最后封裝的文檔大概長這樣:

總結(jié)

其實封裝組件庫這種工作有很多的東西值得琢磨和鉆研,由于篇幅原因,在這里只對開發(fā)過程中比較糾結(jié)的選型和打包等進行討論,后續(xù)再對具體組件的封裝進行討論。在書寫的同時,不斷參考下ant design這種優(yōu)秀的組件庫,能學(xué)到很多的東西。更深刻的理解封裝組件的思想,是一個很好的過程。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • react中context傳值和生命周期詳解

    react中context傳值和生命周期詳解

    這篇文章主要介紹了react中context傳值和生命周期,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • 從零開始搭建一個react項目開發(fā)

    從零開始搭建一個react項目開發(fā)

    這篇文章主要介紹了從零開始搭建一個react項目開發(fā),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • React 中的重新渲染實現(xiàn)

    React 中的重新渲染實現(xiàn)

    本文主要介紹了React 中的重新渲染實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • 詳解如何給React-Router添加路由頁面切換時的過渡動畫

    詳解如何給React-Router添加路由頁面切換時的過渡動畫

    這篇文章主要介紹了詳解如何給React-Router添加路由頁面切換時的過渡動畫,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04
  • React?split實現(xiàn)分割字符串的使用示例

    React?split實現(xiàn)分割字符串的使用示例

    當(dāng)我們需要將一個字符串按照指定的分隔符進行分割成數(shù)組時,我們可以在組件的生命周期方法中使用split方法來實現(xiàn)這個功能,本文就來介紹一下,感興趣的可以了解下
    2023-10-10
  • react-redux多個組件數(shù)據(jù)共享的方法

    react-redux多個組件數(shù)據(jù)共享的方法

    這篇文章主要介紹了react-redux多個組件數(shù)據(jù)共享的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-08-08
  • 在React頁面重新加載時保留數(shù)據(jù)的實現(xiàn)方法總結(jié)

    在React頁面重新加載時保留數(shù)據(jù)的實現(xiàn)方法總結(jié)

    在React頁面重新加載時保留數(shù)據(jù),可以通過多種方法來實現(xiàn),常見的方法包括使用瀏覽器的本地存儲(Local Storage 或 Session Storage)、URL參數(shù)、以及服務(wù)器端存儲等,本文給大家總結(jié)了一些具體實現(xiàn)方法,需要的朋友可以參考下
    2024-06-06
  • 一文掌握React?組件樹遍歷技巧

    一文掌握React?組件樹遍歷技巧

    這篇文章主要為大家介紹了React?組件樹遍歷技巧的掌握,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • react將文件轉(zhuǎn)為base64上傳的示例代碼

    react將文件轉(zhuǎn)為base64上傳的示例代碼

    本文主要介紹了react將文件轉(zhuǎn)為base64上傳的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • React入門教程之Hello World以及環(huán)境搭建詳解

    React入門教程之Hello World以及環(huán)境搭建詳解

    Facebook 為了開發(fā)一套更好更適合自己的JavaScript MVC 框架,所以產(chǎn)生了react。后來反響很好,所以于2013年5月開源。下面這篇文章主要給大家介紹了關(guān)于React入門教程之Hello World以及環(huán)境搭建的相關(guān)資料,需要的朋友可以參考借鑒。
    2017-07-07

最新評論