最近一段时间在研究实现微信小程序和小游戏编译打包和运行环境平台开发。
目前基本可以支持微信基础库 2.8.2 功能迭代了。
在此之前网上有存在开源的一些基于微信基础库版本 1.0 的一些参考。核心作者是由开源大牛 启明兄 的 wept 项目基础上构建的 (目前有幸和启明兄成为同事对这个小程序整体的架构理解帮助了我很多)。
由于 wept 的运行环境是基于微信基础库 1.0 的版本上实现之后也不维护了,时间上是 2016 的在后续的更新的版本中新加的一些特性如自定义组件 npm 包很多 api 等开发实现都不支持,最主要是的微信在后续架构中更换底层的通信方式采用了 webstock 的方式等一些其他变化。
最开始的时候也在网上找了很多的资料,看了有一些人写的解析微信小程序架构的文章,从中学习了解了很多,
但如果想模拟实现出来这么个东西还是有蛮迷糊的,所以我想通过我们所实现的过程来一点点 从现象 看本质 来解析下微信小程序编译和运行原理。
凡事对自己多点信心,多坚持下,多学习下,想想我们遇到的问题,当时感觉我,搞不定了,弄不了,最后随着时间的推移和认知的迭代问题总会慢慢消灭掉。
整个小程序框架系统分为两部分:逻辑层(App Service)和 视图层(View);
小程序提供了自己的视图层描述语言 WXML 和 WXSS;
基于 JavaScript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统他们两个线程里运行;
视图层使用 WebView 渲染,逻辑层使用 JSCore 运行, 视图层和逻辑层通过系统层的 JSBridage 进行通信,逻辑层把数据变化通知到视图层,触发视图层页面更新,
视图层把触发的事件通知到逻辑层进行业务处理。
下面通过微信开发工具来展示说明,小程序逻辑层的 javascript 代码是运行在 NW.js 中,视图层是由 Chromium 60 Webview 来渲染的
他们之间是通过 webstock 协议来通信的。
我们先打开 微信开发工具官方 demo 如图:
从上图和我们的一些理解我们知道微信小程序的文件格式主要组成:
我们后面分析的主要代码都在 package.nw 里面和 core.wxvpkg。
这些文件在后面实现过程中都会使用说明用途的。
core.wxvpkg 解压代码上传在 unwxvpkg 大家有兴趣可以自己先试试。
接下来我们回到开发者工具中打开:
如果你更改 appservice 的 webview 的话微信还会给你各种 alert 弹框,反正应该就是不想让你分析他的代码
点击确定消都消不了只能重新重启编译了 有点小恶心啊
我们第一步还是打开:微信开发者工具–》调试–》调试微信开发者工具
在控制台输入
复制代码
document.getElementsByTagName('webview')
可以看到对应的有 4 个 webview, 我们先要关注的是第一个 webview 因为你点开可以发现第一个对应的就是渲染层的 webview
后面的几个可以先不关注,后续我们会详解
然后我们执行命令打开第一个 webview:
复制代码
document.getElementsByTagName('webview')[0].showDevTools(true,null)
可以看到如图
现在我们就可以看到微信页面渲染层的页面结构了
上面的 webview 可以找到对应的页面层的结构,那么 appservice 要怎么找到呢?
其实最简单的我们直接在首页里面的控制台打 document 就可以直接看到展示的逻辑层代码
(我的做法是从写了微信的 alert 和基础库的一些文件都可以看到这个结构)
接下面我们看下微信小程序的基础库库文件
方法是我们在首页控制台里面输入 openVendor()
我们可以看到弹出的文件系统,这里面对应的就是你选择本地的
.wxvpkg 包里面这个基础库文件的 WAWebview.js 和 WAService.js,对应这两个 webview 里面的 js 引用你可以仔细观察下.wxvpkg 文件解包后的格式:
这里告诉大家一个方法劫持他的运行命令
找到微信开发者工具 wcc 和 wcsc 的地方然后新建两个同名的脚本,然后把原文件从命名,然后重启微信开发者工具 一定要重启不然不生效
本篇只是简单描述了一些关键文件的描述。
后面我会对关键文件进行一一分析描述下他具体做了什么,为什么用到它。
下一篇会给大家带来渲染层和逻辑层的具体页面文件内容结构解析,以及 webstock 通信架构在微信开发者工具里面的运用,可以先给大家看下。
其实他们之间的协调工作以及公开对外的 wx. 对象上面的 api 都是通过 websocket 协议消息实现的。