摘要:更多參考通過庫掌握函數(shù)組件有些時候,我們想要動態(tài)的加載一些組件按需加載,比如在一個單頁面應用中頁面的組件頁面的組件頁面的組件只有真正要實例化當前頁面的時候,才會去加載相應的組件。
react 前端項目技術(shù)選型、開發(fā)工具、周邊生態(tài)
聲明:這不是一篇介紹 React 基礎(chǔ)知識的文章,需要熟悉 React 相關(guān)知識
主架構(gòu):react, react-router, redux, redux-thunk, redux-saga, react-redux, dva, umi
擴展架構(gòu):styled-components, recompose, react-loadable
UI 框架:ant-design, ant-design-mobile, material-ui, Semantic-UI-React, blueprint, react-bootstrap
服務器端渲染:next.js, razzle, react-server, beidou
開發(fā)工具:storybook, react-devtools, redux-devtools, redux-devtools-extension
測試:enzyme, react-testing-library, jest
替代庫:preact, inferno
插件庫:react-motion, react-select, reselect, react-beautiful-dnd, react-canvas, redux-form, recharts, react-dnd, react-helmet
1. 架構(gòu)選型演進如果頁面比較簡單,可以只用 react
如果需要本地路由功能,比如在單頁面應用(SPA)中維持多個頁面,并且可以本地控制路由跳轉(zhuǎn)邏輯,這時就需要搭配使用 react-router
一般稍復雜的頁面都會遇到一些問題:組件之間的通信問題(比如 A 組件想要改變 B 組件的 state)、跨組件數(shù)據(jù)儲存與共享問題(比如多頁面購物車數(shù)據(jù)存儲)。react 本身并不能很好的解決這個問題,需要搭配使用 redux
redux 本身只實現(xiàn)了 flux 理念,以及一些基礎(chǔ)的功能,但在使用中,還需要擴展一些功能,比如異步派發(fā) action,這時可以選擇搭配使用 redux-thunk 來解決異步派發(fā) action 的問題。另外,也是選擇 redux-saga,但 redux-saga 不僅僅是異步派發(fā) action,它擁有強大的異步數(shù)據(jù)流處理功能,幾乎改變了整個 redux 的使用方式,是個重量級的家伙,如果是龐大且復雜的項目,推薦使用 redux-saga
redux 本身并不與 react 綁定,你依然可以把 redux 與 vue、angular 等其他框架一起使用。為了使 redux 與 react 開發(fā)時更流暢,可以使用 react-redux 把兩者鏈接起來,這樣開發(fā)體驗更佳
當在一個大型項目中使用以上的架構(gòu),就會使項目變得異常復雜和不可控(比如目錄結(jié)構(gòu)、action 定義方式等),這時就需要用 dva 來簡化數(shù)據(jù)流操作,降低項目的復雜度
以上涉及的都是代碼層面的架構(gòu),如果搭配 umi 一起使用,會有更佳的開發(fā)體驗。umi 內(nèi)部使用 roadhog(webpack 封裝庫), 具有動態(tài)路由、dva model 的自動加載、通過插件支持 PWA(Progressive Web App)、以路由為單元的 code splitting 等
總結(jié):
簡單頁面直接用 react,如果需要本地路由功能再加 react-router
如果需要跨組件通信、共享數(shù)據(jù)的話,不太復雜的頁面可以用 redux + redux-thunk,復雜的頁面可以用 redux + redux-saga
復雜大型應用(比如整個項目就是一個單頁面應用),可以用 react + react-router + redux + redux-saga + react-redux + dva + umi
2. 一些擴展的可選架構(gòu) 2.1 styled-components使用 styled-components,可以把 css 樣式代碼寫到 js 文件中。
一般來說,寫一個 react 組件,需要如下的結(jié)構(gòu):
- ComponentA.js - ComponentA.css - ComponentB.js - ComponentB.css - ...
# ComponentA.css .container { padding: 10px; } # ComponentA.js import styles from "./ComponentA.css"; export default props => ({props.children});
使用 styled-components 后,就可以去掉 css 文件:
- ComponentA.js - ComponentB.js - ...
# ComponentA.js import styled from "styled-components"; const Container = styled.div` padding: 10px; `; export default props => (2.2 recompose{props.children} );
寫了大量 react 組件之后(特別是使用 redux + react-redux 之后,組件的 state 已經(jīng)被剝離出去),感覺使用類聲明式(class)寫 react 組件其實并非最好的方式,而使用函數(shù)式組件會更佳:
函數(shù)式組件邏輯更清晰
避免 state 被濫用
類聲明式寫法:
class Counter extends React.Component { constructor(props) { super(props); this.state = { counter: 0, }; } setCounter(cb) { const { counter } = this.state; setState({ counter: cb(counter), }); } render() { const { counter } = this.state; const setCounter = this.setCounter; return (Count: {counter}); } }
函數(shù)式寫法:
import { withState } from "recompose" const enhance = withState("counter", "setCounter", 0) const Counter = enhance(({ counter, setCounter }) =>Count: {counter})
相比較而言,函數(shù)式寫法要清晰很多呢。
更多參考:通過Recompose庫掌握React函數(shù)組件
2.3 react-loadable有些時候,我們想要動態(tài)的加載一些組件(按需加載),比如在一個單頁面應用中:
- pages - PageA.js # a 頁面的組件 - PageB.js # b 頁面的組件 - PageC.js # c 頁面的組件 - ...
只有真正要實例化當前頁面的時候,才會去加載相應的組件。使用 react-loadable 封裝原來的組件,然后使用封裝后的組件,就像使用原來的組件一樣,react-loadable 會自動幫我們處理腳本加載。
import Loadable from "react-loadable"; import Loading from "./loading-component"; # 頁面組件還沒有加載成功時,顯示一個 loading 組件 const LoadableComponent = Loadable({ loader: () => import("./real-component-a"), # 動態(tài)加載真正的 A 組件 loading: Loading, }); export default class ComponentA extends React.Component { # 封裝后的組件,使用方式與原來一致 render() { return3. 選擇 UI 框架; } }
使用一個現(xiàn)成的 UI 框架,可以少寫很多代碼。
目前比較推薦的是:
ant-design + ant-design-mobile: 螞蟻金服出品
material-ui: google 材質(zhì)設(shè)計的實現(xiàn)
Semantic-UI-React: Semantic-UI for react
blueprint: 一套比較好用針對移動端的 UI 框架
4. 服務器端渲染服務器端渲染用得最多的是 next.js,其他可供選擇的有 razzle、react-server、beidou。
一般這些框架都會有一些目錄結(jié)構(gòu)、書寫方式、組件集成、項目構(gòu)建的要求,自定義屬性可能不是很強。
以 next.js 為例,整個應用中是沒有 html 文件的,所有的響應 html 都是 node 動態(tài)渲染的,包括里面的元信息、css, js 路徑等。渲染過程中,next.js 會根據(jù)路由,將首頁所有的組件渲染成 html,余下的頁面保留原生組件的格式,在客戶端渲染。
更多參考:細說后端模板渲染、客戶端渲染、node 中間層、服務器端渲染(ssr)
5. 開發(fā)工具開發(fā)時主要會用到的工具。
5.1 storybookstorybook 為組件開發(fā)搭建了一個強大的開發(fā)環(huán)境,并提供了以下的幾個功能:
提供了一個強大的 UI 組件管理頁面,可以很便捷、清晰的分組、管理多個組件或一個組件的多個不同狀態(tài)
在自動化交互測試之外,可以很方便的進行手動交互測試,并且可以動態(tài)改變組件參數(shù),查看視圖變化
可以將組件預覽導出為靜態(tài)資源,這樣就可以很方便查看組件的文檔和不同參數(shù)對應的不同視圖
還有一系列的插件,提供了很多額外的功能,幫助你更好的開發(fā)、測試、優(yōu)化組件
社區(qū)已經(jīng)有很多組件庫都在使用 storybook 開發(fā),比如:
react-dates 的 storybook react-dates - storybook
react-native-web 的 storybook react-native-web - storybook
更多參考:react、vue 組件開發(fā)利器:storybook
5.2 react-devtools這是專門針對 react 組件開發(fā)的 chrome 開發(fā)者工具插件,就像開發(fā)者工具的 Elements 一樣,可以查看整個頁面的 react 組件樹和每個組件的屬性和狀態(tài),并且可以動態(tài)的更改屬性和狀態(tài),然后會更新 UI 到應用上。
安裝通過 chrome 應用商店安裝 chrome - react-developer-tools.
其他安裝方式查看 react-devtools.
5.3 redux-devtools 與 redux-devtools-extension這是專門針對 redux 開發(fā)的 chrome 開發(fā)者工具插件,就像 react-devtools 一樣,可以查看整個頁面的 redux store 及其變化,并且可以動態(tài)的派發(fā) action,然后會更新 UI 到應用上。
5.3.1 安裝 redux-devtools這種安裝方式,redux-devtools 會嵌入到頁面中,成為頁面的一部分。
npm install --save-dev redux-devtools # 還可以安裝 npm install --save-dev redux-devtools-log-monitor npm install --save-dev redux-devtools-dock-monitor
更多信息參考 redux-devtools - Walkthrough.
5.3.2 安裝 redux-devtools-extension這種安裝方式是成為瀏覽器開發(fā)者工具的一個插件。
通過 chrome 應用商店安裝 chrome - redux-devtools.
其他安裝方式查看 redux-devtools-extension.
6. 測試一般 react 組件的測試,會用 enzyme + jest,jest 用來測試 JavaScript,enzyme 用來測試 react 組件。
另外,可以使用 react-testing-library 代替 react-dom/test-utils,達到更佳的測試體驗。
7. 替代庫如果你對組件的性能、虛擬 DOM 的算法有極致的追求,可以嘗試 react 的替代庫,如:
preact
inferno
8. 插件庫一些很實用的插件庫:
react-motion: 動畫組件
react-select: 下拉選擇組件
reselect: redux 的路徑選擇器
react-beautiful-dnd: 拖拽組件
react-canvas: canvas 組件
redux-form: redux 與表單綁定
recharts: D3 的 react 封裝
react-dnd: 又一個拖拽組件
react-helmet: document head 區(qū)域管理器
后續(xù)更多博客,查看 https://github.com/senntyou/blogs
作者:深予之 (@senntyou)
版權(quán)聲明:自由轉(zhuǎn)載-非商用-非衍生-保持署名(創(chuàng)意共享3.0許可證)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/100127.html
摘要:更多參考通過庫掌握函數(shù)組件有些時候,我們想要動態(tài)的加載一些組件按需加載,比如在一個單頁面應用中頁面的組件頁面的組件頁面的組件只有真正要實例化當前頁面的時候,才會去加載相應的組件。 react 前端項目技術(shù)選型、開發(fā)工具、周邊生態(tài) 聲明:這不是一篇介紹 React 基礎(chǔ)知識的文章,需要熟悉 React 相關(guān)知識 主架構(gòu):react, react-router, redux, redux...
摘要:有目錄結(jié)構(gòu)書寫方式組件集成項目構(gòu)建等的約束,整個應用中是沒有文件的,所有的響應都是動態(tài)渲染的,包括里面的元信息路徑等。更多參考細說后端模板渲染客戶端渲染中間層服務器端渲染開發(fā)工具開發(fā)時主要會用到的工具。 vue 前端項目技術(shù)選型、開發(fā)工具、周邊生態(tài) 聲明:這不是一篇介紹 Vue 基礎(chǔ)知識的文章,需要熟悉 Vue 相關(guān)知識 主架構(gòu):vue, vue-router, vuex UI 框...
摘要:有目錄結(jié)構(gòu)書寫方式組件集成項目構(gòu)建等的約束,整個應用中是沒有文件的,所有的響應都是動態(tài)渲染的,包括里面的元信息路徑等。更多參考細說后端模板渲染客戶端渲染中間層服務器端渲染開發(fā)工具開發(fā)時主要會用到的工具。 vue 前端項目技術(shù)選型、開發(fā)工具、周邊生態(tài) 聲明:這不是一篇介紹 Vue 基礎(chǔ)知識的文章,需要熟悉 Vue 相關(guān)知識 主架構(gòu):vue, vue-router, vuex UI 框...
閱讀 1364·2021-09-22 15:00
閱讀 3340·2019-08-30 14:00
閱讀 1260·2019-08-29 17:27
閱讀 1258·2019-08-29 16:35
閱讀 734·2019-08-29 16:14
閱讀 2070·2019-08-26 13:43
閱讀 2157·2019-08-26 11:35
閱讀 2349·2019-08-23 15:34