目錄:
- 底層架構
- 小程序的運行機制
一、底層架構
小程序的開發框架稱爲MINA框架
View:視圖層 - 搭建視圖的結構和展現樣式
App Service:邏輯層 - 處理事務邏輯,數據交互的服務中心
- Manager:邏輯處理部分的執行
- API:底層提供的叫WAService.js文件來封裝各個api的接口,讓各個平臺的運行環境能通過API使用微信客戶端能力。
小程序只有一個app Service,並且整個生命週期常駐內存的,app Service 的線程加載App Service.
Native:系統層 - 裏面接入了微信客戶端的原生能力,小程序的視圖層和邏輯層是一個雙線程的通信,提供了數據傳輸和事件系統。
視圖層和邏輯層通過JSBridge進行通信,邏輯層將數據變化通知到視圖層,觸發視圖層的頁面更新,視圖層把觸發的事件通知給我們邏輯層然後邏輯層進行業務處理。
視圖層是怎麼將數據變化實時的展示出來呢?
首先WXML具有元素,屬性和文本的節點樹結構,在節點樹種每個節點都有個上下文的關係。所以在渲染WXML的時候,小程序的運行環境,會把WXML的節點樹轉化成js對象,(可以查下ast抽象語法樹的概念),在邏輯層發生數據變更的時候,需要通過app Service提供一個setData方法,把數據從邏輯層傳到視圖層,webView容器,在渲染節點內容的時候,會把我們傳過來的數據,進行一個前後的對比,差異,這個差異通過一個diff算法。然後把差異運用到原來的節點樹上,渲染出正確的ui界面。
WXS,WXML,WXSS 一起在UI線程中運行的。我們通常從服務器中請求下來數據會做一個轉換,或者做一個filter處理,我們把這些放到ui線程中做,就可以避免跨線程通信的消耗。
小程序的啓動運行機制
小程序啓動通過我們第一次打開會比較長,後續再次打開會比較快。
熱啓動:用戶打開過某個小程序,並且在一定時間內再次打開,不需要再次重新打開小程序,只是後臺切換到前臺
冷啓動:用戶第一次打開,或者小程序被微信主動銷燬後再次打開,此時小程序需要重新加載啓動。
什麼時候小程序被微信主動銷燬呢?
小程序進入後臺後,客戶端會幫我們在一定時間內維持小程序的一個狀態,超過這個時間, 就會被微信主動銷燬。這個時間目前是5分鐘
在短時間內2次收到系統告警微信會主動銷燬,- 5s
如果第一次打開,後面再打開,這個時候有版本更新,冷啓動如果發現有新版本會幫我們異步下載新版本的代碼包,並同時使用微信客戶端本地的包進行啓動,即新版本需要在下次才能打開使用。
二、小程序的運行機制
啓動流程圖
左側是啓動的時候,微信客戶端視圖層和邏輯層的交互邏輯和數據緩存的存取操作。
在小程序啓動的時候會像CDN請求最新的代碼包,第一次啓動的話,我們需要等到代碼包下載完畢,注入到webview容器內,執行後才能看到小程序的頁面,所以我們在網絡不好的情況,會感覺啓動時間會稍微長。
客戶端會幫我們把代碼包緩存到本地,當我們下次啓動的時候,會先從CDN上去請求是否有最新的版本的代碼包,這裏會有寫校驗邏輯, 由目前的代碼包會運行之前已經緩存好的代碼包,同時去異步下載最新的代碼包,讓我們在下次啓動的時候,使用這個最新的。
CDN:內容分發網絡,把請求的內容分發到最近的網絡節點服務器,提高用戶的訪問響應速度,以及成功率,解決一些帶寬,服務性所帶來的延遲問題。
在小程序內,我們可以訪問第三方服務器,發起一個Ajax request ,服務器會返回一個JSON Data數據