最近在看小程序相关,从技术角度来看小程序在Hybrid的优化过程有不少值得咱们学习的地方,因此我想在学习的同时也能有所输出,在这个系列我不会讲怎么去申请一个小程序,怎么去开发一个程序,而是讲从小程序咱们能学到什么,尽管它如今还存在不少问题,但大范围的使用会推进小程序将微信技术生态作到极致,使用到Hybrid技术的公司很是多,但愿个人系列文章能对你们有所帮助。javascript
从技术的角度来看,其实微信的页面技术是小程序的前身,以下图。css
在微信里面的网页,能够经过JS-SDK来调用微信native,让开发者使用到微信的原生能力,当JS-SDK公布后受到不少开发者的欢迎,但随着普遍的使用,开发者们又遇到了不少问题。html
用户在手机访问微信的一个h5,因为移动设备的限制和网络速度,都会有一个明显的白屏。
微信团队用了不少精力来解决这个问题,就出现了后面的JS-SDK加强版,这里面有个比较重要的功能就是:离线存储。 离线存储简单的理解就是从本地加载web资源而再也不从服务端拉取,从而避免网络速度的瓶颈。
离线存储下降了网络延时大大提升了h5的用户体验,但在一些复杂的页面依然会有白屏的问题,这里主要是js和css的复杂性会占用大量的UI线程而影响WebView的渲染。
其实目前大部分公司使用的是相似JS-SDK方案:灵活的网页开发+ 丰富的原生功能 + 离线存储。前端
有些团队使用SPA框架来模拟native的原生页面切换,但SPA也有本身的弊端,随着业务的复杂,颇有可能让WebView的负担愈来愈大,并且作到这一点须要开发者有足够的时间和精力。java
对攻击防不胜防,浏览器下的js是很是灵活,能够对Dom和Bom随意操做,能够随意跳转,能够动态执行等等。web
因此,微信可否解决之上的问题呢,微信的页面是否能作到如下:小程序
这就是小程序。api
小程序若是想解决以前纯网页技术的一些问题,必需要作一些新的尝试浏览器
要达到快速的加载和流畅的体验,是否是直接基于微信的客户端开发就Ok了呢?但这有个问题,这么作意味着小程序的代码须要和微信客户端代码一块儿发布,这种节奏确定没法知足的。安全
RN虽然用javascript解释执行,但渲染方面仍是Native渲染,其实RN能解决加载和渲染的问题,但它也仍然有些不足,这里引用微信官方给的缘由
纯h5有不少弊端,纯Native又不可能知足发版的需求,RN又不是很成熟,因此最终微信在面对本身的技术生态下对小程序的选型仍是Hybrid,界面由成熟的Web技术渲染,逻辑由成熟的Js解析和执行,再加上微信Native提供的原生能力。但要实现之上所说的需求,小程序仍是须要基于Hybrid作突破。
双线程:小程序的逻辑层与渲染层是分开两个线程, 逻辑层的js用到Native自身的JSCore来解析和执行,而界面仍是经过WebView来渲染。通讯过程以下图(图片来自微信官方文档,侵删):
通常的Hybrid技术,WebView既作js解析和执行,还要渲染html和css,当页面比较复杂时,颇有可能出现界面的渲染等待JS的执行从而形成白屏现象,咱们用双线程能够下降Webview的负担,在复杂的页面交互里能够并行js执行与界面渲染。 另外Native的Jscore仅仅只是实现了ECMAScript标准,它不像浏览器还须要实现DOM与BOM,因此在小程序里经过js没法操做dom,没法使用BOM,这也在必定程度上解决了安全和管控的问题。
如上所说,小程序的javascript是由JSCore来实现ECMAScript,除了这个以外小程序还提供了一个框架和一系列api,这些底层的升级是与微信客户端的升级同步的。
(图片来自微信官方文档,侵删):
总结
微信页面以及小程序的技术体系其实与大多数公司一致,但微信作为一个平台会将安全与性能作到极致,虽然大部分公司不须要作到微信这种平台体量,但它的技术演进仍是能给咱们不少借鉴,好比咱们能够也用多个WebView吗?咱们也能够用双线程吗?咱们也能够作WebView预加载吗?咱们也能作微信开发者工具吗?接下来咱们也会渐渐结合咱们自身的业务场景继续和你们分享。
因为第一篇为了给后面的知识内容作些准备,因此用到了微信官网的一些内容和图片,特此说明,侵删。
参考文献:小程序开发指南
如想阅读更多文章,能够关注咱们的微信公众号:大前端工程师