微信小程式的實現原理

 

 

 

一、背景

網頁開發,渲染執行緒和腳本是互斥的,這也是為什麼長時間的腳本運行可能會導致頁面失去響應的原因,本質就是我們常說的 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
Tags: