微信小程序底層實現原理


一、 wa的運行環境

       根據微信官方的說明,wa的運行環境有3個平台,IOS的webkit(蘋果開源的瀏覽器內核),Android的X5(QQ瀏覽器內核),開發時用的nw.js(C++實現的web轉桌面應用);

二、為什么wa不直接運行在瀏覽器(webview)中,而要繞過瀏覽器直接調用內核呢?

       因為運行在瀏覽器中的webapp是做不了監控的,而wa的表現是半native app,半web app,而native app與web app和一個很重要的區別就是native app有自己的生命周期,在這之中,我們可以根據生命周期的不同時間段做出不同的調整,比如常駐內存,防止被系統殺掉,系統后台保存活度等等,而web app就沒有這回事了,僅僅能夠根據事件做出不同的調整,跟原生app比起來,體驗就差了一些。基於此,wa當然不會像web app一樣了,他需要有自己的生命周期。      

  本質上來說,wa還是運行在瀏覽器模式中,而承載wa的系統就是微信,用微信來管理wa的生命周期。而微信,現在本身就是一個系統。        

  微信官方貼出來的生命周期函數主要有以下3個:onLaunch(初始化完成),onShow(啟動時,后由后台進入前台),onHide(由前台進入后台)

三、wa與h5的區別

從技術的發展角度來看,微信小程序是從微信中的 webViewJS-SDK 進化到了今天的形態。那么,小程序和普通的h5頁面到底有什么區別呢?

  • 運行環境:小程序基於瀏覽器內核重構的內置解析器,而 h5 的宿主環境是瀏覽器。所以小程序中沒有 DOMBOM 的相關 APIjQuery和一些 NPM 包都不能在小程序中使用;
  • 系統權限:小程序能獲得更多的系統權限,如網絡通信狀態、數據緩存能力等;
  • 渲染機制:小程序的邏輯層和渲染層是分開的,而 h5 頁面 UI 渲染跟 JavaScript 的腳本執行都在一個單線程中,互斥。所以 h5 頁面中長時間的腳本運行可能會導致頁面失去響應。

其實,小程序開發過程中我們面對的是 iOSAndroid 微信客戶端和輔助開發的小程序開發者工具。根據官方文檔,這三大運行環境也是有所區別的:

所以微信小程序介於 web 端和原生 App 之間,能夠豐富調用功能接口,同時又跨平台。

四、wa的生命周期

 

五、wa的渲染模式

小程序的渲染層和邏輯層分別由2個線程管理:

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

視圖層和邏輯層通過系統層的 WeixinJsBridage 進行通信:邏輯層把數據變化通知到視圖層,觸發視圖層頁面更新,視圖層把觸發的事件通知到邏輯層進行業務處理。

(頁面渲染的具體流程是:在渲染層,宿主環境會把 WXML 轉化成對應的 JS 對象,在邏輯層發生數據變更的時候,我們需要通過宿主環境提供的 setData 方法把數據從邏輯層傳遞到渲染層,再經過對比前后差異,把差異應用在原來的Dom樹上,渲染出正確的UI界面)

為什么要這么設計呢?主要還是處於管控和安全上的考慮。我們需要阻止開發者使用一些瀏覽器提供的,諸如跳轉頁面、操作 DOM、動態執行腳本的開放性接口。

雙線程模型是小程序框架與業界大多數前端 Web 框架不同之處。基於這個模型,可以更好地管控以及提供更安全的環境。缺點是帶來了無處不在的異步問題(任何數據傳遞都是線程間的通信,也就是都會有一定的延時),不過小程序在框架層面已經封裝好了異步帶來的時序問題。

六、組件系統

我們知道小程序是有自己的組件的,這些基本組件就是基於 Exparser 框架。 Exparser 基於 WebComponentsShadowDOM 模型,但是不依賴瀏覽器的原生支持,而且可在 純 JS 環境中運行。

小程序中,所有節點樹相關的操作都依賴於 Exparser,包括 WXML 到頁面最終節點樹的構建、CreateSelectorQuery 調用和自定義組件特性等。

現在微信小程序也支持自定義組件了,用法和組件間通信類似於 Vue

在內置組件中,有一些組件並不完全在 Exparser 的渲染體系下,而是由客戶端原生參與組件的渲染。比如說 Map 組件。它渲染的層級比在 WebView 層渲染的普通組件要高。

引入原生組件的優點是:

  • 擴展 Web 的能力
  • 體驗更好,減輕 WebView 的渲染工作
  • 繞過 setData、數據通信和重渲染流程,性能更好


本文部分參考:
https://www.jianshu.com/p/ca720137818f
https://www.jianshu.com/p/548d095516a8


免責聲明!

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



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