Vue 程序結構框架

Vue.js是典型的MVVM框架,什么是MVVM框架,介紹之前我們先介紹下什么是MVC框架
MVC 即 Model-View-Controller 的縮寫,就是 模型-視圖-控制器 , 也就是說一個標准的Web 應用程序是由這三部分組成的:
View 用來把數據以某種方式呈現給用戶。
Model 其實就是數據。
Controller 接收並處理來自用戶的請求,並將 Model 返回給用戶。
MVC框架對於簡單的應用處理是可以的,也符合軟件架構的分層思想。但隨着H5 的不斷發展,人們更希望使用H5 開發的應用能和Native 媲美,或者接近於原生App 的體驗效果,於是前端應用的復雜程度已不同往日,今非昔比。這時前端開發就暴露出了三個痛點問題:
- 開發者在代碼中大量調用相同的 DOM API, 處理繁瑣 ,操作冗余,使得代碼難以維護。
- 大量的DOM 操作使頁面渲染性能降低,加載速度變慢,影響用戶體驗。
- 當 Model 頻繁發生變化,開發者需要主動更新到View ;當用戶的操作導致 Model 發生變化,開發者同樣需要將變化的數據同步到Model 中,這樣的工作不僅繁瑣,而且很難維護復雜多變的數據狀態。
其實,早期jquery 的出現就是為了前端能更簡潔的操作DOM 而設計的,但它只解決了第一個問題,另外兩個問題始終伴隨着前端一直存在。隨着智能手機,平板電腦的流行,多終端開始流行。
MVVM框架開始流行,應用場景:
- 針對具有復雜交互邏輯的前端應用
- 提供基礎的架構抽象
- 提供ajax數據持久化,保證前端用戶體驗

框架數據分層情況:
- Model 層代表數據模型,可以在Model中定義數據修改和操作的業務邏輯
- View 代表展示層,它負責將數據模型轉化成UI 展現出來
- ViewModel 是一個同步View 和 Model的對象

圖例介紹:
- Observer 數據監聽器,能夠對數據對象的所有屬性進行監聽,如有變動可拿到最新值並通知訂閱者,內部采用Object.defineProperty的getter和setter來實現。
- Compile 指令解析器,它的作用對每個元素節點的指令進行掃描和解析,根據指令模板替換數據,以及綁定相應的更新函數。
- Watcher 訂閱者, 作為連接 Observer 和 Compile 的橋梁,能夠訂閱並收到每個屬性變動的通知,執行指令綁定的相應回調函數。
- Dep 消息訂閱器,內部維護了一個數組,用來收集訂閱者(Watcher),數據變動觸發notify 函數,再調用訂閱者的 update 方法。
圖中思路:從圖中可以看出,當執行 new Vue() 時,Vue 就進入了初始化階段,一方面Vue 會遍歷 data 選項中的屬性,並用 Object.defineProperty 將它們轉為 getter/setter,實現數據變化監聽功能;另一方面,Vue 的指令編譯器Compile 對元素節點的指令進行掃描和解析,初始化視圖,並訂閱Watcher 來更新視圖, 此時Wather 會將自己添加到消息訂閱器中(Dep),初始化完畢。
當數據發生變化時,Observer 中的 setter 方法被觸發,setter 會立即調用Dep.notify(),Dep 開始遍歷所有的訂閱者,並調用訂閱者的 update 方法,訂閱者收到通知后對視圖進行相應的更新。