微信小程序實現原理
微信小程序采用wxml
、wxss
、javascript
進行開發,本質是一個單頁應用,所有的頁面渲染和事件處理,都在一個頁面內進行,但又可以通過微信客戶端調用原生的各種接口。微信的架構,是數據驅動視圖的MVVM
模式,其視圖UI
和數據是分離的,所有的頁面更新,都需要通過對數據的變更來實現。小程序分為兩個部分Webview
和AppService
,Webview
主要用來展現渲染界面,AppService
用來處理業務邏輯、數據及接口調用,通過系統層JSBridge
實現通信,實現UI
的渲染與事件的處理。
目錄結構
打包前
Project
├── pages
│ ├── index
│ │ ├── index.js // index 邏輯
│ │ ├── index.json // index 配置
│ │ ├── index.wxml // index 結構
│ │ └── index.wxss // index 樣式表
│ └── logs
│ ├── logs.js // logs 邏輯
│ ├── logs.json // logs 配置
│ ├── logs.wxml // logs 結構
│ └── logs.wxss // logs 樣式表
├── app.js // 邏輯
├── app.json // 公共配置
├── app.wxss // 公共樣式表
├── project.config.json // 項目配置
└── sitemap.json // 頁面收錄配置
打包后
Project
├── app-config.json // 小程序工程全部json配置信息
├── app-service.js // JS業務邏輯打包到此處
├── page-frame.html // 視圖的模板文件
└── pages
├── index.html // index 頁面
└── logs.html // logs 頁面
架構方案
微信小程序的框架包含兩部分View
視圖層與AppService
邏輯層,View
層用來渲染頁面結構,AppService
層用來邏輯處理、數據請求、接口調用,它們在兩個進程里運行,具體實現是在兩個Webview
中運行。
視圖層和邏輯層通過系統層的JSBridge
進行通信,邏輯層把數據變化通知到視圖層,觸發視圖層頁面更新,視圖層把觸發的事件通知到邏輯層進行業務處理。
----------------------- -----------------------
| View | | AppService |
| | | |
| Page1 Page2 Page3 | | Manager Api |
----------------------- -----------------------
| ↑ | ↑
| Event | Data | Data | Event
↓ | ↓ |
-------------------------------------------------------------------------
| JSBridge |
| |
| Native Storage Network ... |
-------------------------------------------------------------------------
微信將所有的視圖都將加載到一個Webview
中,稱之為View
層。將所有進行邏輯處理的JS
代碼全部加載到另一個WebView
中,稱之為AppService
層,每個小程序只有一個並且整個生命周期常駐內存。在JSBridge
中封裝了消息通信以及通過App
訪問OS
能力的實現,對於消息通信通過在不同平台調用相應的方法進行通信,開發環境為window.postMessage
, IOS
下為WKWebview
的window.webkit.messageHandlers.invokeHandler.postMessage
,Android
下為WeixinJSCore.invokeHandler
。在Js
引擎方面,Android
中使用X5
內核,IOS
中使用JavaScriptCore
引擎,開發工具中使用nwjs Chrome
內核。
通過使用View
視圖層與AppService
邏輯層就實現了雙線程的小程序運行方案,通過兩個線程,可以做到將代碼放入沙箱執行,從而做到對於代碼執行的安全與管控,當然對於雙線程只是一個小程序的解決方案,倘若要在一個App
上運行多個小程序,就應該采用多線程方案去執行,不僅是對於性能方面的考慮,也是為了防止小程序之間相互影響。
底層支持
微信小程序開發工具中擁有一些編譯支持模板以及小程序底層支持文件。
transWxmlToJs
:wxml
轉js
transWxssToCss
:wxss
轉css
transConfigToPf
: 模板頁配置transWxmlToHtml
:wxml
轉html
transManager
: 管理器WAConsole.js
: 框架JS
庫,控制台能力WAWebview.js
: 框架JS
庫,提供視圖層基礎的API
能力,主要功能有將消息通信封裝為JSBridge
消息,日志組件Reporter
封裝,wx
對象下部分渲染視圖方面的Api
,小程序組件實現和注冊,VirtualDOM
與diff
和Render UI
的實現,頁面事件觸發處理WAService.js
: 框架JS
庫,提供邏輯層基礎的API
能力,主要功能有消息通信封裝為JSBridge
消息,日志組件Reporter
封裝,wx
對象下面的大部分Api
方法,App()
小程序入口,Page()
頁面的入口,getApp
等全局方法,數據綁定,事件分發,生命周期管理,路由管理,模塊化能力等
每日一題
https://github.com/WindrunnerMax/EveryDay
參考
https://www.zhihu.com/question/50920642
https://kangzubin.com/wxapp-decompile-1/
https://github.com/berwin/Blog/issues/49
https://segmentfault.com/a/1190000018631528
http://eux.baidu.com/blog/fe/微信小程序架構原理
https://juejin.im/post/5da444ab6fb9a04e054d93d8
https://cloud.tencent.com/developer/article/1029663