<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
React
技術棧的一大優勢在於 —— 社群繁榮,你業務中需要實現的功能基本都能找到對應的開源庫。
但繁榮也有不好的一面 —— 要實現同樣的功能,有太多選擇,到底選哪個?
本文要介紹一個12.7k的開源專案 —— Bulletproof React
這個專案為構建簡潔、強大、可延伸的前端專案架構的方方面面給出了建議。
Bulletproof React
與我們常見的腳手架(比如CRA
)不同,後者的作用是根據模版建立一個新專案。
而前者包含一個完整的React
全棧論壇專案:
作者通過這個專案舉例,展示了與專案架構相關的13個方面的內容,比如:
API
層如何設計限於篇幅有限,本文介紹其中部分觀點。
不知道這些觀點你是否認同呢?
專案推薦如下目錄形式:
src | +-- assets # 靜態資源 | +-- components # 公共元件 | +-- config # 全域性設定 | +-- features # 特性 | +-- hooks # 公用hooks | +-- lib # 二次匯出的第三方庫 | +-- providers # 應用中所有providers | +-- routes # 路由設定 | +-- stores # 全域性狀態stores | +-- test # 測試工具、mock伺服器 | +-- types # 全域性型別檔案 | +-- utils # 通用工具函數
其中,features
目錄與components
目錄的區別在於:
components
存放全域性公用的元件,而features
存放業務相關特性。
比如我要開發評論模組,評論作為一個特性,與他相關的所有內容都存在於features/comments
目錄下。
評論模組中需要輸入框,輸入框這個通用元件來自於components
目錄。
所有特性相關的內容都會收斂到features
目錄下,具體包括:
src/features/xxx-feature | +-- api # 與特性相關的請求 | +-- assets # 與特性相關的靜態資源 | +-- components # 與特性相關的元件 | +-- hooks # 與特性相關的hooks | +-- routes # 與特性相關的路由 | +-- stores # 與特性相關的狀態stores | +-- types # 與特性相關的型別申明 | +-- utils # 與特性相關的工具函數 | +-- index.ts # 入口
特性匯出的所有內容只能通過統一的入口呼叫,比如:
import { CommentBar } from "@/features/comments"
而不是:
import { CommentBar } from "@/features/comments/components/CommentBar
這可以通過設定ESLint
實現:
{ rules: { 'no-restricted-imports': [ 'error', { patterns: ['@/features/*/*'], }, ], // ...其他設定 } }
相比於將特性相關的內容都以扁平的形式存放在全域性目錄下(比如將特性的hooks存放在全域性hooks目錄),以features
目錄作為相關程式碼的集合能夠有效防止專案體積增大後程式碼組織混亂的情況。
專案中並不是所有狀態都需要儲存在中心化的store中,需要根據狀態型別區別對待。
對於元件的區域性狀態,如果只有元件自身以及他的子孫元件需要這部分狀態,那麼可以用useState
或useReducer
儲存他們。
與應用互動相關的狀態,比如開啟彈窗、通知、改變黑夜模式等,應該遵循將狀態儘可能靠近使用他的元件的原則,不要什麼狀態都定義為全域性狀態。
以Bulletproof React
中的範例專案舉例,首先定義通知相關的狀態:
// bulletproof-react/src/stores/notifications.ts export const useNotificationStore = create<NotificationsStore>((set) => ({ notifications: [], addNotification: (notification) => set((state) => ({ notifications: [...state.notifications, { id: nanoid(), ...notification }], })), dismissNotification: (id) => set((state) => ({ notifications: state.notifications.filter((notification) => notification.id !== id), })), }));
再在任何使用通知相關的狀態的地方參照useNotificationStore
,比如:
// bulletproof-react/src/components/Notifications/Notifications.tsx import { useNotificationStore } from '@/stores/notifications'; import { Notification } from './Notification'; export const Notifications = () => { const { notifications, dismissNotification } = useNotificationStore(); return ( <div > {notifications.map((notification) => ( <Notification key={notification.id} notification={notification} onDismiss={dismissNotification} /> ))} </div> ); };
這裡使用的狀態管理工具是zustand
,除此之外還有很多可選方案:
context
+ hooks
redux
+ redux toolkit
mobx
constate
jotai
recoil
xstate
這些方案各有特點,但他們都是為了處理應用狀態。
對於從伺服器端請求而來,快取在前端的資料,雖然可以用上述處理應用狀態的工具解決,但伺服器端快取狀態相比於應用狀態,還涉及到快取失效、序列化資料等問題。
所以最好用專門的工具處理,比如:
react-query - REST
+ GraphQL
swr - REST
+ GraphQL
apollo client
- GraphQL
urql
- GraphQl
表單資料需要區分受控與非受控,表單本身還有很多邏輯需要處理(比如表單校驗),所以也推薦用專門的庫處理這部分狀態,比如:
React Hook Form
Formik
React Final Form
URL
狀態包括:
url params
(/app/${dynamicParam})
query params
(/app?dynamicParam=1)
這部分狀態通常是路由庫處理,比如react-router-dom
。
本文節選了部分Bulletproof React
中推薦的方案,有沒有讓你認可的觀點呢?
以上就是React構建簡潔強大可延伸的前端專案架構的詳細內容,更多關於React前端專案架構的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45