《微信小程序架構(gòu)解析》丨NOTES


作者什么來(lái)頭

渠宏偉,騰訊前端開(kāi)發(fā)高級(jí)工程師。

小程序特點(diǎn)

類(lèi)Web,不是HTML5

即用即走,隨手可得

擁有離線能力

基于微信跨平臺(tái)

媲美原生操作體驗(yàn)

為什么那么快

Page Frame

Native預(yù)先加載一個(gè)WebView

當(dāng)打開(kāi)指定頁(yè)面時(shí),無(wú)需加載額外資源直接渲染

返回顯示歷史View

退出小程序,View狀態(tài)不銷(xiāo)毀

小程序入口

掃碼進(jìn)入

搜索(模糊)

發(fā)現(xiàn)>小程序

小程序發(fā)送到桌面(Android)

小程序架構(gòu)


交互通過(guò)系統(tǒng)層的JSBridge進(jìn)行,當(dāng)用戶(hù)進(jìn)行操作觸發(fā)了事件,通過(guò)JSBridge通知邏輯層,邏輯層執(zhí)行對(duì)應(yīng)邏輯并把數(shù)據(jù)通過(guò)JSBridge傳遞給視圖層,視圖層執(zhí)行相應(yīng)的操作。


小程序初始化時(shí),先從微信的CDN下載小程序的完整的包,然后在微信內(nèi)部進(jìn)行解包初始化。

小程序視圖層

WXML(WeiXin Markup Language)

支持?jǐn)?shù)據(jù)綁定

支持邏輯算術(shù)、運(yùn)算

支持模板、引用

支持添加事件


WXML先被編譯成JS文件,引入數(shù)據(jù)后會(huì)初始完成虛擬DOM,最終把虛擬DOM構(gòu)建成DOM樹(shù),在WebView中渲染。

WXSSWeiXin Style Sheets

支持大部分CSS特性

添加尺寸單位rpx,可根據(jù)屏幕寬度自適應(yīng)

使用@import語(yǔ)句可以導(dǎo)入外聯(lián)樣式表

不支持多層選擇器,避免被組件內(nèi)結(jié)構(gòu)破壞


WXSS被編譯成JS運(yùn)行。常用選擇器、組件,略過(guò)。

小程序的組件基于Web Component標(biāo)準(zhǔn),使用Polymer框架實(shí)現(xiàn)Web Component。Polymer框架是Google提出的,但在使用過(guò)程中發(fā)現(xiàn)其性能較低,所以微信自研了一套。

Native組件層在WebView層之上。

小程序邏輯層

邏輯層講數(shù)據(jù)進(jìn)行處理后發(fā)送給視圖層,同時(shí)接受視圖層的事件反饋。

App()小程序的入口;Page()頁(yè)面的入口

提供豐富的API,如微信用戶(hù)數(shù)據(jù),掃一掃,支付等微信特有能力

每個(gè)頁(yè)面有獨(dú)立的作用域,并提供模塊化能力

數(shù)據(jù)綁定,事件分發(fā),生命周期管理,路由管理

運(yùn)行環(huán)境:iOS-JSCore、Android-X5 JS解析器、DevTool-nwjs Chrome內(nèi)核

邏輯層生命周期

用戶(hù)從微信打開(kāi)一個(gè)小程序的執(zhí)行過(guò)程:

Native執(zhí)行一個(gè)拉起的操作,告訴App Service層

App Service層執(zhí)行拉起,同時(shí)通知View層進(jìn)行初始化

接下來(lái)要打開(kāi)頁(yè)面,通過(guò)路由通知App Service層

App Service層創(chuàng)建一個(gè)Page,然后通知Web層初始化,同時(shí)通知View層渲染并發(fā)送初始化數(shù)據(jù)

App Service層的Page會(huì)進(jìn)行onLoad、onShow事件的執(zhí)行,渲染完成onReady

當(dāng)用戶(hù)進(jìn)行操作時(shí),就出發(fā)一次用戶(hù)事件,用戶(hù)事件會(huì)通知到App

Service層并在此層執(zhí)行,然后通知View層進(jìn)行局部渲染,這樣就完成了一次交互。

New View是在Web View初始化完成之后建立的,用于等待用戶(hù)執(zhí)行下一個(gè)界面時(shí)使用,減少Web View創(chuàng)建的花銷(xiāo),用戶(hù)不需要等待了。App Service層的New Page也是同理。

小程序可以借鑒的優(yōu)點(diǎn)

提前新建Web View,準(zhǔn)備新頁(yè)面渲染

View層和邏輯層分離,通過(guò)數(shù)據(jù)驅(qū)動(dòng),不直接操作DOM

使用Virtual DOM,進(jìn)行局部更新

全部使用https,確保傳輸過(guò)程中安全

前端組件化開(kāi)發(fā)

加入rpx單位,隔離設(shè)備尺寸,方便開(kāi)發(fā)

小程序存在的問(wèn)題

小程序仍然使用WebView渲染,并非原生渲染

需要獨(dú)立開(kāi)發(fā),不能再非微信環(huán)境運(yùn)行

開(kāi)發(fā)者不可以擴(kuò)展新組件

服務(wù)端口返回的頭無(wú)法執(zhí)行,如Set-Cookie

以來(lái)瀏覽器環(huán)境的js庫(kù)不能使用,因?yàn)槭荍SCore執(zhí)行的,沒(méi)有window、document對(duì)象

WXSS中無(wú)法使用本地(圖片、字體等)

WXSS轉(zhuǎn)化成js而不是css,為了兼容rpx

WXSS不支持級(jí)聯(lián)選擇器

小程序無(wú)法打開(kāi)頁(yè)面,無(wú)法拉起APP

脫離微信的“小程序”:PWA漸進(jìn)式應(yīng)用

優(yōu)點(diǎn):

漸進(jìn)增強(qiáng):支持的新特性的瀏覽器獲得更好的體驗(yàn),不支持的保持原來(lái)的體驗(yàn)

離線訪問(wèn):通過(guò)Service Workers可以再離線或者網(wǎng)速差的環(huán)境下工作

類(lèi)原生應(yīng)用:使用app shell model做到原生應(yīng)用般的體驗(yàn)

可安裝:允許用戶(hù)保留對(duì)他們有用的應(yīng)用在主屏幕上,不需要通過(guò)應(yīng)用商店

容易分享:通過(guò)URL可以輕松分享應(yīng)用

持續(xù)更新:受益于service worker的更新進(jìn)行,應(yīng)用能夠始終保持更新

安全:可通過(guò)https來(lái)提供服務(wù)來(lái)防止網(wǎng)絡(luò)窺探,保證內(nèi)容不被篡改

可搜索:得益于W3C manifests元數(shù)據(jù)和service worker的等級(jí),讓搜索引擎能夠找到wen應(yīng)用

再次訪問(wèn):通過(guò)消息推送等特性讓用戶(hù)再次訪問(wèn)變得容易

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,725評(píng)論 25 709
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評(píng)論 19 139
  • 是不是 非要淚水已漸干涸雙眼 才會(huì)像孩子一樣清澈 會(huì)不會(huì) 定要千瘡百孔的傷痕心靈...
    麥麥麥麥芽糖閱讀 244評(píng)論 3 3
  • 感恩美味的蛋糕,帶著祝福和儀式感,讓伊伊步入六歲,非常好吃,謝謝 感恩快遞師傅大熱天及時(shí)送來(lái)快遞,謝謝你 感恩林暉...
    妮妮Gloria閱讀 219評(píng)論 0 3
  • 異步編程一直是JavaScript 編程的重大事項(xiàng)。關(guān)于異步方案, ES6 先是出現(xiàn)了 基于狀態(tài)管理的 Promi...
    Jeremy_young閱讀 17,178評(píng)論 2 44

友情鏈接更多精彩內(nèi)容