微信小程序底層原理與運行機制類文章學習
參考文檔
- 爲了安全和管控, 雙線程執行
- Web Worker執行用戶的代碼; UI線程執行大部分的功能.
- 只經過mvvm模板語法動態改變頁面, 不支持BOM操做
- 編譯過程:
- wcc可執行程序編譯.xml文件生成js腳本, js腳本在傳入正確路徑, 獲得了一個virtual dom樹.
- WAWebview.js
- wx下注冊是api, 最終都會調用WeixinJSBrige方法.
- wxparser對象, 提供dom到wx element之間的映射, 元素操做管理, 事件功能管理
- 部分組件使用原生代碼實現, 例如:
wx-video
, wx-canvas
, wx-map
, wx-textarea
等
- native組件懸浮在webview之上, 大部分組件使用前端實現.
- WeixinJSBridge
- wx.request實際調用WeixinJSBridge, 區分瀏覽器環境調用.
- WAService.js
- wx API; APP(), Page(); 頁面具備做用域, 提供模塊化; 數據綁定; 事件分發; 生命週期; 路由;
- 具體架構由兩個webview組成: UI層, Logic層
- UI層運行在第一個webview中, 執行DOM操做和交互事件響應, 裏面是WAWebview代碼和編譯後內容
- Logic層運行在獨立的JS引擎: ios: JavaScriptCore, android: x5, 開發工具: nwjs chrome內核
- 邏輯層包括WAService.js代碼和業務
- 兩層之間經過WeixinJSBridge, => ? (native) 之間進行交互
- 一個程序有多個view, 也就是多個webview
- 一個小程序只有一個service進程, 也是一個webview, 在程序生命週期內在後臺運行
- 二者都經過WeixinJSBridge和後臺通訊
- view模塊和service模塊均使用postMessage進行通訊
- contentScript.js的代碼提供了message消息到chrome.runtime通訊接口的轉換
- 使用客戶端提供的JavaScript引擎, 沙箱只是單純的提供JavaScript解釋環境, 沒有瀏覽器任何接口
- 小程序的基礎庫分別注入到視圖層和邏輯層運行
- 視圖層: 提供各種組件來組建界面
- 邏輯層: 提供各類API來處理邏輯
- 處理數據綁定, 組件系統, 事件系統, 通訊系統等一系列框架
- 基礎庫不會打包到某個小程序代碼, 會提早內置在微信客戶端
- 基於shadow dom模型
- 啓動機制
- 熱啓動: 打開太小程序, 在必定時間內再次打開
- 冷啓動: 首次打開或者被微信銷燬後打開
- 沒有重啓概念
- 進入後臺後, 維持一段時間的運行後被銷燬, 目前是五分鐘.
- 短期(5s), 連續收到兩次系統內存告警, 會進行小程序銷燬.
- 更新機制
- 冷加載讀取緩存/檢查更新
- 熱加載直接後臺切前臺
- 冷啓動時發現有新版本, 會異步下載新版本的代碼包, 並同時用客戶端本地的包進行啓動
- 即新版小程序發佈後, 須要經歷兩次冷啓動, 纔會應用
- 若是須要新版本, 可使用指定API進行更新
- setData
- webview和jsCore是單獨模塊
- 兩邊都經過evaluateJavaScript實現, 即用戶傳輸的數據.
- 須要將其轉換成一份JS腳本, 經過執行腳本進行執行
- 未啓動時更新
- 微信客戶端有若干個時機檢查本地緩存的小程序有沒有新版本, 有靜默升級
- 發佈新版本後, 沒法同步全部的用戶, 24小時, 同步全部新版本信息到用戶手機
- 下次進行冷啓動時, 先更新最新版本再打開.
- 啓動時更新
- 每次冷啓動都會檢查更新, 異步下載最新的版本的代碼包, 但會用本地的包進行啓動
- 新版本在下一次冷啓動時, 應用.
疑問
- 爲何微信小程序兩個webview, 其中有給logic線程, 是跑在webview中, 怎麼沒有window對象?
- 如何在某個操做系統寫引入JS解釋環境呢?
- shadowdom是什麼?
歡迎關注本站公眾號,獲取更多信息