MVVM分層下的前端工程化開發

XxjzZ發表於2019-02-25

在MVVM分層之下

MVVM把一個系統拆分成檢視層、檢視資料層、資料訪問層:

MVVM分層下的前端工程化開發
對於基於MVVM架構的庫,View層就是DOM,ViewModel層就是元件,Model層就是state或props。此外,如果我們使用狀態管理庫,那麼Model層就是store。

但我們要搞清楚一點,MVVM是MVVM庫設計時所遵循的原則,而不是我們寫程式碼時應該遵循的。我們只是在MVVM分層下,分別在Model、VM、View這三個部分寫自己的業務程式碼。

因此,我們還需要找出一系列正規化,在基於MVVM的大流程下,指導我們寫出分層合理、可擴充的業務程式碼。

庫與框架

庫 + 正規化 = 框架

遺憾的是,由於缺少官方給出的一系列正規化,我們常用的React和Vue並不是框架。

幸運的是,我們還有Angular。

其實到這裡,我們可以直接去翻閱Angular的文件,然後取其精華,應用到自己的React或Vue的專案之中

Angular架構概覽:www.angular.cn/guide/archi…

自己發掘正規化

從後端說起

我們要知道前端工程化的歷史一共不過幾年,其中的積累必然沒有後端多,所以有一定的後端知識,對前端工程化開發是很有裨益的。

如果我們去看一個優秀的後端專案,我們的第一印象肯定是:哇,分了這麼多的層,而且每一層都做到了解耦,看起來很高大上的感覺!

這說明,後端的確有至少一個非常成熟的框架來指導後端業務程式碼的書寫。

後端是如何解耦業務程式碼邏輯的

在第一小節說過,我們的業務程式碼是位於在MVVM分層之下的,大量的業務邏輯程式碼會出現在VM這一層。對於後端來說,大量的業務程式碼也同樣會出現在MVC的Controller這一層。

在這裡,無論前端和後端都會面臨同樣的問題:如何解耦這些複雜的業務邏輯。

後端工程師是幸運的,Spring這個元老級的框架已經為他們鋪設好了大量的基礎設施,像是依賴注入、面向切片程式設計以及大量優質註解和上層封裝介面。同時,社群也總結出瞭如下圖的業務邏輯分層:

MVVM分層下的前端工程化開發

有了基礎設施,再結合社群的經驗,後端工程師能很容易的拆解業務邏輯,並複雜的業務邏輯從Controller拆分到Service層,Service再通過DAO層進行資料庫讀寫。

但作為前端工程師,如果我遇到這種情況,就會比較迷茫。

類比學習

其實上述的分層是能為前端所用的,我們只需要根據前端的實際情況做一些適應性修改即可。

先思考一個問題:為什麼要有Service層

在MVC中的Controller層,伺服器需要接收來自Client的請求,經過一些處理,最後返回一個合理的響應。在這個過程中,不可避免地需要與資料庫進行互動,如果把請求的讀取、資料庫的讀寫、響應的拼裝都放在Controller裡的話,程式碼必然會變得難以維護,所以才有了Service層,這就是後端需要解決的痛點。


再思考一個問題:前端有沒有上述痛點

後端的過程是這樣的:接受請求、資料庫讀寫、返回響應。

前端的過程是這樣的:組織引數、發起請求、處理響應。

如果我們把這三個過程都寫在VM裡(通常是我們的元件),程式碼肯定會變的難以維護,單元測試更是想都別想。


最後思考一個問題: 怎麼讓Service層為我所用

Service的正確使用姿勢應該是跟Spring這樣的有控制反轉功能的框架結合,通過依賴注入的形式得到Service例項,然後直接使用這個例項。

Angular官方文件已經給出基於依賴注入的Service使用方式了,直接去看即可:www.angular.cn/guide/archi…

然而作為React和Vue的使用者,該怎麼用呢?

條條大路通羅馬,怎麼用都可以。舉個例子,我就單獨新建一個dashboardSrv.js檔案,然後把所有涉及到網路請求的複雜業務邏輯都放進去,然後在元件裡import進來,完全沒問題。

一些很好的學習物件

重要的是意識

要對前端工程化有一個全域性的意識,知道自己寫的程式碼位於架構分層的什麼位置,並且有意識去汲取其他競品、其他領域的經驗,為自己所用。

期待前端能有一個自己的Spring框架。

相關文章