最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React構(gòu)建簡潔強大可擴展的前端項目架構(gòu)

 更新時間:2022年08月05日 14:46:45   作者:魔術(shù)師卡頌  
這篇文章主要為大家介紹了React構(gòu)建簡潔強大可擴展的前端項目架構(gòu)實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言 

React技術(shù)棧的一大優(yōu)勢在于 —— 社區(qū)繁榮,你業(yè)務(wù)中需要實現(xiàn)的功能基本都能找到對應(yīng)的開源庫。

但繁榮也有不好的一面 —— 要實現(xiàn)同樣的功能,有太多選擇,到底選哪個?

本文要介紹一個12.7k的開源項目 —— Bulletproof React

這個項目為構(gòu)建簡潔、強大、可擴展的前端項目架構(gòu)的方方面面給出了建議。

Bulletproof React是什么

Bulletproof React與我們常見的腳手架(比如CRA)不同,后者的作用是根據(jù)模版創(chuàng)建一個新項目。

而前者包含一個完整的React全棧論壇項目:

作者通過這個項目舉例,展示了與項目架構(gòu)相關(guān)的13個方面的內(nèi)容,比如:

  • 文件目錄該如何組織
  • 工程化配置有什么推薦
  • 寫業(yè)務(wù)組件時該怎么規(guī)范
  • 怎么做狀態(tài)管理
  • API層如何設(shè)計
  • 等等......

限于篇幅有限,本文介紹其中部分觀點。

不知道這些觀點你是否認同呢?

文件目錄如何組織

項目推薦如下目錄形式:

src
|
+-- assets            # 靜態(tài)資源
|
+-- components        # 公共組件
|
+-- config            # 全局配置
|
+-- features          # 特性
|
+-- hooks             # 公用hooks
|
+-- lib               # 二次導(dǎo)出的第三方庫
|
+-- providers         # 應(yīng)用中所有providers
|
+-- routes            # 路由配置
|
+-- stores            # 全局狀態(tài)stores
|
+-- test              # 測試工具、mock服務(wù)器
|
+-- types             # 全局類型文件
|
+-- utils             # 通用工具函數(shù)

其中,features目錄與components目錄的區(qū)別在于:

components存放全局公用的組件,而features存放業(yè)務(wù)相關(guān)特性。

比如我要開發(fā)評論模塊,評論作為一個特性,與他相關(guān)的所有內(nèi)容都存在于features/comments目錄下。

評論模塊中需要輸入框,輸入框這個通用組件來自于components目錄。

所有特性相關(guān)的內(nèi)容都會收斂到features目錄下,具體包括:

src/features/xxx-feature
|
+-- api         # 與特性相關(guān)的請求
|
+-- assets      # 與特性相關(guān)的靜態(tài)資源
|
+-- components  # 與特性相關(guān)的組件
|
+-- hooks       # 與特性相關(guān)的hooks
|
+-- routes      # 與特性相關(guān)的路由
|
+-- stores      # 與特性相關(guān)的狀態(tài)stores
|
+-- types       # 與特性相關(guān)的類型申明
|
+-- utils       # 與特性相關(guān)的工具函數(shù)
|
+-- index.ts    # 入口

特性導(dǎo)出的所有內(nèi)容只能通過統(tǒng)一的入口調(diào)用,比如:

import { CommentBar } from "@/features/comments"

而不是:

import { CommentBar } from "@/features/comments/components/CommentBar

這可以通過配置ESLint實現(xiàn):

{
  rules: {
    'no-restricted-imports': [
      'error',
      {
        patterns: ['@/features/*/*'],
      },
    ],
    // ...其他配置
  }
}

相比于將特性相關(guān)的內(nèi)容都以扁平的形式存放在全局目錄下(比如將特性的hooks存放在全局hooks目錄),以features目錄作為相關(guān)代碼的集合能夠有效防止項目體積增大后代碼組織混亂的情況。

怎么做狀態(tài)管理

項目中并不是所有狀態(tài)都需要保存在中心化的store中,需要根據(jù)狀態(tài)類型區(qū)別對待。

組件狀態(tài)

對于組件的局部狀態(tài),如果只有組件自身以及他的子孫組件需要這部分狀態(tài),那么可以用useStateuseReducer保存他們。

應(yīng)用狀態(tài)

與應(yīng)用交互相關(guān)的狀態(tài),比如打開彈窗、通知、改變黑夜模式等,應(yīng)該遵循將狀態(tài)盡可能靠近使用他的組件的原則,不要什么狀態(tài)都定義為全局狀態(tài)。

Bulletproof React中的示例項目舉例,首先定義通知相關(guān)的狀態(tài):

// 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),
    })),
}));

再在任何使用通知相關(guān)的狀態(tài)的地方引用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>
  );
};

這里使用的狀態(tài)管理工具是zustand,除此之外還有很多可選方案:

context + hooks

redux + redux toolkit

mobx

constate

jotai

recoil

xstate

這些方案各有特點,但他們都是為了處理應(yīng)用狀態(tài)。

服務(wù)端緩存狀態(tài)

對于從服務(wù)端請求而來,緩存在前端的數(shù)據(jù),雖然可以用上述處理應(yīng)用狀態(tài)的工具解決,但服務(wù)端緩存狀態(tài)相比于應(yīng)用狀態(tài),還涉及到緩存失效、序列化數(shù)據(jù)等問題。

所以最好用專門的工具處理,比如:

react-query - REST + GraphQL

swr - REST + GraphQL

apollo client - GraphQL

urql - GraphQl

表單狀態(tài)

表單數(shù)據(jù)需要區(qū)分受控與非受控,表單本身還有很多邏輯需要處理(比如表單校驗),所以也推薦用專門的庫處理這部分狀態(tài),比如:

React Hook Form

Formik

React Final Form

URL狀態(tài)

URL狀態(tài)包括:

url params (/app/${dynamicParam})

query params (/app?dynamicParam=1)

這部分狀態(tài)通常是路由庫處理,比如react-router-dom。

總結(jié)

本文節(jié)選了部分Bulletproof React中推薦的方案,有沒有讓你認可的觀點呢?

以上就是React構(gòu)建簡潔強大可擴展的前端項目架構(gòu)的詳細內(nèi)容,更多關(guān)于React前端項目架構(gòu)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React中實現(xiàn)父組件調(diào)用子組件的三種方法

    React中實現(xiàn)父組件調(diào)用子組件的三種方法

    在React中,組件之間的通信是一個常見的需求,有時,我們需要從父組件調(diào)用子組件的方法,這可以通過幾種不同的方式實現(xiàn),需要的朋友可以參考下
    2024-04-04
  • 詳解webpack2+React 實例demo

    詳解webpack2+React 實例demo

    本篇文章主要介紹了詳解webpack2+React 實例demo,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • react中如何對自己的組件使用setFieldsValue

    react中如何對自己的組件使用setFieldsValue

    react中如何對自己的組件使用setFieldsValue問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Remix如何支持原生?CSS方法詳解

    Remix如何支持原生?CSS方法詳解

    這篇文章主要為大家介紹了Remix如何支持原生CSS的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • React學(xué)習(xí)筆記之事件處理(二)

    React學(xué)習(xí)筆記之事件處理(二)

    這篇文章主要跟大家介紹了關(guān)于React中事件處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)React具有一定的參考學(xué)習(xí)價值,需要的朋友們下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • 使用 React 和 Threejs 創(chuàng)建一個VR全景項目的過程詳解

    使用 React 和 Threejs 創(chuàng)建一個VR全景項目的過程詳解

    這篇文章主要介紹了使用 React 和 Threejs 創(chuàng)建一個VR全景項目的過程詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • React-Router v6實現(xiàn)頁面級按鈕權(quán)限示例詳解

    React-Router v6實現(xiàn)頁面級按鈕權(quán)限示例詳解

    這篇文章主要介紹了使用 reac+reactRouter來實現(xiàn)頁面級的按鈕權(quán)限功能,這篇文章分三部分,實現(xiàn)思路、代碼實現(xiàn)、踩坑記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-10-10
  • React踩坑之a(chǎn)ntd輸入框rules中的required=true問題

    React踩坑之a(chǎn)ntd輸入框rules中的required=true問題

    這篇文章主要介紹了React踩坑之a(chǎn)ntd輸入框rules中的required=true問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • react-redux及redux狀態(tài)管理工具使用詳解

    react-redux及redux狀態(tài)管理工具使用詳解

    Redux是為javascript應(yīng)用程序提供一個狀態(tài)管理工具集中的管理react中多個組件的狀態(tài)redux是專門作狀態(tài)管理的js庫(不是react插件庫可以用在其他js框架中例如vue,但是基本用在react中),這篇文章主要介紹了react-redux及redux狀態(tài)管理工具使用詳解,需要的朋友可以參考下
    2023-01-01
  • 手把手帶你用React擼一個日程組件

    手把手帶你用React擼一個日程組件

    這篇文章主要給大家介紹了關(guān)于利用React擼一個日程組件的相關(guān)資料,包括日常組件的實現(xiàn)思路、使用的技術(shù)、以及遇到的技術(shù)難點,并給提供了詳細的實例代碼,需要的朋友可以參考下
    2021-07-07

最新評論

沙河市| 桐梓县| 夹江县| 罗定市| 兴安盟| 长泰县| 通州市| 崇仁县| 分宜县| 阜城县| 黄龙县| 织金县| 台南县| 洛宁县| 东城区| 宁远县| 昌吉市| 科技| 体育| 莱州市| 同仁县| 寿宁县| 崇礼县| 保山市| 宜兰县| 建始县| 宜川县| 东乡族自治县| 固始县| 兰州市| 克东县| 永济市| 麦盖提县| 高密市| 光山县| 周口市| 涡阳县| 萨迦县| 康定县| 墨玉县| 息烽县|