精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

天堂资源中文在线| 成人手机在线免费视频| av在线免费网站| 粉嫩av一区二区三区在线播放| 91精品国产网站| 无码人中文字幕| 在线观看视频一区二区三区| 色综合久久九月婷婷色综合| 少妇高潮流白浆| 天堂视频中文在线| 国产一区二区伦理片| 亚州成人av在线| 亚洲AV成人无码精电影在线| 欧美亚洲tv| 欧美精品三级在线观看| 日本少妇高潮喷水视频| 黄网址在线观看| 91蝌蚪porny成人天涯| 91亚洲午夜在线| 波多野结衣家庭主妇| 亚洲视频碰碰| 久久久国产精彩视频美女艺术照福利| 97香蕉碰碰人妻国产欧美| 亚洲热av色在线播放| 欧美性极品xxxx娇小| 日本a在线天堂| 日本在线看片免费人成视1000| jiyouzz国产精品久久| 国产在线拍偷自揄拍精品| 亚洲男人的天堂在线视频| 久久久久免费av| 在线观看国产精品淫| 中文字幕5566| 卡一精品卡二卡三网站乱码| 91精品国产91久久综合桃花| 污版视频在线观看| 成人视屏在线观看| 欧美日韩国产色| 每日在线观看av| 在线观看的网站你懂的| 亚洲欧洲精品一区二区三区| 日日噜噜噜噜夜夜爽亚洲精品| 天天爽夜夜爽夜夜爽| 成人美女视频在线看| 翡翠波斯猫1977年美国| 99国产精品99| 国产一区激情在线| 成人国产精品一区| 国产乱人乱偷精品视频| 麻豆精品久久久| 国产精品一二区| 国产偷人爽久久久久久老妇app | 亚洲天天在线日亚洲洲精| 国产污在线观看| 成人资源在线播放| 精品国产乱码久久| av电影中文字幕| 永久免费精品视频| 亚洲国产成人精品久久久国产成人一区 | 天堂av在线电影| 亚洲一区视频在线| 91丨porny丨探花| 亚洲天堂免费电影| 色老汉av一区二区三区| 一级在线免费视频| 日本国产亚洲| 日韩精品中午字幕| 伊人网综合视频| 午夜精品福利影院| 亚洲人成自拍网站| а天堂中文在线资源| 一区二区日韩欧美| 久久久免费电影| 国产www在线| 蜜桃一区二区三区四区| 91老司机在线| 日韩一级片免费| 久久久www免费人成精品| 亚洲成人午夜在线| 羞羞网站在线看| 欧美日韩免费在线观看| 男女男精品视频站| 午夜久久av| 日韩毛片精品高清免费| 影音先锋欧美在线| 伦理在线一区| 日韩欧美国产中文字幕| 手机在线成人免费视频| 日韩精品中文字幕一区二区| 日韩av最新在线观看| 人妻aⅴ无码一区二区三区| 婷婷综合网站| 97超级碰碰碰久久久| 亚洲图片在线播放| www..com久久爱| 亚洲精品一区二区三区蜜桃久| 26uuu亚洲电影在线观看| 狠狠躁夜夜躁人人爽天天天天97| 国产又猛又黄的视频| 一区中文字幕电影| 在线视频免费一区二区| 久久精品一级片| 日本不卡的三区四区五区| 国产精品xxxx| 免费在线你懂的| 日韩欧美有码在线| 欧美老女人bb| 日韩午夜电影网| 91av中文字幕| 国产黄色片免费| 国产精品视频一二| 欧美 日韩 国产在线观看| 最新亚洲国产| 亚洲天堂av在线免费观看| 久久久91视频| 久久精品免费看| 欧美日韩电影一区二区三区| 男女视频在线| 69堂精品视频| 手机毛片在线观看| 国产精品丝袜xxxxxxx| 99re视频在线| 美女黄视频在线观看| 日本乱人伦aⅴ精品| av天堂一区二区| 欧美在线免费一级片| 国产美女精品视频| jizz亚洲| 欧美午夜片在线观看| 欧美成人午夜精品免费| 最新亚洲激情| 国产chinese精品一区二区| 欧美96在线| 欧美日韩高清在线| 久久久久久成人网| 日韩国产欧美三级| 欧美一区二区视频17c| 黄视频网站在线观看| 精品久久久久一区二区国产| 亚洲熟女www一区二区三区| 久久成人18免费观看| 一本一本a久久| 免费一区二区三区四区| 中文字幕av一区二区三区谷原希美| 久久精品国产成人av| 91色乱码一区二区三区| 18岁网站在线观看| 亚洲va久久| 日本成人免费在线| 国产主播福利在线| 欧美视频一区在线观看| 女人裸体性做爰全过| 麻豆高清免费国产一区| 一区不卡字幕| www.久久草.com| 色综合久久中文字幕综合网小说| 国产成人精品av在线观| 亚洲国产综合在线| 漂亮人妻被黑人久久精品| 国产精品一区亚洲| 欧美一区二区三区在线免费观看| 成人av集中营| 美女精品视频一区| 免费看av毛片| 岛国精品视频在线播放| 干b视频在线观看| 久久er精品视频| 欧美一级特黄aaaaaa在线看片| 日韩在线成人| 538国产精品视频一区二区| 久青草国产在线| 欧美蜜桃一区二区三区 | 国产精品高潮呻吟久久| 国产精品自在自线| 国产一区日韩欧美| 久久国产一区| 欧美一级做a| 久久99国产综合精品女同| 亚洲 欧美 激情 另类| 91久久精品一区二区| 国产免费久久久久| 99久久精品国产导航| 久久精品免费网站| 亚洲一级淫片| 麻豆成人在线播放| 日本久久二区| 777777777亚洲妇女| 自拍视频在线播放| 337p日本欧洲亚洲大胆色噜噜| 免费黄色av片| 亚洲精品福利视频网站| 国产又爽又黄无码无遮挡在线观看| 免费美女久久99| 日韩精品在线视频免费观看| 精品一区av| 国产日韩精品推荐| 亚洲成人毛片| 秋霞成人午夜鲁丝一区二区三区| 亚洲精品承认| 亚洲精品狠狠操| 国产免费的av| 在线影视一区二区三区| 久久久久亚洲av片无码下载蜜桃| 国产欧美一区二区精品忘忧草 | 精品国产一区二区在线| 天堂中文在线看| 宅男噜噜噜66一区二区66| 欧美特黄aaaaaa| 亚洲一区二区三区四区在线| 青青青视频在线免费观看| 成人av网址在线| 中文av字幕在线观看| 午夜在线播放视频欧美| 男人添女荫道口女人有什么感觉| 欧美日韩性在线观看| 久久艹中文字幕| 亚洲精品福利| 亚洲va电影大全| www.国产精品| 国产精品第三页| 在线看片福利| 国精产品一区一区三区有限在线| 巨大荫蒂视频欧美另类大| 一本大道亚洲视频| 欧美日韩激情视频一区二区三区| 精品sm捆绑视频| 国产美女三级无套内谢| 欧美日韩久久久久久| 免费在线不卡av| 一本色道亚洲精品aⅴ| 日韩污视频在线观看| 亚洲综合一二区| 欧美老熟妇一区二区三区| 中文字幕一区av| 性爱在线免费视频| 国产日韩欧美一区二区三区综合| 国产熟女高潮一区二区三区 | 成人av电影在线| 波多野结衣天堂| 亚洲综合日韩| 国产成人无码a区在线观看视频| 欧美xxx在线观看| 性生活免费观看视频| 久久精品国内一区二区三区水蜜桃| 日韩欧美亚洲v片| 思热99re视热频这里只精品| 好吊色欧美一区二区三区| 国产精品天天看天天狠| 国产精品久久久久久久免费大片 | 国产夫妻在线播放| 色综合久久88| а√天堂8资源在线| 8090成年在线看片午夜| 国产精品专区免费| 国产成人精品免费视频| 久久精品黄色| 亚洲在线视频观看| y111111国产精品久久久| 国产亚洲福利社区| 日韩av黄色在线| 日本一区二区不卡高清更新| 成人免费在线播放| 综合久久国产| 欧美视频一区| 日韩少妇内射免费播放18禁裸乳| 久久国产主播| 九九热99视频| 粉嫩久久99精品久久久久久夜| yy6080午夜| 中文欧美字幕免费| 亚洲国产精品免费在线观看| 亚洲一区二区三区视频在线| 欧美 日韩 精品| 欧美日韩一区二区三区在线看| 国产农村妇女毛片精品久久| 亚洲成人在线网| 国产原创av在线| 北条麻妃在线一区二区| 黄色成人在线网| 国产精品第一区| 中文字幕区一区二区三| 免费在线成人av电影| 91欧美国产| 无码专区aaaaaa免费视频| 玖玖视频精品| 三年中文在线观看免费大全中国| 成人精品鲁一区一区二区| 91激情视频在线观看| 一区二区三区日韩精品视频| 精品国产xxx| 日韩一级欧美一级| 黄色免费在线播放| 久久成人精品一区二区三区| videos性欧美另类高清| 成人午夜小视频| 岳的好大精品一区二区三区| 国产精品av免费| 美女精品一区| 折磨小男生性器羞耻的故事| 国产精品久久久久久久久搜平片| 久久精品国产av一区二区三区| 欧亚洲嫩模精品一区三区| 懂色av蜜臀av粉嫩av分享吧| 一本一道久久a久久精品逆3p| 激情av在线| 国产在线98福利播放视频| 日韩高清成人在线| 国产91在线亚洲| 久久精品国产一区二区| 日韩一级视频在线观看| 亚洲国产一二三| 91麻豆国产在线| 亚洲欧美激情四射在线日| 欧美韩日亚洲| 91精品国产综合久久久久久蜜臀| 亚洲国产欧美日韩在线观看第一区| 日本三级中文字幕在线观看| 日韩av在线播放中文字幕| 亚洲成av人片在线观看无| 亚洲欧美另类在线| 伊人成人在线观看| 国产一区二区三区在线视频| 蜜桃视频动漫在线播放| 99在线视频播放| 欧美黄免费看| 欧美视频国产视频| 国产精品亲子乱子伦xxxx裸| 欧美一级特黄视频| 亚洲精品动漫100p| 毛片在线导航| 国产成人精品福利一区二区三区| 66久久国产| 亚洲精品视频三区| 中文字幕一区免费在线观看| 日本妇乱大交xxxxx| 国产一区二区三区直播精品电影 | 91久久久久久久久| 日本一区二区免费高清| 国产性生交xxxxx免费| 2021中文字幕一区亚洲| 黄色片免费观看视频| 亚洲精品v欧美精品v日韩精品| 后进极品白嫩翘臀在线播放| 国产成人精品福利一区二区三区| 一区视频在线| 中文字幕人妻一区二区三区| 亚洲电影一级黄| 天天干视频在线观看| 97在线观看视频| 偷拍亚洲色图| 能在线观看的av| 久久久美女艺术照精彩视频福利播放| 亚洲va在线观看| 亚洲欧洲日产国产网站| 456成人影院在线观看| 亚洲福利av| 狠狠色丁香久久婷婷综合丁香| 免费黄色激情视频| 欧美一区二区三区喷汁尤物| 日本动漫理论片在线观看网站| 高清av免费一区中文字幕| 999亚洲国产精| 最近中文字幕免费视频| 欧美在线观看视频在线| 久热国产在线| 成人综合色站| 先锋亚洲精品| 手机av在线不卡| 91精品国产欧美一区二区18| 青春草在线视频| 蜜桃视频在线观看成人| 青青青伊人色综合久久| 五月婷婷一区二区| 日韩精品在线影院| 99九九久久| 国产尤物av一区二区三区| 99热精品一区二区| 日韩欧美一级大片| 欧美精品在线看| 亚洲黄色录像| 国产无色aaa| 亚洲18女电影在线观看| 国产精品麻豆一区二区三区| 91亚洲va在线va天堂va国| 国产精品一页| 日韩影院一区二区| 国产视频久久久| 亚洲在线资源| 18禁免费无码无遮挡不卡网站 | 久久久久噜噜噜亚洲熟女综合| 日韩乱码在线视频| 白嫩亚洲一区二区三区| 鲁一鲁一鲁一鲁一澡| 亚洲视频免费在线观看| 深夜福利在线看| 亚洲精品欧美日韩专区| 六月丁香综合| 国语对白一区二区| 日韩中文字幕视频| 亚洲视频分类|