1. 程式人生 > >(詳解)mpvue原始碼解讀

(詳解)mpvue原始碼解讀

前言

mpvue是一款使用Vue.js開發微信小程式的前端框架。使用此框架,開發者將得到完整的 Vue.js 開發體驗,同時為H5和小程式提供了程式碼複用的能力。 我在前一段時間,學習瞭解並嘗試開發了一個小程式“簡說”,樣式醜了點,程式碼有些粗糙,但是作為前後端分離的font-end專案開發學習,應該有些幫助,有興趣可以去看看,git地址都在文中。mpvue及koa2全棧開發小程式

解讀

mpvue實現原理

clipboard.png

以上是mpVue的實現原理,

  • 小程式負責檢視層展示
  • 所有業務邏輯收斂到 Vue.js 中
  • Vue.js 資料變更後同步到小程式

更具體點:

  • Vue.js 例項與小程式 Page 例項建立關聯
  • 小程式和 Vue.js 生命週期建立對映關係,能在小程式生命週期中觸發 Vue.js 生命週期
  • 小程式事件建立代理機制,在事件代理函式中觸發與之對應的 Vue.js 元件事件響應
  • vue與小程式的資料同步

mpvue實現配套設施

mpvue 原始碼

mpvue/index.js將滾動條拉到最後:

clipboard.png

return 一個 Vuew$3,其實也是一個Vue建構函式,為了區分,叫做Vue$3

clipboard.png之後整個檔案都是在為了協調Vue和小程式做 Vue$3 建構函式的 封裝

Vue.js 例項與小程式 Page 例項建立關聯 及生命週期的繫結

小程式例項的型別,可能的值是

  • 'app': 對應 我們vue應用的最外層,也就是路由的掛載根節點 app.vue
  • 'page': 除了 app.vue,其他的vue例項
  • 'component': 其他的vue元件

clipboard.png

在每個vue例項掛載的時候,會初始化,將vue例項的屬性同步到小程式對應的例項上。其中一個屬性mpType,就是區別apppage 的屬性。其實最初的時候,每個vue例項的mpType屬性都是undefined,而腳手架生成的專案,會在我們初始化vue應用的時候,將vue例項的mpType賦值為app,如下:

clipboard.png

當然,這裡的 import Vue from 'vue' 就是引用的 mpVue,為了獲得更逼真的vue.js體驗,作者使用webpack將其替換了。

clipboard.png

clipboard.png

clipboard.png

clipboard.png

上面就是不同的vue例項型別與小程式的例項上 生命週期的繫結

vue與小程式的資料同步

拉到index.js最下面可以看到

clipboard.png

這是用來同步資料的方法

與vue一樣,mpvue也需要跟蹤資料變化,利用watcher,利用釋出訂閱

clipboard.png

這是初始化state

clipboard.png

這裡將資料送到觀察者

clipboard.png

clipboard.png

遍歷初始化的state,全部加入到觀察者的佇列

clipboard.png

clipboard.png

這裡就是資料劫持了,get set在get中還要引入 watcher的概念,用來監聽每個屬性值在剛剛掛載元件的時候,同時為該元件的vm - view-model 建立了一個watcher

clipboard.png

也呼叫了這個Watcher的get原型方法,最重要的一點是,執行了pushTarget方法,將Watcher賦值給target屬性

clipboard.png

從而在get方法中,有了target,將這個watcher加入到 dep的sub子集中

clipboard.png

clipboard.png

在set方法攔截到資料改變時,通知watcher

clipboard.png

wathcer呼叫update

clipboard.png

繼續呼叫queueWatcher

clipboard.png

呼叫flushSchedulerQueue

clipboard.png

通知update鉤子

clipboard.png

觸發資料更新

clipboard.png

clipboard.png

clipboard.png

小結

暫時就寫這麼多吧,能力有限,只能很僵硬的翻譯大概的執行流程。但行好事,莫問前程.