精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

微信小程序架構分析 (上)

開發 架構
相信不少上手試用了微信小程序開發者工具的開發者都會對其實現有些疑惑, 本文試圖對其架構模型進行一些解析。

 【引自第九程序的博客】相信不少上手試用了微信小程序開發者工具的開發者都會對其實現有些疑惑, 本文試圖對其架構模型進行一些解析。如有錯誤之處,歡迎留言指出。

本文分為以下幾個部分:

  • 小程序調試技巧
  • 小程序主要模塊構成
  • 小程序模塊間通信
  • 設計理念分析

小程序調試技巧

微信開發者工具默認禁用了右鍵打開調試面板功能,我們可以修改開發者工具部分代碼移除該限制。

  • 找到 app.nw 項目根目錄,Mac 下為/Applications/wechatwebdevtools.app/Contents/Resources/app.nw
  • 使用 js-beautify 對代碼批量格式化:
  1. cd /Applications/wechatwebdevtools.app/Contents/Resources/app.nw 
  2. find . -type f -name '*.js' -not -path "./node_modules/*" -not -path "./modified_modules/*" -exec js-beautify -r -s 2 -p -f '{}' \;  
  • 注釋掉文件 app/dist/app.js 44 行和app/dist/components/simulator/webviewbody.js 149 行preventDefault 調用。101100 版本還需要修改 package.json 文件,去掉 --disable-devtools。

執行完以上操作就可以右鍵打開頁面的調試面板了,需要特別注意的是,使用 view 頁面的面板后會導致 wxml 面板不可用,touch 事件無法響應等種種問題,請慎重使用。

通過代碼可以發現,在配置目錄下添加 config.json 文件,然后加入{isDev:true} 可以啟用開發者工具所謂的調試模式, 但是我在配置后程序無法正常啟動,只好暫時先放棄這種方式。

小程序主要模塊構成

小程序自身分為兩個主要部分獨立運行:view 模塊和 service 模塊。在開發者工具中,它們獨立運行于不同的 webivew tag 中。

view 模塊負責 UI 顯示,它由開發者編寫的 wxml 和 wxss 轉換后代碼以及微信提供相關輔助模塊組成。 一個 view 模塊對應一個 webview 組件(也就是我們常規理解的一個頁面), 小程序支持同時多個 view 存在。view 模塊通過 WeixinJSBridge 對象來跟后臺通信。

service 模塊負責應用的后臺邏輯,它由小程序的 js 代碼以及微信提供的相關輔助模塊組成。 一個應用只有一個 service 進程,它同樣也是一個頁面(至少在開發者工具內如此,上線后可能運行于 WeixinJSCore 之內),與 view 模塊不同的是,它在程序生命周期內后臺運行,service 模塊通過與 view 模塊實現不同但接口格式一樣的 WeixinJSBridge 對象跟后臺通信。

小程序模塊間通信

 

 

(開發者工具內各模塊通信圖)

做過微信開發相關的開發者會對 WeixinJSBridge 這個對象有所了解,它就是負責 UI 與后臺 進行交互的一個中間層。應用號的 WeixinJSBridge 相比與之前的微信 webview 多出 publish 和 subscribe 兩個公共方法來發布和訂閱事件,從而進行雙向通信。

service 模塊的 WeixinJSBridge 對象在文件app/dist/weapp/appservice/asdebug.js 中定義, view 層的 WeixinJSBridge 在文件 app/dist/inject/jweixindebug.js 中定義。 盡管兩者都使用一樣的接口以及使用 postMessage 方法與后臺通信,但是其內部所做的事情確是完全不同的, 例如 service 模塊可以直接通過 prompt 方法來通過 prompt調起底層組件,而 view 層的 WeixinJSBridge 只能發送消息 (參考 H5與Native交互之JSBridge技術)。

我們來看一個典型的交互流程:

1.用戶點擊界面觸發事件

2.對應 view 模塊接收事件后將事件封裝成所需格式后調用 publish 方法發送:

  1. WeixinJSBridge.publish('PAGE_EVENT', data) 

data 參數舉例:

  1. "data": { 
  2.   "eventName""onhidetap"
  3.   "data": { 
  4.     "target": { 
  5.       ... 
  6.     }, 
  7.     "currentTarget": { 
  8.       ... 
  9.     }, 
  10.     "type""tap"
  11.     "timeStamp": 11457, 
  12.     "touches": [ ...  ], 
  13.     "detail": { 
  14.       ... 
  15.     } 
  16.   } 
  17. }, 
  18. "options": { 
  19.   "timestamp": 1475445858336 
  20.  

3.后臺(開發者工具內為 nwjs 運行環境)將數據處理后發送給 service 模塊,數據形如:

  1. "to""appservice"
  2. "msg": { 
  3.   "eventName""PAGE_EVENT"
  4.   "data": { 
  5.     "data": { 
  6.       "eventName""onhidetap"
  7.       "data": { 
  8.         "target": { 
  9.           ... 
  10.         }, 
  11.         "currentTarget": { 
  12.           ... 
  13.         }, 
  14.         "type""tap"
  15.         "timeStamp": 75329, 
  16.         "touches": [ ...  ], 
  17.         "detail": { 
  18.           ... 
  19.         } 
  20.       } 
  21.     }, 
  22.     "options": { 
  23.       "timestamp": 1475445858336 
  24.     } 
  25.   }, 
  26.   "webviewID": 0 
  27. }, 
  28. "command""MSG_FROM_WEBVIEW" 
  29.  

4.service 模塊的 WeixinJSBridge 內回調函數依據傳來數據找到對應 view 的 page 模塊后執行 對應名為 eventName 指向的函數

5.回調函數調用 this.setData({hidden: true}) 改變 data,serivce 層計算該頁面 data 后向后臺發送 send_app_data 和 appdataChange 事件,具體數據格式如下:

  1. "appData": { 
  2.   "page/index": { 
  3.     ... 
  4.   } 
  5. }, 
  6. "sdkName""send_app_data"
  7. "to""backgroundjs"
  8. "comefrom""webframe"
  9. "command""COMMAND_FROM_ASJS"
  10. "appid""touristappid"
  11. "appname""chat"
  12. "apphash": 70475629, 
  13. "webviewID": 100000 
  14.  
  1. "eventName""appDataChange"
  2. "data": { 
  3.   "data": { 
  4.     "data": { 
  5.       "hidden"true 
  6.     } 
  7.   }, 
  8.   "options": { 
  9.     "timestamp": 1475528706311 
  10.   } 
  11. }, 
  12. "sdkName""publish"
  13. "webviewIds": [ 
  14.   0 
  15. ], 
  16. "to""backgroundjs"
  17. "comefrom""webframe"
  18. "command""COMMAND_FROM_ASJS"
  19. "appid""touristappid"
  20. "appname""chat"
  21. "apphash": 70475629, 
  22. "webviewID": 100000 
  23.  

6.后臺(文件 dist/components/simulator/webviewbody.js) 接收到appDataChange 事件數據后再將數據進行簡單封裝, ***轉發給到 view 層。 具體數據格式為: 

  1. "to""webframe"
  2. "msg": { 
  3.   "eventName""appDataChange"
  4.   "data": { 
  5.     "data": { 
  6.       "data": { 
  7.         "hidden"true 
  8.       } 
  9.     }, 
  10.     "options": { 
  11.       "timestamp": 1475528706311 
  12.     } 
  13.   }, 
  14.   "sdkName""publish"
  15.   "webviewIds": [ 
  16.     0 
  17.   ], 
  18.   "to""backgroundjs"
  19.   "comefrom""webframe"
  20.   "command""COMMAND_FROM_ASJS"
  21.   "appid""touristappid"
  22.   "appname""chat"
  23.   "apphash": 70475629, 
  24.   "webviewID": 100000, 
  25.   "act""sendMsgFromAppService" 
  26. }, 
  27. "command""MSG_FROM_APPSERVICE"
  28. "webviewID": 0, 
  29. "id": 0.10577065353216675 
  30.  

7.view 層的 WeixinJSBridge 接收到后臺的數據,如果 webviewID 匹配則將 data 與現有頁面 data 合并, 然后就是 virtual dom 模塊進行 diff 和 apply 操作改變 dom。

小程序模塊間消息傳遞除了界面事件和應用數據還包括觸發原生方法、握手以及生命周期等類型, 盡管處理對象和處理方式不同,大體流程跟上面是一樣的。

view 模塊和 service 模塊的 WeixinJSBridge 都使用了 postMessage 接口 (參考MDN 文檔) 與后臺通信,但是由于該接口無法直接與 nwjs 后臺進程通信,所以開發者工具會將 app/dist/contentscript/contentScript.js 文件做為contentScript 注入到 view 模塊和 service 模塊所在頁面,contentScript.js 的代碼提供了 message 消息到 chrome.runtime通信接口的轉換。

微信開發者工具擴展了 devtools 提供了 AppData 面板,開發者可以修改里面數據然后直接看到 view 界面的變化效果。這里修改數據后 nwjs 會將消息發送給 service 層,之后發生的事就跟上面 4 5 6 步一樣:service 傳遞消息給 nwjs,***到 view 層。

設計理念分析

小程序這樣的分層設計顯然是有意為之的,它的中間層完全控制了程序對于界面進行的操作, 同時對于傳遞的數據和響應時間也做到的監控。一方面程序的行為受到了極大限制, 另一方面微信可以確保他們對于小程序內容和體驗有絕對的控制。

我們在小程序的 js 代碼里面是不能直接使用瀏覽器提供的 DOM 和 BOM 接口的,這一方面是因為 js 代碼外層使用了局部變量進行屏蔽,另一方面即便我們可以操作 DOM 和 BOM 接口,它們對應的 也是 service 模塊頁面,并不會對頁面產生影響。

這樣的結構也說明了小程序的動畫和繪圖 API 被設計成生成一個最終對象而不是一步一步執行的樣子, 原因就是 json 格式的數據傳遞和解析相比與原生 API 都是損耗不菲的,如果頻繁調用很可能損耗 過多性能,進而影響用戶體驗。

理解了以上機制,再對 view 模塊和 service 模塊的 WeixinJSBridge 加以改造,我們便不難做到讓 小程序跑在自己的環境下,這樣就可以做些手機調試以及單頁面測試等操作。

責任編輯:龐桂玉 來源: 第九程序的博客
相關推薦

2017-06-09 10:40:00

微信小程序架構分析

2017-06-09 12:58:20

微信小程序架構分析

2021-06-10 10:51:27

程序基礎架構

2016-11-04 10:30:17

微信小程序

2017-05-08 15:03:07

微信小程序開發實戰

2016-10-20 21:02:12

微信小程序javascript

2017-01-09 10:01:49

微信小程序

2016-09-28 18:10:59

微信程序MINA

2016-11-04 10:31:49

微信程序指南

2016-11-22 11:23:52

微信小程序騰訊微信

2016-09-27 15:40:58

微信程序前端

2016-11-04 10:49:48

微信小程序

2016-09-27 16:38:24

JavaScript微信Web

2016-11-19 18:06:44

微信小程序張小龍

2017-06-27 10:53:32

2016-09-27 20:36:23

微信HttpWeb

2018-07-26 15:16:50

小程序iPhone X甜酸

2017-02-06 13:32:12

微信小程序思想

2016-12-01 17:33:52

微信

2016-11-04 09:55:16

微信小程序
點贊
收藏

51CTO技術棧公眾號

国产精品99久久99久久久二8| 欧美精品乱码久久久久久| 国产精品久久久久免费| 国产精品白浆一区二小说| 岛国精品一区| 图片区日韩欧美亚洲| 国内精品久久国产| av大全在线观看| 欧美日韩伦理在线免费| 在线成人免费视频| 成人在线播放网址| 九色在线视频蝌蚪| 六月丁香婷婷久久| 中文字幕亚洲无线码在线一区| 第一区免费在线观看| 高潮毛片在线观看| 成人精品鲁一区一区二区| 日本久久久a级免费| 日本免费网站视频| av成人资源| 日韩欧美高清在线视频| 中文字幕精品—区二区日日骚| 性网爆门事件集合av| 视频精品一区二区| 成年人精品视频| 粉嫩av懂色av蜜臀av分享| 日韩成人亚洲| 亚洲国产精品欧美一二99| 日本电影一区二区三区| 精品人妻一区二区三区三区四区| 国产精品日本| 久久中文字幕国产| 受虐m奴xxx在线观看| 亚洲va中文在线播放免费| 一区二区三区在线观看视频| 国产在线一区二区三区播放| 亚洲一区二区人妻| 亚洲一区二区三区免费在线观看| 色偷偷偷亚洲综合网另类| 中文在线观看免费视频| 欧美爱爱视频| 色综合久久久网| 日本福利视频在线观看| 国产视频三级在线观看播放| 成人久久视频在线观看| 国产综合色香蕉精品| 日韩免费视频一区二区视频在线观看| 欧美好骚综合网| 精品无码久久久久久国产| 8x8x成人免费视频| 亚洲欧洲自拍| 亚洲成av人在线观看| 手机福利在线视频| 黄色av网站在线| 成人av网站在线观看| 91九色视频导航| 精品乱码一区内射人妻无码| 99pao成人国产永久免费视频| 久久久国产视频| 亚洲精品天堂网| 国内精品久久久久久久久电影网| 亚洲电影天堂av| 亚洲欧美aaa| 69堂免费精品视频在线播放| 偷窥少妇高潮呻吟av久久免费| 亚洲欧美一二三| 日本在线免费中文字幕| 91在线视频观看| 国产日韩精品一区观看| www.日韩在线观看| 国产综合色在线| 成人免费午夜电影| 国产又粗又猛又爽| 狠狠久久亚洲欧美| 成人免费网站在线观看| 国产精品一级视频| 狠狠色伊人亚洲综合成人| 国产日韩欧美另类| 波多野结衣毛片| 日韩成人午夜电影| 国产欧美日韩91| 亚洲图片中文字幕| 极品少妇一区二区| 国产在线观看一区二区三区| 国产又黄又粗又长| 蜜桃久久久久久| 国产精品精品视频| 中文字幕自拍偷拍| 狠狠色丁香婷婷综合| 91九色视频在线观看| 亚洲精品97久久中文字幕| 成人免费视频一区| 久久久久一区二区三区| 久久久久久女乱国产| 欧美激情中文字幕| 日韩在线第一区| 很黄的网站在线观看| 亚洲精品视频在线看| 日韩极品视频在线观看| h片在线观看| 黄色成人在线免费| 奇米影视四色在线| 国产中文欧美日韩在线| 日韩三级电影网址| 成人免费网站黄| 欧美有码视频| 国产精品高潮呻吟久久av野狼 | 久久国产88| 亚洲aⅴ男人的天堂在线观看| 性xxxfllreexxx少妇| 亚洲欧洲另类国产综合| 成人综合视频在线| 日韩免费一级| 按摩亚洲人久久| 香蕉影院在线观看| 国产**成人网毛片九色 | 欧美日韩亚洲一区三区| 国产精品爽黄69| 深夜福利在线看| 亚洲黄一区二区三区| 成人在线免费在线观看| 精品国产免费久久久久久婷婷| 日韩手机在线| 欧美成人免费全部| 久久精品99北条麻妃| 成人高清在线视频| 一级做a爰片久久| 三上悠亚亚洲一区| 亚洲国产成人在线视频| 五月天丁香激情| 狠狠色2019综合网| 亚洲欧美国产精品桃花| 外国成人直播| 日韩大陆毛片av| 久久精品国产亚洲AV无码麻豆| 九九国产精品视频| 日本一区二区三区免费观看| 波多野结衣视频一区二区| 日韩美女视频在线| av成人免费网站| 久久成人久久鬼色| 亚洲精品一品区二品区三品区 | 久久精品中文字幕一区| 最近中文字幕av| 国产欧美一区二区三区在线老狼| 91好吊色国产欧美日韩在线| 久久a级毛片毛片免费观看| 国模精品视频一区二区三区| 成人免费视频国产| 亚洲高清视频中文字幕| 久久精品aⅴ无码中文字字幕重口| 亚洲成人国产| 亚洲影院污污.| 超碰在线免费播放| 欧美一区二区成人6969| 欧美老熟妇一区二区三区| 韩国午夜理伦三级不卡影院| 免费看啪啪网站| 国产不卡精品| 欧美黄网免费在线观看| 无码国产精品一区二区色情男同| 午夜av一区二区三区| 欧美在线一级片| 日日夜夜免费精品| 一区二区三区四区欧美| 欧美区一区二区| 久久久久久久色| 日本精品专区| 欧美色综合天天久久综合精品| 精品无码在线观看| 久久国产精品第一页| 青青草综合视频| 国产乱人伦丫前精品视频| 777精品视频| 成人福利在线| 日韩一区二区三| 日韩精品一卡二卡| 国产拍欧美日韩视频二区| 日韩一区二区三区久久| 国产综合激情| 欧美日韩一区二区视频在线观看| jizz欧美| 色综合男人天堂| 欧美色视频免费| 欧美日韩1区2区| 福利一区二区三区四区| 久久精品一区二区三区四区| 久国产精品视频| 亚洲精品精选| 亚洲欧洲精品一区| 高清精品xnxxcom| 国产成人精品视| 丝袜在线视频| 尤物tv国产一区| 欧美一级性视频| 在线日韩av片| 久久精品国产亚洲av香蕉| 国产丝袜在线精品| av在线天堂网| 日本成人中文字幕在线视频| 久久手机在线视频| 精品一区二区三| 国产精品视频免费一区| 国产精品伦一区二区| 国内外成人免费激情在线视频网站| 狠狠狠综合7777久夜色撩人| 精品久久久久久无| 91tv国产成人福利| 色嗨嗨av一区二区三区| 国产午夜福利片| 亚洲老妇xxxxxx| 俄罗斯毛片基地| 91在线观看视频| 亚洲精品无码久久久久久久| 日韩电影在线一区二区三区| 免费在线观看视频a| 欧美高清视频手机在在线| 精品欧美国产一区二区三区不卡| 亚洲成a人片777777久久| 欧美亚洲激情视频| 亚洲91av| 久久久国产91| 丝袜美腿美女被狂躁在线观看| 亚洲精品一区二区三区婷婷月 | 日韩国产精品一区| 国产白浆在线观看| 欧美日本在线视频| 91黑人精品一区二区三区| 亚洲成a人v欧美综合天堂 | 精品av在线播放| 欧美三级免费看| 亚洲乱码国产乱码精品精的特点 | 国产福利精品在线| 国产美女高潮在线| 久久久久久午夜| 18在线观看的| 久久艳片www.17c.com | 国产精品免费无遮挡| 日本乱人伦aⅴ精品| av大片在线免费观看| 午夜国产精品一区| 豆国产97在线 | 亚洲| 一区二区免费在线播放| 欧美卡一卡二卡三| 亚洲免费观看高清完整版在线观看 | 17c丨国产丨精品视频| 天堂美国久久| 熟女熟妇伦久久影院毛片一区二区| 成人在线视频免费观看| 婷婷亚洲婷婷综合色香五月| 精品国产乱码| 亚洲成人自拍| 99精品视频精品精品视频| 亚洲精品第一区二区三区| 成人精品亚洲| 尤物一区二区三区| 中文字幕亚洲综合久久五月天色无吗'' | 91小视频在线播放| 国产在线看一区| 一区二区三区人妻| 不卡区在线中文字幕| 欲求不满的岳中文字幕| 久久久一区二区三区捆绑**| 国产精品天天干| 国产精品国产成人国产三级 | 日韩精品福利| 亚洲性69xxxbbb| 香蕉视频网站在线观看| 成年人精品视频| а√天堂8资源在线| 日韩av色综合| 日韩毛片网站| 不卡视频一区二区| 色哟哟精品丝袜一区二区| 欧洲视频一区二区三区| 欧美岛国激情| 日韩欧美猛交xxxxx无码| 国产亚洲激情| 在线黄色免费观看| 丰满岳乱妇一区二区三区| 亚洲最大免费视频| 国产精品情趣视频| 久久免费视频精品| 色婷婷综合五月| 国产伦理一区二区| 精品视频在线导航| 黄色片网站在线| 2019精品视频| 日本黄色成人| 久久精品综合一区| 午夜影院欧美| 丰满少妇被猛烈进入高清播放| 美腿丝袜在线亚洲一区| 日本一级大毛片a一| 久久久久国产精品麻豆ai换脸 | 欧美日本一区二区高清播放视频| 精品欧美一区免费观看α√| 精品一区二区国语对白| 日韩片在线观看| 亚洲男人的天堂网| 成人公开免费视频| 91精品免费在线| 九九在线视频| 午夜精品视频在线| 国产情侣一区在线| 日韩欧美视频一区二区三区四区 | 国产精品久久久久一区二区三区| 国产精品 欧美 日韩| 欧美精品三级在线观看| 国产一级片在线| 午夜精品福利视频| 日韩成人精品| 亚洲一区在线直播| 久久久久久穴| 日本xxxx免费| 国产精品国产a| 中文字幕乱码一区二区 | 黄色成人在线观看| 国产成人精品视频| 久久97精品| 日本男女交配视频| 国内精品免费在线观看| 永久免费毛片在线观看| 日韩欧美在线视频日韩欧美在线视频 | 国产一区中文字幕| 91麻豆精品国产91久久综合| 偷拍亚洲欧洲综合| 日本xxxxwww| 色综合91久久精品中文字幕| 最新亚洲国产| 中文字幕久久一区| 久久er精品视频| 粉嫩精品久久99综合一区| 欧美性大战久久久久久久蜜臀| 你懂的视频在线免费| 欧洲亚洲免费视频| 亚洲传媒在线| 国产肥臀一区二区福利视频| 成人ar影院免费观看视频| 精品无码人妻一区二区三| 日韩三级在线观看| 欧美巨大xxxx做受沙滩| 97影院在线午夜| 韩国自拍一区| 日韩精品视频一区二区| 午夜精品久久久久久| 午夜小视频在线播放| 26uuu另类亚洲欧美日本一| 久久亚洲黄色| 国产无套内射久久久国产| 久久久久久久久免费| 国产又粗又猛又爽又| 在线播放国产精品| 国产麻豆一区| 2025韩国大尺度电影| 国产一区二区免费看| 亚洲成人生活片| 精品国产露脸精彩对白| 日韩欧美精品一区二区三区| 老牛影视免费一区二区| 日韩成人av影视| 成人自拍小视频| 欧美成人三级电影在线| 国产白丝在线观看| 蜜桃欧美视频| 六月丁香婷婷色狠狠久久| 国产探花在线免费观看| 精品黑人一区二区三区久久| 55av亚洲| 人禽交欧美网站免费| 久久电影网站中文字幕| 久久久全国免费视频| 日韩精品在线观看一区| 视频精品导航| 欧美日韩视频免费| 91免费在线看| 亚洲中文一区二区三区| 欧美激情亚洲另类| 国产精品欧美三级在线观看| 国产精品区在线| 午夜视频久久久久久| 毛片在线播放网址| 成人午夜小视频| 亚洲一区二区毛片| 国产午夜精品理论片| 亚洲国产精品一区二区三区| www成人在线视频| 国产黄色激情视频| 国产女同性恋一区二区| 一级成人免费视频| 91成人国产在线观看| 国产精品videosex性欧美| 国产一级黄色录像| 欧美久久久久久久久| 末成年女av片一区二区下载| 中文字幕久久一区| 久久午夜色播影院免费高清| 国产高潮流白浆喷水视频| 日韩免费av一区二区| 国内精品嫩模av私拍在线观看|