網站首頁 編程語言 正文
引言?
React
技術棧的一大優勢在于 —— 社區繁榮,你業務中需要實現的功能基本都能找到對應的開源庫。
但繁榮也有不好的一面 —— 要實現同樣的功能,有太多選擇,到底選哪個?
本文要介紹一個12.7k的開源項目 —— Bulletproof React
這個項目為構建簡潔、強大、可擴展的前端項目架構的方方面面給出了建議。
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
狀態包括:
url params
(/app/${dynamicParam})
query params
(/app?dynamicParam=1)
這部分狀態通常是路由庫處理,比如react-router-dom
。
總結
本文節選了部分Bulletproof React
中推薦的方案,有沒有讓你認可的觀點呢?
原文鏈接:https://juejin.cn/post/7122636487555809311
相關推薦
- 2022-02-28 ./node_modules/taro-ui/dist/weapp/index.ts Module
- 2022-05-28 C語言實現宿舍管理課程設計_C 語言
- 2022-05-22 Virtualbox?安裝?docker的流程分析_VirtualBox
- 2022-07-23 詳解Nginx的超時keeplive_timeout配置步驟_nginx
- 2023-01-13 Python實現復制文檔數據_python
- 2022-11-16 C語言數據結構之雙鏈表&循環鏈表&靜態鏈表詳解_C 語言
- 2022-05-27 C++左值與右值,右值引用,移動語義與完美轉發詳解_C 語言
- 2023-01-17 Qt中控件的函數使用教程分享_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支