微信小程式的實現原理
一、背景
網頁開發,渲染執行緒和腳本是互斥的,這也是為什麼長時間的腳本運行可能會導致頁面失去響應的原因,本質就是我們常說的 JS
是單執行緒的
而在小程式中,選擇了 Hybrid
的渲染方式,將視圖層和邏輯層是分開的,雙執行緒同時運行,視圖層的介面使用 WebView
進行渲染,邏輯層運行在 JSCore
中
- 渲染層:介面渲染相關的任務全都在 WebView 執行緒里執行。一個小程式存在多個介面,所以渲染層存在多個 WebView 執行緒
- 邏輯層:採用 JsCore 執行緒運行 JS 腳本,在這個環境下執行的都是有關小程式業務邏輯的程式碼
二、通訊
小程式在渲染層,宿主環境會把wxml
轉化成對應的JS
對象
在邏輯層發生數據變更的時候,通過宿主環境提供的setData
方法把數據從邏輯層傳遞到渲染層,再經過對比前後差異,把差異應用在原來的Dom
樹上,渲染出正確的視圖
當視圖存在交互的時候,例如用戶點擊你介面上某個按鈕,這類回饋應該通知給開發者的邏輯層,需要將對應的處理狀態呈現給用戶
對於事件的分發處理,微信進行了特殊的處理,將所有的事件攔截後,丟到邏輯層交給JavaScript
進行處理
由於小程式是基於雙執行緒的,也就是任何在視圖層和邏輯層之間的數據傳遞都是執行緒間的通訊,會有一定的延時,因此在小程式中,頁面更新成了非同步操作
非同步會使得各部分的運行時序變得複雜一些,比如在渲染首屏的時候,邏輯層與渲染層會同時開始初始化工作,但是渲染層需要有邏輯層的數據才能把介面渲染出來
如果渲染層初始化工作較快完成,就要等邏輯層的指令才能進行下一步工作
因此邏輯層與渲染層需要有一定的機制保證時序正確,在每個小程式頁面的生命周期中,存在著若干次頁面數據通訊
三、運行機制
小程式啟動運行兩種情況:
- 冷啟動(重新開始):用戶首次打開或者小程式被微信主動銷毀後再次打開的情況,此時小程式需要重新載入啟動,即為冷啟動
- 熱啟動:用戶已經打開過小程式,然後在一定時間內再次打開該小程式,此時無需重新啟動,只需要將後台態的小程式切換到前台,這個過程就是熱啟動
需要注意:
❝
1.小程式沒有重啟的概念
2.當小程式進入後台,客戶端會維持一段時間的運行狀態,超過一定時間後會被微信主動銷毀
3.短時間內收到系統兩次以上記憶體警告,也會對小程式進行銷毀,這也就為什麼一旦頁面記憶體溢出,頁面會奔潰的本質原因了❞
開發者在後台發布新版本之後,無法立刻影響到所有現網用戶,但最差情況下,也在發布之後 24 小時之內下發新版本資訊到用戶
每次冷啟動時,都會檢查是否有更新版本,如果發現有新版本,將會非同步下載新版本的程式碼包,並同時用客戶端本地的包進行啟動,即新版本的小程式需要等下一次冷啟動才會應用上
參考文獻
- //developers.weixin.qq.com/community/develop/article/doc/0008a4c4f28f30fe3eb863b2750813