微信小程序原理

前言

了解微信小程序原理,感覺可以幫助自己更好理解為什么有些問題是這樣那樣的妙蔗,整理了下,以前發(fā)現(xiàn)的一些問題也更能理解了

基本架構(gòu)

小程序的基本架構(gòu)由View視圖層、APPServices邏輯層組成夹孔,兩者之間是相對獨立,它們之間是通過微信的JSBridge來進行通信和協(xié)作的析孽。

渲染層的界面使用了WebView 進行渲染搭伤;邏輯層采用JsCore線程運行JS腳本。一個小程序存在多個界面袜瞬,所以渲染層存在多個WebView線程怜俐,這兩個線程的通信會經(jīng)由微信客戶端(下文中也會采用Native來代指微信客戶端)做中轉(zhuǎn),邏輯層發(fā)送網(wǎng)絡請求也經(jīng)由Native轉(zhuǎn)發(fā)邓尤。

運行機制:

小程序啟動可以分為兩種情況拍鲤,一種是冷啟動,一種是熱啟動汞扎。

  • 冷啟動:如果用戶首次打開季稳,或小程序銷毀后被用戶再次打開,此時小程序需要重新加載啟動澈魄,即冷啟動景鼠。
  • 熱啟動:如果用戶已經(jīng)打開過某小程序,然后在一定時間內(nèi)再次打開該小程序痹扇,此時小程序并未被銷毀铛漓,只是從后臺狀態(tài)進入前臺狀態(tài),這個過程就是熱啟動帘营。

小程序銷毀時機
通常票渠,只有當小程序進入后臺一定時間,或者系統(tǒng)資源占用過高芬迄,才會被銷毀问顷。具體而言包括以下幾種情形:

  • 當小程序進入后臺,可以維持一小段時間的運行狀態(tài),如果這段時間內(nèi)都未進入前臺杜窄,小程序會被銷毀肠骆。
  • 當小程序占用系統(tǒng)資源過高,可能會被系統(tǒng)銷毀或被微信客戶端主動回收塞耕。
    • 在 iOS 上蚀腿,當微信客戶端在一定時間間隔內(nèi)連續(xù)收到系統(tǒng)內(nèi)存告警時,會根據(jù)一定的策略扫外,主動銷毀小程序莉钙,并提示用戶 「運行內(nèi)存不足,請重新打開該小程序」筛谚。具體策略會持續(xù)進行調(diào)整優(yōu)化磁玉。
    • 建議小程序在必要時使用 wx.onMemoryWarning 監(jiān)聽內(nèi)存告警事件,進行必要的內(nèi)存清理驾讲。

更新機制

未啟動時更新

開發(fā)者在管理后臺發(fā)布新版本的小程序之后蚊伞,如果某個用戶本地有小程序的歷史版本,此時打開的可能還是舊版本吮铭。微信客戶端會有若干個時機去檢查本地緩存的小程序有沒有更新版本时迫,如果有則會靜默更新到新版本∥缴危總的來說掠拳,開發(fā)者在后臺發(fā)布新版本之后,無法立刻影響到所有現(xiàn)網(wǎng)用戶纸肉,但最差情況下碳想,也在發(fā)布之后 24 小時之內(nèi)下發(fā)新版本信息到用戶。用戶下次打開時會先更新最新版本再打開毁靶。

啟動時更新

小程序每次冷啟動時,都會檢查是否有更新版本逊移,如果發(fā)現(xiàn)有新版本预吆,將會異步下載新版本的代碼包,并同時用客戶端本地的包進行啟動胳泉,即新版本的小程序需要等下一次冷啟動才會應用上拐叉。

如果需要馬上應用最新版本,可以使用 wx.getUpdateManager API 進行處理扇商。

View視圖層

由WXML凤瘦、WXSS兩部分組成

AppServices邏輯層

1、App( ) 小程序的入口案铺;
2蔬芥、Page( ) 頁面的入口
3、提供豐富的 API,如微信用戶數(shù)據(jù)笔诵,掃一掃返吻,支付等微信特有能力。
4乎婿、每個頁面有獨立的作用域测僵,并提供模塊化能力。
5谢翎、數(shù)據(jù)綁定捍靠、事件分發(fā)、生命周期管理森逮、路由管理運行環(huán)境

邏輯層的運行環(huán)境
IOS - JSCore
Android - X5 JS解析器
DevTool - nwjs Chrome 內(nèi)核

setData機制

小程序的視圖層目前使用 WebView 作為渲染載體榨婆,而邏輯層是由獨立的 JavascriptCore 作為運行環(huán)境。在架構(gòu)上吊宋,WebView 和 JavascriptCore 都是獨立的模塊纲辽,并不具備數(shù)據(jù)直接共享的通道。當前璃搜,視圖層和邏輯層的數(shù)據(jù)傳輸拖吼,實際上通過兩邊提供的 evaluateJavascript 所實現(xiàn)。即用戶傳輸?shù)臄?shù)據(jù)这吻,需要將其轉(zhuǎn)換為字符串形式傳遞吊档,同時把轉(zhuǎn)換后的數(shù)據(jù)內(nèi)容拼接成一份 JS 腳本,再通過執(zhí)行 JS 腳本的形式傳遞到兩邊獨立環(huán)境唾糯。
而 evaluateJavascript 的執(zhí)行會受很多方面的影響怠硼,數(shù)據(jù)到達視圖層并不是實時的

簡單理解的話,如用戶在視圖層觸發(fā)一些交互移怯,底層代碼的邏輯是:
View視圖層->JSBridge->APPServices邏輯層->JSBridge->View視圖層
這種復雜的交互邏輯香璃,在一些強交互場景下就會顯得卡頓,所以原生組件出現(xiàn)舟误。
原生組件的邏輯是
原生組件->APPServices邏輯層->原生組件

因為原生組件本身是有客戶端控制(可以理解為JSBridge)葡秒,所以簡化了代碼交互的邏輯。
由于原生組件脫離在 WebView 渲染流程外嵌溢,所以在使用原生組件時眯牧,跟小程序普通組件存在一些差異:

  • 原生組件的層級是最高的,所以頁面中的其他組件無論設置 z-index 為多少赖草,都無法蓋在原生組件上学少。
    • 后插入的原生組件可以覆蓋之前的原生組件。
  • 原生組件還無法在 中使用秧骑。
  • 部分CSS樣式無法應用于原生組件如暖,例如:
    • 無法對原生組件設置 CSS 動畫
    • 無法定義原生組件為 position: fixed
    • 不能在父級節(jié)點使用 overflow: hidden 來裁剪原生組件的顯示區(qū)域
  • 原生組件的事件監(jiān)聽不能使用 bind:eventname 的寫法,只支持 bindeventname忌堂。原生組件也不支持 catch 和 capture 的事件綁定方式盒至。
  • 原生組件會遮擋 vConsole 彈出的調(diào)試面板。 在工具上士修,原生組件是用web組件模擬的枷遂,因此很多情況并不能很好的還原真機的表現(xiàn),建議開發(fā)者在使用到原生組件時盡量在真機上進行調(diào)試棋嘲。

參考

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酒唉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子沸移,更是在濱河造成了極大的恐慌痪伦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雹锣,死亡現(xiàn)場離奇詭異网沾,居然都是意外死亡,警方通過查閱死者的電腦和手機蕊爵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門辉哥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攒射,你說我怎么就攤上這事醋旦。” “怎么了会放?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵饲齐,是天一觀的道長。 經(jīng)常有香客問我咧最,道長箩张,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任窗市,我火速辦了婚禮,結(jié)果婚禮上饮笛,老公的妹妹穿的比我還像新娘咨察。我一直安慰自己,他們只是感情好福青,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布摄狱。 她就那樣靜靜地躺著脓诡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪媒役。 梳的紋絲不亂的頭發(fā)上祝谚,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音酣衷,去河邊找鬼交惯。 笑死,一個胖子當著我的面吹牛穿仪,可吹牛的內(nèi)容都是我干的席爽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼啊片,長吁一口氣:“原來是場噩夢啊……” “哼只锻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起紫谷,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤齐饮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后笤昨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祖驱,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年咬腋,在試婚紗的時候發(fā)現(xiàn)自己被綠了羹膳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡根竿,死狀恐怖陵像,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寇壳,我是刑警寧澤醒颖,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站壳炎,受9級特大地震影響泞歉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匿辩,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一腰耙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铲球,春花似錦挺庞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掖鱼。三九已至,卻和暖如春援制,著一層夾襖步出監(jiān)牢的瞬間戏挡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工晨仑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褐墅,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓寻歧,卻偏偏與公主長得像掌栅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子码泛,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容