一、 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的區別
從技術的發展角度來看,微信小程序是從微信中的 webView
和 JS-SDK
進化到了今天的形態。那么,小程序和普通的h5
頁面到底有什么區別呢?
- 運行環境:小程序基於瀏覽器內核重構的內置解析器,而
h5
的宿主環境是瀏覽器。所以小程序中沒有DOM
和BOM
的相關API
,jQuery
和一些NPM
包都不能在小程序中使用; - 系統權限:小程序能獲得更多的系統權限,如網絡通信狀態、數據緩存能力等;
- 渲染機制:小程序的邏輯層和渲染層是分開的,而
h5
頁面UI
渲染跟JavaScript
的腳本執行都在一個單線程中,互斥。所以h5
頁面中長時間的腳本運行可能會導致頁面失去響應。
其實,小程序開發過程中我們面對的是 iOS
和 Android
微信客戶端和輔助開發的小程序開發者工具。根據官方文檔,這三大運行環境也是有所區別的:
所以微信小程序介於 web
端和原生 App
之間,能夠豐富調用功能接口,同時又跨平台。
四、wa的生命周期
五、wa的渲染模式
小程序的渲染層和邏輯層分別由2個線程管理:
- 渲染層:界面渲染相關的任務全都在
WebView
線程里執行。一個小程序存在多個界面,所以渲染層存在多個WebView
線程。 - 邏輯層:采用
JsCore
線程運行JS腳本。
視圖層和邏輯層通過系統層的 WeixinJsBridage
進行通信:邏輯層把數據變化通知到視圖層,觸發視圖層頁面更新,視圖層把觸發的事件通知到邏輯層進行業務處理。
(頁面渲染的具體流程是:在渲染層,宿主環境會把 WXML
轉化成對應的 JS
對象,在邏輯層發生數據變更的時候,我們需要通過宿主環境提供的 setData
方法把數據從邏輯層傳遞到渲染層,再經過對比前后差異,把差異應用在原來的Dom樹上,渲染出正確的UI界面)
為什么要這么設計呢?主要還是處於管控和安全上的考慮。我們需要阻止開發者使用一些瀏覽器提供的,諸如跳轉頁面、操作 DOM、動態執行腳本的開放性接口。
Web
框架不同之處。基於這個模型,可以更好地管控以及提供更安全的環境。缺點是帶來了無處不在的異步問題(任何數據傳遞都是線程間的通信,也就是都會有一定的延時),不過小程序在框架層面已經封裝好了異步帶來的時序問題。
六、組件系統
我們知道小程序是有自己的組件的,這些基本組件就是基於 Exparser
框架。 Exparser
基於 WebComponents
的 ShadowDOM
模型,但是不依賴瀏覽器的原生支持,而且可在 純 JS
環境中運行。
小程序中,所有節點樹相關的操作都依賴於 Exparser
,包括 WXML
到頁面最終節點樹的構建、CreateSelectorQuery
調用和自定義組件特性等。
現在微信小程序也支持自定義組件了,用法和組件間通信類似於 Vue
。
在內置組件中,有一些組件並不完全在 Exparser
的渲染體系下,而是由客戶端原生參與組件的渲染。比如說 Map
組件。它渲染的層級比在 WebView
層渲染的普通組件要高。
引入原生組件的優點是:
- 擴展
Web
的能力 - 體驗更好,減輕
WebView
的渲染工作 - 繞過
setData
、數據通信和重渲染流程,性能更好
本文部分參考: