小程序的view模块和service模块怎么构成

发布时间:2022-03-31 10:13:32 作者:iii
来源:亿速云 阅读:240

本文小编为大家详细介绍“小程序的view模块和service模块怎么构成”,内容详细,步骤清晰,细节处理妥当,希望这篇“小程序的view模块和service模块怎么构成”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

打开微信 web 开发者工具,然后输入 openVendor() 便会打开 WeappVendor这个目录,这里包含了 view 模块和 service  模块使用的几个核心文件:

view 页面详解

view 页面的 template 如下:

<!DOCTYPE html> <html lang="zh-CN"> <head>   <link href="https://res.wx.qq.com/mpres/htmledition/images/favicon218877.ico" rel="Shortcut Icon">   <meta charset="UTF-8" />   <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />    <script>     var __webviewId__;   </script>    <!-- percodes -->    <!--{{WAWebview}}-->    <!--{{reportSDK}}-->    <!--{{webviewSDK}}-->    <!--{{exparser}}-->    <!--{{components_js}}-->    <!--{{virtual_dom}}-->    <!--{{components_css}}-->    <!--{{allWXML}}-->    <!--{{eruda}}-->    <!--{{style}}-->    <!--{{currentstyle}}-->    <!--{{generateFunc}}--> </head>  <body>   <div></div> </body>  </html>

其中 <!-- percodes --> 会在 dev 模式开启后被替换为一个时间锚点,例如:

<script>var pageFrameStartTime = new Date();</script>

<!--{{WAWebview}}--> 会被 WAWebview.js 内代码替换

<!--{{WAWebview}}--> 到 <!--{{generateFunc}}--> 之间暂时没有被使用到

<!--{{generateFunc}}--> 会被 wcc 命令生成后的 js 代码替换

除了上面这些,页面上还会被插入页面和应用的 style 标签,如:

<link rel="stylesheet" type="text/css" href="index.wxss">

这里的 wxss 文件包含的是原始 wxss 文件转换后的 css

以及生成 DOM 的启动脚本:

<script>   document.dispatchEvent(new CustomEvent("generateFuncReady", {     detail: {       generateFunc: $gwx('./page/index.wxml')     }   })) </script>

WAWebview.js 文件中的各个模块(行号为 jsbeautify 之后代码行号,开发者工具版本:092300):

从页面 data 到 dom 的主要流程如下:

var vtree var rootNode  document.addEventListener("generateFuncReady", function(e) {   var generateFunc = e.detail.generateFunc;   wx.onAppDataChange(function(obj) {     // 合并 data 到现有 data     DataStore.setData(obj.data)     // 生成 virtual dom 的 javascript plain object     var props = generateFunc(DataStore.getData())      // ***次渲染     if (obj.options.firstRender) {       vtree = createVirtualTree(props, true)       rootNode = vtree.render()       rootNode.replaceDocumentElement(document.body)       wx.initReady()     } else {       var other_vtree = createVirtualTree(props, false)       var patches = vtree.diff(other_vtree)       patches.apply(rootNode)       vtree = other_vtree       document.dispatchEvent(new CustomEvent("pageReRender", {}));     }   }) })

上面的 DataStore 对象提供合并和获取当前页面 data 对象的功能,其实现如下:

var DataStore = (function() {   var data = {}   return {     getData: function() {       return data     },     setData: function(e) {       for (var t in e) {         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]];         a && (a[s] = e[t])       }     }   } })()  // 解析 key 为 data 内对象的路径字符串 function parsePath(e) {   for (var t = e.length, n = [], i = "", r = 0, o = !1, a = !1, s = 0; s < t; s++) {     var c = e[s];     if ("\\" === c) s + 1 < t && ("." === e[s + 1] || "[" === e[s + 1] || "]" === e[s + 1]) ? (i += e[s + 1], s++) : i += "\\";     else if ("." === c) i && (n.push(i), i = "");     else if ("[" === c) {       if (i && (n.push(i), i = ""), 0 === n.length) throw new Error("path can not start with []: " + e);       a = !0, o = !1     } else if ("]" === c) {       if (!o) throw new Error("must have number in []: " + e);       a = !1, n.push(r), r = 0     } else if (a) {       if (c < "0" || c > "9") throw new Error("only number 0-9 could inside []: " + e);       o = !0, r = 10 * r + c.charCodeAt(0) - 48     } else i += c   }   if (i && n.push(i), 0 === n.length) throw new Error("path can not be empty");   return n }

可以看到,每次 data 变化之后,小程序就会开始整个页面的 diff patch 过程。

对于原生实现的组件, exparser 会在监视到数据变化后发送对应事件到 WeixinJSBridge。

service 页面详解

service 页面会被被拼接为以下的样子:

<!DOCTYPE html> <html> <head>   <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />   <link href="https://res.wx.qq.com/mpres/htmledition/images/favicon218877.ico" rel="Shortcut Icon">   <script>   var __wxAppData = {}   var __wxRoute   var __wxRouteBegin   </script>   <script>var __wxConfig = {"pages":["page/index"],   // app 相关各种配置   }</script>   <script src="http://70475629.appservice.open.weixin.qq.com/asdebug.js"></script>   <script src="http://70475629.appservice.open.weixin.qq.com/WAService.js"></script>   <script src="http://70475629.appservice.open.weixin.qq.com/app.js"></script>   <script>     __wxRoute = 'page/index';     __wxRouteBegin = true   </script>   <script src="http://70475629.appservice.open.weixin.qq.com/page/index.js"></script> </head>  <body>   <script>     window._____sendMsgToNW({       sdkName: 'APP_SERVICE_COMPLETE'     })   </script> </body>  </html>

除了配置和开发者编写的页面、app.js,页面还在加载了 asdebug.js 和 WAService.js 两个文件。

asdebug.js 文件位于 nwjs 项目目录下,路径为app/dist/weapp/appservice/asdebug.js。  它包含了两个部分,一个是 WeixinJSBridge 针对 service 模块的实现,另一块是一些方便命令使用的接口, 例如:help()  会告诉你一些可用的函数:

小程序的view模块和service模块怎么构成

该文件只会在开发者工具内被引入,如果小程序在微信内运行,应该会由微信底层提供 WeixinJSBridge。

WAService 负责 service 模块的一些核心逻辑,它包含以下部分 (行号为 jsbeautify  之后代码行号,开发者工具版本:092300):

现在的 WAService 还有有很多地方依赖 window 对象,所以很有可能它在微信中和开发者工具内一样,依然运行于 webview  标签之内。

读到这里,这篇“小程序的view模块和service模块怎么构成”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

推荐阅读:
  1. 「小程序JAVA实战」小程序模块页面引用(18)
  2. 小程序分享模块超级详解(推荐)

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

小程序 view service

上一篇:微信小程序架构实例分析

下一篇:linux如何使用rmdir删除目录

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》