一個合理的前端應用文件結構

在大型應用中,最關鍵且最具挑戰性的方面之一就是擁有一個良好且合理的文件結構。在考慮通過微前端將代碼庫拆分成多個應用之前,可以遵循一些步驟來改善項目級別的架構,并在您考慮這一路徑時使過渡更容易。

我們的目標是應用某種模塊化方法,使代碼庫更容易理解,通過為各個功能設置邊界,減少代碼耦合和副作用。

默認項目結構

默認情況下,當使用流行的前端框架之一搭建新項目時,組件結構是扁平的,并且沒有任何層次結構。

d29bb7514ce6b1d47de09ac75058efeb.png

本示例使用的是 Vue 的默認項目結構,但 React 對如何將文件放入文件夾也沒有意見。

這個例子使用了 Vue 的默認項目結構,但 React 也沒有對如何將文件放入文件夾提出意見。

  • assets:存儲應用中使用的靜態資產,如圖像、字體和 CSS 文件。

  • components:包含可重用的 Vue 組件。推薦使用扁平層次結構。

  • main.js:作為應用的入口點,啟用 Vue 并配置插件或附加庫。

  • App.vue:表示應用的根組件,作為其他組件的容器并充當主要模板。

我們通過實踐發現,對于大型項目,這種架構很快就會失控。需要某種模塊化方法來輕松定位給定的文件,為各個功能設置邊界,并避免組件的緊密耦合。

將應用分解成多個功能

將應用分解成多個功能任何大型應用都會被分解成多個獨立的功能。識別它們并不總是容易和直接的,但經過一段時間和經驗之后會變得更好。我們一起嘗試將一個流行的應用分成多個部分作為練習。

e70a234ad2dd680ff057cbda18490d1a.png

Twitter 的主頁有很多內容。時間線是頁面的核心,被許多功能環繞,如導航、推文創建部分、帶有多個子組件的側邊欄、懸浮消息組件等。

647ffb6c8a2a99d44c1224c0a46002ac.png

將構成這些功能的所有組件放在同一個文件夾中是不可維護的,即使使用 IDE 的快速查找選項,定位其中一個組件也會非常困難。

更精細的項目結構

從經驗來看,更好和更全面的文件結構如下所示:

9b6601516499a98bc9d40d66b7a3eaab.png

  • components:所有跨整個應用使用的共享組件。

  • composables:所有共享的 composables。

  • config:應用配置文件。

  • features:包含所有應用功能。我們希望將大部分應用代碼放在這里。稍后會詳細說明。

  • layouts:頁面的不同布局。

  • lib:應用中使用的不同第三方庫的配置。

  • pages:應用的頁面。

  • services:共享的應用服務和提供者。

  • stores:全局狀態存儲。

  • test:與測試相關的 mock、幫助程序、工具和配置。

  • types:共享的 TypeScript 類型定義。

  • utils:共享的實用函數。

  • assets:靜態資源。

在項目根目錄下運行以下命令以創建不存在的文件夾。

mkdir?-p?src/{components,composables,config,features,layouts,lib,pages,services,stores,test,types,utils,assets}

需要注意的三件重要事項:

Pages 文件夾:頁面文件夾已經在上下文和構建工具(如 webpack 或 Vite)將創建的實際塊方面進行了一些模塊化。將所有頁面放在一個地方非常有幫助,但其中的邏輯應保持最低限度。

Features 文件夾:為了更容易的維護和擴展,我們希望將大部分應用代碼放在 features 文件夾中。每個功能文件夾應包含特定功能的領域代碼。

共享內容:在一個理想的世界中,我們不應該有共享組件、composables、stores 和 services,所有內容都應該放在相應的功能文件夾中。不幸的是,在實際項目中,這無法避免,但我們應該提前計劃,并在將內容添加到這些文件夾時格外小心。

Features 文件夾

正如前面提到的,我們的大部分應用應該放在 features 文件夾中,分為多個子目錄。

98a28ade1527b6eff409c1266f849a64.png

  • api:所有的 fetch 邏輯都放在這里。這將 API 和 UI 解耦。

  • components:特定功能的組件。

  • composables:特定功能的 composables。

  • stores:狀態管理代碼。多個子模塊是預期的,實際上是被鼓勵的。

  • types:特定功能的 TypeScript 類型定義。

  • index.ts:這是功能的入口點。它充當功能的公共 API,并且應該只導出應該為應用程序其他部分公開的內容。

上述的 index.ts 文件充當每個功能的公共 API。在從另一個領域導入內容時,應該僅通過此文件進行。這可以防止循環依賴,并且還可以更輕松地找到導入的來源。

//?不好的做法?🚫?🚫?🚫
import?{?UserProfile?}?from?'@/features/profile/components/UserProfile.vue'//?好的做法??????
import?{?UserProfile?}?from?'@/features/profile'

我們可以使用 no-restricted-imports ESLint 規則來強制執行此模式。

rules:?{'no-restricted-imports':?['error',{patterns:?['@/features/*/*'],},],'import/no-cycle':?'error',...
}
結論

以功能為導向的架構是一種有效且經過實戰驗證的結構復雜項目的方法。它允許我們將代碼解耦成獨立的模塊,并隨著應用的復雜性增加而擴展。這將通過提高代碼庫的可預測性、減少調試時間并使上手變得更容易,從而改善開發體驗。

你的應用結構是否類似于此?您是否使用了不同的結構?請在下面留言。

最后:

vue2與vue3技巧合集

VueUse源碼解讀

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38140.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38140.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38140.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MSPM0G3507——定時器例程講解4——timx_timer_mode_periodic

以下示例以周期模式配置TimerG并切換LED。周期從500ms開始,每次切換減少50ms,直到周期為100ms,然后重復。設備在等待中斷時保持待機模式 #include "ti_msp_dl_config.h"/* ((32KHz / (321)) * 0.5s) 45 - 1 495 due to N1 ticks …

MySQL入門學習-MySQL日志.錯誤日志

錯誤日志是 MySQL 中一種記錄服務器運行過程中錯誤信息的日志文件。它可以幫助管理員或開發人員快速定位和解決問題。 一、MySQL 中的錯誤日志具有以下特點: - 記錄錯誤信息: 錯誤日志主要記錄服務器在運行過程中發生的錯誤信息,包括但不限…

【算法 之選擇排序 原理及案例】

選擇排序(Selection Sort) 是一種簡單直觀的排序算法。它的工作原理是:首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小…

Memcached的API使用指南:常用操作與示例代碼

Memcached 是一個高性能、分布式內存對象緩存系統,常用于加速動態Web應用程序,減輕數據庫負載。本文將介紹如何使用Memcached的API進行常用操作,并提供示例代碼。 1. 安裝Memcached客戶端庫 在使用Memcached之前,需要安裝相應的…

Qt中用QLabel創建狀態燈

首先ui設計中分別創建了4個大燈和4個小燈。 編輯.h文件 #ifndef LED_H #define LED_H#include <QWidget> #include <QLabel>QT_BEGIN_NAMESPACE namespace Ui { class Led; } QT_END_NAMESPACEclass Led : public QWidget {Q_OBJECTpublic:Led(QWidget *parent n…

Spring MVC數據綁定和響應——復雜數據綁定(四)JSON數據綁定

一、消息轉換器—HttpMessageConverter接口 客戶端不同的請求&#xff0c;HttpServletRequest中數據的MediaType可能會不同&#xff0c;如果想將HttpServletRequest中的數據轉換成指定對象&#xff0c;或者將對象轉換成指定格式的數據&#xff0c;就需要使用對應的消息轉換器來…

服務器硬件以及RAID配置

目錄 一、RAID磁盤陣列原理&#xff08;嘎嘎重要&#xff09; 1、RAID的概述 2、常用的RAID 2.1、RAID 0 2.2、RAID 1 2.3、RAID 5 2.5、RAID 10 3、陣列卡介紹 二、建立軟件RAID磁盤陣列 1、添加硬盤 2、使用fdisk分區&#xff0c;類型為fd 3、mdata命令使用參數 …

安全與加密常識(3)什么是數字簽名和數字證書

文章目錄 數字簽名工作原理關鍵特點應用實例 數字證書數字證書和數字簽名趣味實例 數字簽名 數字簽名是一種通過密碼運算生成的數據&#xff0c;用于驗證信息的完整性和來源&#xff0c;確保數據在傳輸過程中未被篡改&#xff0c;同時提供發送者的身份認證和防止抵賴的功能。它…

Qt: QPushButton 按鈕實現 上圖標下文字

效果如下&#xff1a; 實現有如下幾種方式&#xff1a; 1. 使用 QPushButton 設置 setStyleSheet 例&#xff1a; ui->recorder->setStyleSheet("QPushButton{"\"border: 1px solid #00d2ff; "\"min-height: 60px; "\"col…

python多繼承的3C算法

python多繼承的3C算法 有很多地方都說python多繼承的繼承順序&#xff0c;是按照深度遍歷的方式&#xff0c;其實python多繼承順序的算法&#xff0c;不是嚴格意義上的深度遍歷&#xff0c;而是基于深度遍歷基礎上優化出一種叫3C算法 python多繼承的深度遍歷 class C:def ru…

MySQL高級-MVCC-原理分析(RR級別)

文章目錄 1、RR隔離級別下&#xff0c;僅在事務中第一次執行快照讀時生成ReadView&#xff0c;后續復用該ReadView2、總結 1、RR隔離級別下&#xff0c;僅在事務中第一次執行快照讀時生成ReadView&#xff0c;后續復用該ReadView 而RR 是可重復讀&#xff0c;在一個事務中&…

Django 配置靜態文件

1&#xff0c;DebugTrue 調試模式 Test/Test/settings.py DEBUG True...STATICFILES_DIRS [os.path.join(BASE_DIR, static),] STATIC_URL /static/ 1.1 創建靜態文件 Test/static/6/images/Sni1.png 1.2 添加視圖函數 Test/app6/views.py from django.shortcuts impor…

uniapp,uni-fab組件拖動屬性,替代方案

文章目錄 1. 背景2. 替代方案2.1 方案一2.2 方案二 參考 1. 背景 最近基于uniapp開發一款設備參數調試的APP軟件&#xff0c;其中有使用到懸浮按鈕&#xff0c;快速開發階段&#xff0c;為了能盡快上線&#xff0c;直接使用了uni-ui的擴展組件uni-fab&#xff0c;參考【1】&am…

C++ 設計模式之迭代器模式

C 設計模式之迭代器模式 簡介 1、迭代器模式&#xff08;Iterator&#xff09;是一種行為型設計模式&#xff0c;它允許我們順序訪問一個聚合對象中的各個元素&#xff0c;而又不暴露該對象的內部表示。迭代器模式提供了一種方法來遍歷容器&#xff08;容器對象&#xff0c;如…

Configure C/C++ debugging

Configure C/C debugging launch.json 文件用于在 Visual Studio Code 中配置調試器。 Visual Studio Code 會生成一個 launch.json (位于項目的 .vscode 文件夾下),其中幾乎包含了所有必需的信息。要開始調試,您需要填寫 program 字段,指定要調試的可執行文件的路徑。這必須…

如何通過流式渲染提升用戶體驗?

什么是流式渲染&#xff1f; 流式渲染的核心理念是將 HTML 文檔分割成小塊&#xff08;chunk&#xff09;&#xff0c;并逐步地發送給客戶端&#xff0c;而非等待整個頁面完整生成后再進行傳輸。這種方式能夠極大地提升用戶的初始加載體驗&#xff0c;特別是在網絡條件不佳或者…

【從零開始學架構 架構基礎】四 架構設計的復雜度來源:可擴展性復雜度來源

架構設計的復雜度來源其實就是架構設計要解決的問題&#xff0c;主要有如下幾個&#xff1a;高性能、高可用、可擴展、低成本、安全、規模。復雜度的關鍵&#xff0c;就是新舊技術之間不是完全的替代關系&#xff0c;有交叉&#xff0c;有各自的特點&#xff0c;所以才需要具體…

新書速覽|Linux C與C++一線開發實踐

《Linux C與C一線開發實踐》 本書內容 Linux C/C編程在Linux應用程序開發中占有重要的地位&#xff0c;掌握這項技術將在就業競爭中立于不敗之地。《Linux C與C一線開發實踐》內容針對初中級讀者&#xff0c;貼近軟件公司一線開發實踐。全書厚達620多頁&#xff0c;知識點豐富…

Java中String和StringBuilder的區別

當然可以&#xff0c;我們可以通過面試問答的形式來探討String和StringBuilder的區別。 面試官&#xff1a;請解釋一下Java中String和StringBuilder的區別。 面試回答&#xff1a; 1. 不可變性&#xff08;Immutability&#xff09; String&#xff1a;String對象是不可變的…

微信小程序添加點擊事件

在微信小程序中&#xff0c;給<view>組件添加點擊事件非常直接&#xff0c;你可以使用bindtap屬性來綁定一個事件處理函數。下面是添加點擊事件的基本步驟和示例代碼&#xff1a; 步驟&#xff1a; 在WXML文件中&#xff1a;給需要添加點擊事件的<view>標簽添加bi…