膳绫擎的 DataStore 对象供给归并和获取当前页面 data 对象的功能,其实现如下:
该文件只会在开辟者对象内被惹人,如不雅小法度榜样在微信内运行,应当会由微信底层供给 WeixinJSBridge。
可以看到,每次 data 变更之后,小法度榜样就会开端全部页面的 diff patch 过程。
对于原生实现的组件, exparser 会在监督到数据变更后发送对应事宜到 WeixinJSBridge。
service 页面详解
service 页面会被被拼接为以下的样子:
除了设备和开辟者编写的页面、app.js,页面还在加载了 asdebug.js 和 WAService.js 两个文件。
asdebug.js 文件位于 nwjs 项目目次下,路径为app/dist/weapp/appservice/asdebug.js。 它包含了两个部分,一个是 WeixinJSBridge 针对 service 模块的实现,另一块是一些便利敕令应用的接口, 例如:help() 会告诉你一些可用的函数:
WAService 负责 service 模块的一些核心逻辑,它包含以下部分 (行号为 jsbeautify 之后代码行号,开辟者对象版本: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
如今的 WAService 还有有很多处所依附 window 对象,所以很有可能它在微信中和开辟者对象内一样,依然运行于 webview 标签之内。
- 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 && ("
推荐阅读
【引自第九法度榜样的博客】信赖不少上手试用了微信小法度榜样开辟者对象的开辟者都邑对其实现有些困惑, 本文试图对其架构模型进行一些解析。如出缺点之处,迎接留言指出。本文分为以下几个部分: 小法度榜样调试>>>详细阅读
本文标题:微信小程序架构分析 (中)
地址:http://www.17bianji.com/lsqh/35673.html
1/2 1