日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
微信小程序架構分析(中)

【引自第九程序的博客】本文探討一下小程序的 view 模塊和 service 模塊是如何構成的。

成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)站制作、網(wǎng)站建設、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務浦口,十多年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:13518219792

打開微信 web 開發(fā)者工具,然后輸入 openVendor() 便會打開 WeappVendor這個目錄,這里包含了 view 模塊和 service 模塊使用的幾個核心文件:

  • wcc 可執(zhí)行程序,用于將 wxml 轉(zhuǎn)為 view 模塊使用的 js 代碼,使用方式為wcc xxx.wxml
  • wcsc 可執(zhí)行程序,用于將 wxss 轉(zhuǎn)為 view 模塊使用的 css 代碼,使用方式為 wcsc xxx.wxss
  • WAService.js 提供 service 模塊大部分功能,下面會有詳細介紹
  • WAWebview.js 提供 view 模塊大部分功能,下面會有詳細介紹

view 頁面詳解

view 頁面的 template 如下:

 
 
 
 
  1.  
  2.  
  3.  
  4.    
  5.    
  6.    
  7.  
  8.    
  9.  
  10.    
  11.  
  12.    
  13.  
  14.    
  15.  
  16.    
  17.  
  18.    
  19.  
  20.    
  21.  
  22.    
  23.  
  24.    
  25.  
  26.    
  27.  
  28.    
  29.  
  30.    
  31.  
  32.    
  33.  
  34.    
  35.  
  36.  
  37.  
  38.   
     
  39.  
  40.  
  41.   

其中 會在 dev 模式開啟后被替換為一個時間錨點,例如:

 
 
 
 
  1.  

會被 WAWebview.js 內(nèi)代碼替換

之間暫時沒有被使用到

會被 wcc 命令生成后的 js 代碼替換

除了上面這些,頁面上還會被插入頁面和應用的 style 標簽,如:

 
 
 
 
  1.  

這里的 wxss 文件包含的是原始 wxss 文件轉(zhuǎn)換后的 css

以及生成 DOM 的啟動腳本:

 
 
 
 
  1.   

WAWebview.js 文件中的各個模塊(行號為 jsbeautify 之后代碼行號,開發(fā)者工具版本:092300):

  • 1-77 行: WeixinJSBridge 對象兼容層,這個大概只會在調(diào)試時用到,因為開發(fā)時和運行時頁面都會被后臺以注入的方式添加 WeixinJSBridge 這個對象。我們可以通過這段代碼看到它暴露的方法: invoke invokeCallbackHandleron publish subscribe subscribe subscribeHandler。
  • 78-235 行:Reporter 對象,它的作用就是發(fā)送錯誤和性能統(tǒng)計數(shù)據(jù)給后臺
  • 236-596 行:wx 對象,頁面的核心之一,一方面封裝 WeixinJSBridge 的 invokeMethod 方位為易于調(diào)用的形式(例如 redirectTo, navigateTo等),另一方面封裝 WeixinJSBridge 回調(diào)方法,調(diào)用者可以使用wx.onAppDataChange(callback) 添加數(shù)據(jù)變更的回調(diào)函數(shù),***提供wx.publishPageEvent 發(fā)送頁面事件到后臺
  • 607-1267 行:wxparser 對象,提供 dom 到 wx element 對象之間的映射操作,提供元素操作管理和事件管理功能
  • 1268-1285 行:轉(zhuǎn)發(fā) window 上的 animation 和 transition 相關的動畫事件到 exparser
  • 1286-1313 行:訂閱并轉(zhuǎn)發(fā) WeixinJSBridge 提供的全局事件到 exparser
  • 1324-1345 行:轉(zhuǎn)發(fā) window 上的 error 以及各種表單事件到 exparser
  • 1347-3744 行:使用 exparser.registerBehavior 和exparser.registerElement 方法注冊各種以 wx- 做為標簽開頭的元素到 exparser
  • 3744-4498 行:virtual dom 渲染算法實現(xiàn),提供 diff apply render 等方法,該模塊接口基本與 virtual-dom 一致,這里特別的地方在于它所 diff 和生成的并不是原生 DOM,而是各種模擬了 DOM 接口的 wx element 對象
  • 4599-4510 行:插入默認樣式到頁面

從頁面 data 到 dom 的主要流程如下:

 
 
 
 
  1. var vtree 
  2. var rootNode 
  3.  
  4. document.addEventListener("generateFuncReady", function(e) { 
  5.   var generateFunc = e.detail.generateFunc; 
  6.   wx.onAppDataChange(function(obj) { 
  7.     // 合并 data 到現(xiàn)有 data 
  8.     DataStore.setData(obj.data) 
  9.     // 生成 virtual dom 的 javascript plain object 
  10.     var props = generateFunc(DataStore.getData()) 
  11.  
  12.     // ***次渲染 
  13.     if (obj.options.firstRender) { 
  14.       vtree = createVirtualTree(props, true) 
  15.       rootNode = vtree.render() 
  16.       rootNode.replaceDocumentElement(document.body) 
  17.       wx.initReady() 
  18.     } else { 
  19.       var other_vtree = createVirtualTree(props, false) 
  20.       var patches = vtree.diff(other_vtree) 
  21.       patches.apply(rootNode) 
  22.       vtree = other_vtree 
  23.       document.dispatchEvent(new CustomEvent("pageReRender", {})); 
  24.     } 
  25.   }) 
  26. })  

上面的 DataStore 對象提供合并和獲取當前頁面 data 對象的功能,其實現(xiàn)如下:

 
 
 
 
  1. var DataStore = (function() { 
  2.   var data = {} 
  3.   return { 
  4.     getData: function() { 
  5.       return data 
  6.     }, 
  7.     setData: function(e) { 
  8.       for (var t in e) { 
  9.         for (var n = (0, parsePath)(t), o = data, a = void 0, s = void 0, c = 0; c < n.length; c++) Number(n[c]) === n[c] && Number(n[c]) % 1 === 0 ? Array.isArray(o) || (a[s] = [], o = a[s]) : "[object Object]" !== Object.prototype.toString.call(o) && (a[s] = {}, o = a[s]), s = n[c], a = o, o = o[n[c]]; 
  10.         a && (a[s] = e[t]) 
  11.       } 
  12.     } 
  13.   } 
  14. })() 
  15.  
  16. // 解析 key 為 data 內(nèi)對象的路徑字符串 
  17. function parsePath(e) { 
  18.   for (var t = e.length, n = [], i = "", r = 0, o = !1, a = !1, s = 0; s < t; s++) { 
  19.     var c = e[s]; 
  20.     if ("\\" === c) s + 1 < t && ("." === e[s + 1] || "[" === e[s + 1] || "]" === e[s + 1]) ? (i += e[s + 1], s++) : i += "\\"; 
  21.     else if ("." === c) i && (n.push(i), i = ""); 
  22.     else if ("[" === c) { 
  23.       if (i && (n.push(i), i = ""), 0 === n.length) throw new Error("path can not start with []: " + e); 
  24.       a = !0, o = !1 
  25.     } else if ("]" === c) { 
  26.       if (!o) throw new Error("must have number in []: " + e); 
  27.       a = !1, n.push(r), r = 0 
  28.     } else if (a) { 
  29.       if (c < "0" || c > "9") throw new Error("only number 0-9 could inside []: " + e); 
  30.       o = !0, r = 10 * r + c.charCodeAt(0) - 48 
  31.     } else i += c 
  32.   } 
  33.   if (i && n.push(i), 0 === n.length) throw new Error("path can not be empty"); 
  34.   return n 

可以看到,每次 data 變化之后,小程序就會開始整個頁面的 diff patch 過程。

對于原生實現(xiàn)的組件, exparser 會在監(jiān)視到數(shù)據(jù)變化后發(fā)送對應事件到 WeixinJSBridge。

service 頁面詳解

service 頁面會被被拼接為以下的樣子:

 
 
 
 
  1.  
  2.  
  3.  
  4.    
  5.    
  6.    
  7.    
  8.    
  9.    
  10.    
  11.    
  12.    
  13.  
  14.  
  15.  
  16.    
  17.  
  18.  
  19.   

除了配置和開發(fā)者編寫的頁面、app.js,頁面還在加載了 asdebug.js 和 WAService.js 兩個文件。

asdebug.js 文件位于 nwjs 項目目錄下,路徑為app/dist/weapp/appservice/asdebug.js。 它包含了兩個部分,一個是 WeixinJSBridge 針對 service 模塊的實現(xiàn),另一塊是一些方便命令使用的接口, 例如:help() 會告訴你一些可用的函數(shù):

該文件只會在開發(fā)者工具內(nèi)被引入,如果小程序在微信內(nèi)運行,應該會由微信底層提供 WeixinJSBridge。

WAService 負責 service 模塊的一些核心邏輯,它包含以下部分 (行號為 jsbeautify 之后代碼行號,開發(fā)者工具版本:092300):

  • 1-78 行: 跟 WAWebview.js 一樣的 WeixinJSBridge 兼容模塊
  • 79-245 行: 跟 WAWebview.js 一樣的 Reporter 模塊
  • 246-1664 行:比 WAWebview.js 中 wx 功能更為豐富 wx 接口模塊
  • 1665-2304 行:appServiceEngine 模塊,提供 Page,App,GetApp 接口
  • 2305-2360 行: 為 window 對象添加 AMD 接口 require define

現(xiàn)在的 WAService 還有有很多地方依賴 window 對象,所以很有可能它在微信中和開發(fā)者工具內(nèi)一樣,依然運行于 webview 標簽之內(nèi)。 


網(wǎng)頁名稱:微信小程序架構分析(中)
當前URL:http://www.5511xx.com/article/dhjdiig.html