微信小程序的實現原理


 

 

 

一、背景

網頁開發,渲染線程和腳本是互斥的,這也是為什么長時間的腳本運行可能會導致頁面失去響應的原因,本質就是我們常說的 JS 是單線程的

而在小程序中,選擇了 Hybrid 的渲染方式,將視圖層和邏輯層是分開的,雙線程同時運行,視圖層的界面使用 WebView 進行渲染,邏輯層運行在 JSCore 中

 

 

 

 

  • 渲染層:界面渲染相關的任務全都在 WebView 線程里執行。一個小程序存在多個界面,所以渲染層存在多個 WebView 線程
  • 邏輯層:采用 JsCore 線程運行 JS 腳本,在這個環境下執行的都是有關小程序業務邏輯的代碼

二、通信

小程序在渲染層,宿主環境會把wxml轉化成對應的JS對象

在邏輯層發生數據變更的時候,通過宿主環境提供的setData方法把數據從邏輯層傳遞到渲染層,再經過對比前后差異,把差異應用在原來的Dom樹上,渲染出正確的視圖

 

 

 

 

當視圖存在交互的時候,例如用戶點擊你界面上某個按鈕,這類反饋應該通知給開發者的邏輯層,需要將對應的處理狀態呈現給用戶

對於事件的分發處理,微信進行了特殊的處理,將所有的事件攔截后,丟到邏輯層交給JavaScript進行處理

 

 

 

 

由於小程序是基於雙線程的,也就是任何在視圖層和邏輯層之間的數據傳遞都是線程間的通信,會有一定的延時,因此在小程序中,頁面更新成了異步操作

異步會使得各部分的運行時序變得復雜一些,比如在渲染首屏的時候,邏輯層與渲染層會同時開始初始化工作,但是渲染層需要有邏輯層的數據才能把界面渲染出來

如果渲染層初始化工作較快完成,就要等邏輯層的指令才能進行下一步工作

因此邏輯層與渲染層需要有一定的機制保證時序正確,在每個小程序頁面的生命周期中,存在着若干次頁面數據通信

 

 

 

 

三、運行機制

小程序啟動運行兩種情況:

  • 冷啟動(重新開始):用戶首次打開或者小程序被微信主動銷毀后再次打開的情況,此時小程序需要重新加載啟動,即為冷啟動
  • 熱啟動:用戶已經打開過小程序,然后在一定時間內再次打開該小程序,此時無需重新啟動,只需要將后台態的小程序切換到前台,這個過程就是熱啟動

需要注意:

1.小程序沒有重啟的概念
2.當小程序進入后台,客戶端會維持一段時間的運行狀態,超過一定時間后會被微信主動銷毀
3.短時間內收到系統兩次以上內存警告,也會對小程序進行銷毀,這也就為什么一旦頁面內存溢出,頁面會奔潰的本質原因了

 

 

 

開發者在后台發布新版本之后,無法立刻影響到所有現網用戶,但最差情況下,也在發布之后 24 小時之內下發新版本信息到用戶

每次冷啟動時,都會檢查是否有更新版本,如果發現有新版本,將會異步下載新版本的代碼包,並同時用客戶端本地的包進行啟動,即新版本的小程序需要等下一次冷啟動才會應用上

參考文獻

    • https://developers.weixin.qq.com/community/develop/article/doc/0008a4c4f28f30fe3eb863b2750813


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM