背景
都知道小程序的体验要比app里面直接嵌入h5的体验要好,都知道小程序其实也是运行在app上的。那么我们为什么不能用小程序来开发app呢?这样不仅可以小程序和app只要开发一次,小程序和app都有了。还可以实现app动态更新不需要提交应用市场审核,我们只要做个小程序载体的app壳(类微信端小程序 sdk),而且体验效果也接近原生。做一个类似小程序平台把我们现在的app项目框架从组件化改成为小程序平台构架。每个业务程序都是一个个小程序,原生提供原生能力。
什么是小程序
首先我们要知道小程序是啥?现在市场上的小程序有很多,微信小程序、百度小程序、支付宝小程序、字节跳动小程序等但都差不多。与传统app相比,小程序无需安装、卸载,运行在微信、百度、支付宝等这样大型app载体上。虽然每种小程序都差不太多,但都定义了自己的开发语言和规范,这对开发者来说也是不少的麻烦。
小程序是介于web网页应用和原生应用的一种产物;
小程序和Hybrid APP的关系
原以为Hybrid APP就是用app的webview去加载一个h5文件,然后webview通过js桥梁和原生通信,实现js调用h5方法,h5方法调原生方法。来弥补h5无法拍照、打电话等不足。但是做出来的效果h5都会有短暂白屏,体验也无法达到原生效果(提供一个简单的demo)。后来接触了小程序,觉得小程序的体验和原生差不了多少了,可以说不是专业人员基本是看不出区别的,原先以为小程序是类似RN、weex这样的原生渲染,后面才知道它也是webview渲染。竟然也是hybird app,那它的体验是什么上去的?都是webview渲染,为什么小程序的体验会比普通的h5好?这让我非常感兴趣,于是就开始了小程序的深入了解。
初步了解用h5做Hybrid APP和小程序的区别:
相同点:
1.都是webview渲染
2.都是js通过桥接和原生通信
3.都可以调用原生组件
4.都可以把资源文件下载本地加载渲染
不同点:
1.Hybrid是html 有dom操作,小程序是虚拟dom 屏蔽了直接对dom操作
2.小程序有服务层,负责处理业务逻辑和数据处理
3.小程序页面有原生页面的生命周期管理
4.小程序tab和bar是原生控件
5.小程序类web不是h5
6.小程序基于微信跨平台
小程序原理
下面以微信小程序为例,进一步展开小程序原理
都知道微信小程序有自己的开发语言,wx开头的方法也不少,那它是什么转化为微信app能识别的语言呢?微信开发工具开发完提交审核,审核通过下发到微信端的是什么样的文件呢?带着这些问题我查阅了很多资料,小程序在技术架构上非常清晰易懂。JS负责业务逻辑的实现,而表现层则WXML和WXSS来共同实现,前者其实就是一种微信定义的模板语言,而后者类似CSS。但是语法毕竟是自定义的,所以要么在下发的之前进行编译,要么就是在渲染的时候进行转化成webview能够识别的语法。我们发现这2个节点微信都做了处理,拿到下发到微信端的wxapkg格式的小程序包,解开后都是js和html已经不是我们开发的WXML和WXSS格式了。但是这一个个html直接用浏览器打开却是空白的。没错<body></body>里面是空的,渲染的时候动态加进入内容的。
1.小程序是如何编译的
我们先来看看打包编译这层,微信都做了些啥呢?微信的打包和编译都在服务端进行,我这边找了个类似的来描述下,不一定准确,只能参考下。
- 检测app.json文件是否存在
- 清空并创建指定的输出目录
- 根据service.html模板,带上版本信息输出到指定的目录中
- 读取配置文件app.json,将其注入到app-config.js中,输出到指定的目录中
- 读取所有小程序代码中所有的JS文件,同时判断其是否在app.json中定义,如果其没被定义也不是app.js,说明其为引入的module, 将这些JS路径名存入一个数组中,并确保app.js和页面文件放置在数组尾部
- 遍历JS文件数组并读取它们,根据用户设置项判断是否使用Babel将其转换为es5的代码
- 把js模块封装成CommonJS模块,并合并成app-service.js这个文件输出
- 根据app.json里的pages配置,遍历每个页面根据页面wxml,wxss生成相应的页面文件并合成page-frame.html
其他步骤应该都不难理解,我认为最难的应该是wxml,wxss生成相应的页面文件,这个页面不是普通的html文件,前面也说过它的body是空的。如果你安装了微信的开发工具的化你可以找下是否有wcc和wcsc这2个小工具。wxss 转换成了css,wxml转换成了inject_js,实际上就是virtual_dom。openVendor命令可以在小程序中获取到构建脚本wcc和wcsc,以及各个版本小程序的执行SDK***.wxvpkg,这个SDK也可以用Wechat-app-unpack解开,解开后里面就有WAService.js和WAWebview.js等代码。
根据 /Users/***/Library/Application Support/微信web开发者工具/WeappVendor 路径来找到微信开发者工具目录,以及查看工具集成的核心类。可以看到我们和熟悉的也很重要的WAService.js和WAWebview.js2个文件也在里面。不过代码都是加密混淆的,没有可读性。