4種可用於組織大型Vue.js項目的最佳實踐

2021-01-21 讀芯術

全文共3777字,預計學習時長10分鐘

圖源:unsplash

作為基於JavaScript的框架,Vue.js最近幾年中發展迅速,原因很多,包括框架的簡單性、易於集成性、用戶友好性以及限制較少等等,這些特性也幫助Vue.js在與Angular和React競爭時有一戰之力。

但在搜索Vue的局限性時,我發現很多人都提到了它對大型項目缺乏支持這一現象。不過在深入了解之後,我可以自信地說並非如此。因此,本文將討論4種可用於組織大型Vue.js項目的最佳實踐。

1.使用Vue Slots使代碼易於理解

父子關係是組件之間相互連接的最常用方法之一,但有時這可能並不是最佳選擇。想像一下,如果出現在單個父組件中有大量子組件的情況,那麼可能就不得不使用大量道具和發出事件來處理這些子組件,很快一切會變得一團糟。

這就是在大型項目中將要面臨的真實情況,不過,Vue.js可以提供針對此問題的現場解決方案。

我們可以在Vue.js中使用slots來提供表示父子關係的另一種方法,slots提供了將內容放置在新位置的渠道。slots的基本操作示例如下所示:

<div>

<slot></slot>

</div>

當上面的組件呈現的<slot> </ slot>標籤將被demo-content替換時:

<demo-content>

<h2>Hi!</h2>

<class-name name="Welcome toVue!"></class-name>

</demo-content>

你可以在Vue項目中使用多種不同類型的slots。但最重要的一點是,當slots在增多時,項目也會隨之受到巨大的影響,slots可以使得整個項目中的代碼維持完整且易於理解。

2.建立並共享獨立的組件

AddyOsmani:「有效構建『大型'事物的秘訣通常是避免從一開始就抱著直接構建大型事物的想法。相反,可以用更小、更集中的作品來構成大型事物。這樣一來,就更容易看到小的事物是如何組成大的事物的了。」

你可以遵循F.I.R.S.T原則,將自己的組件構建為:專注的、獨立的、可重複使用的以及小型且可測試的。

還可以使用Bit(Github)之類的工具對每個項目的組件進行獨立式原始碼管理,並將其共享給Bit的組件中心。共享的組件、自動生成的文檔和實時示例將一起顯示在Bit的組件中心上。可以使用NPM進行安裝或使用Bit對其進行「克隆」和修改,這會使查找、使用和維護組件變得更加容易(因此,也更易於維護項目)。

Vue components shared on Bit.dev

3.維護良好的VUEX倉庫

Vuex是Vue.js中的狀態管理模式,它負責應用程式中所有組件的集中存儲功能。我看到有些評論說:「Vuex限制了開發人員根據需要構造項目」。但事實是,Vuex可以通過使用一組原則來幫助開發人員以更有條理的方式組織他們的項目。

在了解這些原理之前,首先應該先了解以下4個Vuex倉庫中的主要組件:

· States:用於保存應用程式的數據

· Getters:用於訪問倉庫外部的狀態對象

· Mutations:用於修改狀態對象

· Actions:用於處理mutations

那麼接下來看看需要遵循的原則:

· 需要將應用程式級別狀態集中在倉庫中。

· states應始終通過處理mutations來進行改變。

· 異步邏輯應該被封裝,並且只能與actions一起使用。

遵循這三個原則,項目就可以被順利地組織出來,並且如果你覺得存儲文件越來越大,可以將它們拆分成單獨的文件。示例項目結構如下所示:

├── index.html

├── main.js

├── api

├── components

└── store

├── index.js

├── actions.js

├── mutations.js

└── modules

模塊化VUEX倉庫

圖源:unsplash

本文中討論的是大型項目,此類項目中的項目文件會非常大而複雜。你需要以自己的方式管理倉庫,並且需要避免商店倉庫,因此最好以易於他人理解的方式對Vuex倉庫進行模塊化。

在此我們沒有定義項目中模塊的定義方法,有些開發人員會根據功能進行模塊化,有些則根據數據模型進行模塊化。關於模塊化的最終決定完全取決於你自己,這將對個人和團隊有長期幫助。

store/

├── index.js

└── modules/

├── module1.store.js

├── module2.store.js

├── module3.store.js

├── module4.store.js

└── module5.store.js

使用助手來簡化代碼

前文提到了Vuex倉庫中使用的4個組件。假設如果出現需要訪問這些states、getters或需要調用actions或組件中的mutations的情況,那麼無需創建多個計算屬性或方法,就可以輕鬆使用輔助方法(mapState, mapGetters, mapMutations 和 mapActions)來減少代碼。

來看看這四個輔助工具:

· mapState

如果需要在一個組件中調用多個存儲狀態屬性或getters,就可以使用mapState幫助生成一個getter函數,這將大大減少代碼行的數量。

import { mapState } from 'vuex'export default {

computed: mapState({

count: state => state.count,

countAlias: 'count',

countPlusLocalState (state) {

return state.count +this.localCount

}

})

}

· mapGetters

mapGetters可幫助將倉庫getters映射到本地計算屬性。

import { mapGetters } from 'vuex'export default {

computed: {

...mapGetters([

'count1',

'getter1',

])

}

}

· mapMutations

mapMutations可以用於幫助提交組件中的mutations,它將組件方法映射到store.commit調用。同樣,也可以使用mapMutations傳遞有效載荷。

import { mapMutations } from 'vuex'export default {

methods: {

...mapMutations({

cal: 'calculate' // map`this.cal()` to `this.$store.commit('calculate')`

})

}

}

· mapActions

可以用於幫助在組件中分派操作,並將組件方法映射到store.dispatch調用。

import { mapActions } from 'vuex'export default {

methods: {

...mapActions({

cal: 'calculate' // map`this.cal()` to `this.$store.dispatch('calculate')`

})

}

}

4.不要忘記編寫單元測試

測試在任何項目中都很重要。作為開發人員,無論項目的重要性或規模如何,我們都必須測試開發的內容。尤其是在涉及大型項目中,往往有成千上萬的小型功能,因此我們有責任測試每個功能。

這就是單元測試的必要性,它可以使開發人員測試單個代碼單元。單元測試不僅可以避免錯誤,而且每當開發人員進行更改時,修改的結果也可以提升開發團隊對其工作的信心。隨著項目的進行,開發人員可以從項目的開始就遵循良好的單元測試機制來添加新功能,不必擔心會破壞其他功能。

在Vue.js中進行的單元測試與所有其他框架的單元測試方法大同小異,你可以輕鬆地將Jest,Karma或Mocha與Vue.js結合使用。儘管有測試框架,但是在編寫單元測試時,還是有些需要記住的一般性事項:

· 編寫單元測試以涵蓋每個Vue組件。

· 測試必須提供清晰的失敗錯誤消息ID。

· 使用良好的斷言庫。例如:在Jest框架中內置了斷言庫,Chai斷言庫與Mocha一起使用。

圖源:unsplash

通過從項目開始就遵循這些步驟的方法,隨著項目結構的發展,開發人員可以大大減少調試和手動測試所花費的時間。

除了單元測試之外,Vue.js與其他任何框架一樣都支持E2E測試和集成測試。因此,你也可以將這些也結合到項目中。通常,路由部分不會使用單元測試進行測試,並且通過端到端測試進行覆蓋。Vue倉庫是最難測試的部分,對states,actions或getters的單獨測試往往被認為是無用的,我推薦的方法是集成測試。

看看這優秀的技術能力,我認為Vue.js用於大規模項目完全沒問題,它可以輕鬆地管理這些項目而不會造成混亂。

留言點讚關注

我們一起分享AI學習與發展的乾貨

如轉載,請後臺留言,遵守轉載規範

相關焦點

  • 什麼是VUE?VUE與JS的對比
    我們需要讓所有綁定的對象和元素都能感知到變化1.1.1. vue與js的對比1.1.1.1. js的實現(了解)<!引入js文件--><script src="../node_modules/vue/dist/vue.js"></script></head><body><!--2.
  • Vue.js 教程:構建一個特斯拉汽車餘電計算器
    作為本教程的起點,請克隆這個 Github 存儲庫:https://github.com/petereijgermans11/workshop-reactjs-vuejs然後轉至 vuejs-app 目錄。
  • Vue全家桶之什麼是Vuex
    Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。Vuex 是幹什麼的?試想一下,如果在一個項目開發中頻繁的使用組件傳參的方式來同步data中的值,一旦項目變得很龐大,管理和維護這些值將是相當棘手的工作。
  • vue高級進階系列——用typescript玩轉vue和vuex
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫用過vue的朋友大概對vuex也不陌生,vuex的官方解釋是專為 Vue.js 應用程式開發的狀態管理模式。它採用集中式存儲管理應用的所有組件的狀態,並以相應的規則保證狀態以一種可預測的方式發生變化。
  • 5分鐘帶你入門vuex(vue狀態管理)
    如果你之前使用過vue.js,你一定知道在vue中各個組件之間傳值的痛苦,在vue中我們可以使用vuex來保存我們需要管理的狀態值,值一旦被修改,所有引用該值的地方就會自動更新,那麼接下來我們就來學習一下vuex是如何修改狀態值的:我們新建一個vue項目(這裡由於我們是講解vuex,所以對於vue項目的創建我們不會講解太詳細);在命令行輸入 vue init
  • 如何創建vue項目並使用element框架中的el-select
    1、在電腦硬碟上,找到一個位置,新建一個文件夾wmn;滑鼠右鍵選擇Git Bash Here,並在Git窗口輸入cnpm install --global vue-cli命令:cnpm install --global vue-cli
  • Angular、React 當前,Vue.js 優劣幾何?
    很多時候,人們不會給 Vue.js 足夠的關注。因此,我想分享一些有關 Vue.js 的信息,以及我在使用 Vue.js 來構建生產應用中獲得的一些個人經驗。現在讓我們一起來問這個問題:Vue.js 是適合你的框架嗎?注意:我並不想說 Vue.js 比 React、Angular 或者其它的任何前端框架好。這裡我分享的只是我在項目中使用 Vue.js 而獲得的一些個人體驗。
  • 如何寫一個vue組件專題及常見問題 - CSDN
    如何使用vue寫一個組件庫新建vue項目使用vue-cli初始化一個項目:vue init webpack VueComponentcd VueComponentnpm installnpm run dev以上就新建好了一個vue項目項目目錄首先,定義好目錄,經過觀察大多數的組件庫,基本是這樣的目錄
  • vue3.0手機聊天室|Vue3+Vant3仿微信界面
    項目簡介Vue3Chat是基於vue3.x+vuex4+vue-router4全家桶技術和vant3.x構建開發的一款mobile仿微信界面聊天實例。實現了發送圖文消息、圖片|視頻預覽、位置查看、紅包|朋友圈等功能。
  • Vue 3 的最新進展
    Vue.js 作者尤雨溪近日介紹了 Vue 3 的最新進展。Vue Router目前存在部分與 vue-router@3.x 相關的路由鉤子(router hook)行為一致性問題,這也是 Vue Router 沒有被標記為 Beta 的原因。不過在非關鍵項目上可以使用新的路由。
  • 在vue項目中使用vuex實現狀態管理的案例
    說明:其實如果項目不是很龐大很複雜,沒有涉及到很多狀態值需要被很多頁面或組件共用;或者某個頁面或組件的行為會對其他頁面或組件造成依賴性的影響。並不需要使用vuex。vuex的使用與否在實際開發中應該視項目情況而定。準備工作:a.在vue項目中安裝vuex: npm install vuex -S。b.了解下vuex的五個屬性。
  • Vue.js深入學習
    vue.jsv-cloak:解決網速慢閃爍問題 ,不會替換掉標籤裡面的內容v-text:會替換掉標籤裡面的內容:原樣輸出v-html:會解析標籤v-bind:綁定屬性的指令,縮寫.參數1,指令的名稱,定義的時候,指令的前面不需要加V-前綴,用的時候才加3.參數2,是一個對象,這個對象身上有一些指令相關的函數,這些函數在特定的階段執行相關的操作Vue.directive('focus',{bind:function(el){函數中第一個參數永遠是el,表示被綁定了指令的那個元素,是一個原生的js
  • 如何在vue項目中使用sass並設置元素樣式
    如果直接使用sass,啟動項目會出現報錯。那麼,如何在vue項目中使用sass?下面利用實例說明:1、打開HBuilderX開發工具,新建項目,選擇普通項目;然後輸入項目名稱wmk,選擇vue模板,接著點擊創建按鈕
  • vue-element-admin 4.0.0 正式版發布
    重大改變 基於 vue-cli@3進行構建 調整了項目的目錄結構 mock 文件移至根目錄下 layout 從 views 文件夾下移至 src 下 使用了最新的 eslint-plugin-vue
  • React vs Angular vs Vue.js——2019 該選誰?(更新版)
    特別針對大型項目創建的結構和架構。Angular 的缺點:各種不同的結構(Injectables、Components、Pipes、Modules 等等)使得它與只有「Component(組件)」概念的 React 和 Vue.js 比起來更難學。根據各種不同的基準,性能都相對更慢。另一方面,這很容易使用所謂的「ChangeDetectionStrategy」來解決。
  • React、Angular、Vue.js:三者完整的比較指南
    讓我們開始吧根據谷歌的趨勢,看一下React與Angular與Vue.js的比較。如果我們考慮過去一年,Angular似乎是贏家,React排在第二位,為Vue.js留下一小部分。React vs. Angular vs. Vue以下是一些可以幫助您更好地比較這些框架的問題:它們是否足以構建可擴展的應用程式?
  • a標籤 href vue專題及常見問題 - CSDN
    vue.js 實現a標籤href裡添加參數原始碼列表可以正常顯示,但是連接沒有實現對items.orderNo的值轉化,最中解決方法
  • 什麼是MVVM,MVC和MVVM的區別,MVVM框架VUE實現原理
    在過去的10年中,我們已經把很多傳統的服務端代碼放到了瀏覽器中,這樣就產生了成千上萬行的javascript代碼,它們連接了各式各樣的HTML 和CSS文件,但缺乏正規的組織形式,這也就是為什麼越來越多的開發者使用javascript框架。比如:angular、react、vue。
  • Vue+Axios+Vuex+Vux+Vue-Router全家桶搭建前端框架
    FaceBook,社區比較多,而且還可以跨平臺運行,React-Native可以實現一次編寫,安卓、蘋果、web通殺;但是學習也需要一段時間,而且後期維護也不容易;其他的我們就不一一介紹了,最後來看看今天的重頭戲Vue;三、Vue,值得我們驕傲的是,國人發明的,一款漸進式框架,能與現有項目無縫融合,也就是說現有項目可以逐步更新替換使用vue;使用她能讓我們無需過多的分神去處理數據怎麼展示同步
  • 官方Element Plus for Vue 3.0 Beta 版本今天發布了!
    使用更輕量更通用的時間日期解決方案Day.js升級適配popperjs,async-validator等核心依賴完善52 種國際化語言支持除此以外,還有:全新的視覺體驗優化的組件API更多自定義選項更加詳盡友好的文檔