微信小程序和PWA对比分析


微信小程序和PWA(Progressive Web App)是目前移动端以及前端受关注度较高的两项技术。小程序自去年公测以来,国内很多公司均投入到小程序的开发中,今日头条、携程、摩拜单车等小程序纷纷在第一时间发布。从实际效果来看,小程序的用户体验普遍受到了好评,并且它可以在微信上安装、卸载和离线使用。PWA则是在传统Web应用的基础上,通过完善Web应用的一些能力,比如离线使用、后台加载、添加到主屏和消息推送等,达到用户体验提升和性能优化。两者的达到的效果相似,但实现技术上略有不同。

小程序剖析(Android)

张小龙在朋友圈披露其对小程序的定义:小程序是一个不需要下载安装就可使用的应用,它实现了应用触手可及的梦想,用户扫一扫或者搜一下即可打开应用。也体现了用完即走的理念,用户不用关心是否安装太多应用的问题。应用将无处不在,随时可用,但又无需安装卸载。从字面上看小程序具有类似Web应用的热部署能力,在功能上又接近于原生APP。

界面分析

小程序采用Web-Native混合方案。WebView渲染基本网页内容,部分块级元素如地图、视频、底部导航栏等由Native View渲染。如图所示,在Android开发者模式中打开显示布局边界选项,可以在小程序中看到所有的Native View被框线分割,而显示主体内容是一块完整的WebView。
WebView的内容通过Chrome浏览器的Inspect功能可以查看到相应的网页元素结构,代码如下图所示。

对多个小程序Inspect后,我们发现页面结构代码基本相同,分为以下几部分,对应图上的区域:
- 基础样式库
- 业务逻辑代码
- 用户自定义样式库
- 页面Dom结构

网页运行机制

小程序是Web和Native混合方案。对于Native模块的性能我们没有疑问,这里主要分析下Web性能是如果实现优化。
通过相应的抓包过程发现,每个小程序对应一个wxapkg文件,wxapkg包含小程序配置文件和已经组装好了的page-frame.html。小程序下载后,访问相应小程序,微信会解压wxapkg文件,并结合Native View展示 page-frame.html。
作为性能上重要的优化点,这里我们主要调研一下小程序网页的部分。以今日头条小程序为例,打开微信内核的调试模式,通过Chrome浏览器进行查看。

当打开今日头条后,在Chrome浏览器调试界面出现两个WebView,其中的一个WebView进行Inspect发现是当前看到小程序的页面。另一个WebView进行Inspect发现是个空白页面。

当点击第一条资讯后,WebView多了一个,资讯列表的WebView仍然在运行,并且界面不变。原先空白的WebView界面则加载了第一条资讯的详情,而新增加的WebView则是空白的页面。

当我们在资讯详情页回退到列表页时,总共两个WebView,列表页WebView显示相应的资讯列表,另一个WebView为空。
从以上的过程可以看到:
- 一个WebView只对应一个用户界面。
- 在打开当前页面后,小程序会提前新建一个WebView并进行初始化。
- 页面跳转不再是一个WebView内部的跳转,而是上升到Native View层次上的转换。
- 页面跳转时,小程序直接用初始化好的WebView进行页面展示,提高加载速度。

开发规范

下图是小程序的开发项目目录结构图。

从目录结构上看,这很类似于一个H5的WebApp,有样式库、页面结构和业务逻辑。开发目录结构与模块和路由结构相呼应。
从规范角度讲,我们从以下几点进行分析,探索相关开发规范制定的合理性。
- 基础组件
不同于传统Web网页开发,小程序开发可以使用的标签不再是

等,而是小程序限定的标签,按照功能与传统Web标签对应如下。

从界面分析那一节我们已经知道,除了媒体、地图等部分组件是原生组件,大部分组件还是网页元素,而且小程序界面最终的Dom结构也是自定义标签元素,如。

作为小程序开发者,只需要写一个。虚线部分为小程序内置的样式库,就可以实现与右边等价的HTML和CSS写法,这样开发者默认开发就相当于使用了微信的一套样式库。
CSS决定了界面的多样性,但由于浏览器内核的历史性和多样性,同样的一套CSS在不同平台上会带来一定程度的兼容性和性能问题。而微信小程序由于其平台的固定性,可以着力于完善基于固定平台的最优CSS样式库。用户采用基础组件开发,自然地继承了相应CSS的最优性能。
- 禁用浏览器Dom API
开发者不支持使用标准的Dom API开发网页,最后的渲染工作由微信端的JS库进行操作。而微信小程序采用Virtual Dom,可以减少重绘和重排的次数,提高了页面的性能。

如果Dom API暴露给用户,虽然界面的交互和操作上更丰富,但开发者对于Dom操作的随意性反而会降低页面的性能。
- 部分原生能力的API使用
微信小程序整体架构类似Hybrid架构。为了弥补Web规范和功能的局限,小程序对于原生一些功能的调用进行了JS层面的封装。

一方面,对于原生组件支持,例如视频、地图等组件,传统Web在性能上是无法与原生组件相媲美的,小程序通过组件方式进行调用。
另一方面,对于原生功能支持,例如文件上传下载、缓存、网络请求WebSocket、录音等功能,小程序通过JS函数的方式进行调用。

总之,微信小程序结合了各种优化策略。在Web层面上虚拟Dom、高性能CSS样式库,原生层面上有WebView预加载,原生模块覆盖等。虽然在开发上建立了一定的限制,但带来了整体性能上的提升。
这里我们对微信小程序从技术层面和产品层面进行了汇总,如下图所示。

PWA

(P)rogressive (W)eb (A)pps


渐进式的Web应用,WebApp大家都熟悉,那什么叫渐进式,前端的同学都了解一些概念比如” 渐进增强“ ,即在不影响主要功能的情况下,使用一些高级的CSS和JavaScript特性来提高性能或者开发效率的开发方式,PWA的P和这个想法有些类似——我可以按照常规标准来开发一个WebApp,PWA主推的能力:离线,推送,桌面访问这三个能力,本身来说都不属于一个传统WebApp的一部分,所以不会影响的主要功能的开发,而这些PWA的部分都可以在开发完这个WebApp之后单独添加。所以这就是优雅的渐进式WebApp。

ServcieWorker

在说PWA之前必须先简要PWA的核心——ServcieWorker, PWA的所提及到的所有功能都是围绕着ServcieWorker来展开,那什么是ServcieWorker:详细的解释请参照MDN或者Google Developer上面给出解释,这里先给一个大致的总结,ServiceWorker是一个单独的后台线程,不依赖于某一个WebView,它是一个Proxy,用于监听以及管理服务的请求以及返回。首先我们看一下ServiceWorker兼容性。

运行机制

ServiceWorker是运行在单独线程,在浏览器进程退出之后,ServiceWorker线程也会关闭。再次打开浏览器之后,可以通过Wake Up机制唤醒ServiceWorker线程。
PWA网页和浏览器生命周期一致,浏览器进程杀掉网页也销毁了。ServiceWorker进程在网页关闭后,如果内存足够,也不会被销毁。

PWA给用户带来的最大好处——优化用户体验

缓存机制:ServiceWorker + CacheStorage


在这之前所有的离线功能是交给Application Cache和IndexedDB,IndexedDB是一个优秀的API,但是Application Cache自诞生初期就被吐槽,其对于缓存的控制不灵活一直为人所诟病,所以更多用户选择,将静态资源响应头的max-age和expire字段设置成最大,使得缓存用不过期来达到离线效果。但是自从有了CacheStorage之后,“麻麻再也不用担心控制缓存的能力了”。因为CacheStorage + ServcieWorker简直就是控制缓存的最佳组合,CacheStorage 可以将静态资源批量或者单个导入,在ServcieWorker中对指定地址的静态资源进行监听,当ServcieWorker接收fetch事件时,开发者可以按照具体的业务需求,来制定是否使用或者如何使用缓存的策略。具体实现可以参考下图。

推送通知:Push + Notification

Notification和Push功能是绑定使用的,这里着重讲一下通知功能,首先是兼容性:

在最新的规范中以及不提倡使用New Notification()的方式了,改由ServcieWorker来接管,没错!又是ServiceWorker,请看下图:

小贴士:开发者可以在inspector下使用模拟推送来调试通知功能

推送是一个很有价值接口,并且依赖于ServcieWorker线程,所以是否能够推送成功,全都仰仗ServiceWorker线程是否存在,之前曾经提到过,ServcieWorker是运行在单独线程,在浏览器线程退出之后,ServcieWorker线程也会关闭,ServcieWorker线程在网页关闭后,如果内存足够,也不会被销毁。

桌面访问:ServcieWorker + Web App Manifest

这个功能有可能是三个功能中表面上看起来最酷炫的一个功能,首先来看一下兼容性

添加桌面图标,这个功能就算没有PWA也是可以实现的,但是目前添加桌面图标指示简单的打开网页而已,在获得HTML、JavaScript和CSS之前,页面将会呈现一段时间的空白时间,但是WebApp Manifest功能可以在这一空白时间内补上一开屏画面,从而提高用户等待期间的体验。目前该功能还是比较简陋的,对于一些稍微高级一点的需求就无法支持了,比如背景图片,动画。具体支持的定制能力请参照下图:

展望一下PWA

PWA所提供的离线访问、桌面访问、通知推送功能将原本只能通过浏览器逐级切换的在线网页体验推向了可离线访问的类Native App体验,并且提供了Web Push和Notification API,将原本只能够由Native应用才能做的事情转变为Web应用一样能够使用,配合渲染性能更加强劲的内核渲染引擎,在渲染性能上拉近与Native应用的距离,另外两大搜索巨头Google和百度对于PWA都寄予厚望,对于前端开发者来说很有理由相信OpenWeb的明天是很灿烂的。

结语


正如上文所述,两者主要都是基于Web技术,都是为了用户体验的优化,只不过实现原理不太相同:
小程序类似传统的Hybrid架构,对渲染性能要求较高的组件,通过Native 组件来实现,以弥补传统Web页面性能上的不足。另外传统Web无法访问的本地能力,需要通过JSSDK来实现。而PWA是Web能力的增强,通过提供更多的接口和规范可以让Web应用更接近Native应用。

微信小程序和PWA对比分析相关推荐

  1. 原创:去繁存简,回归本源:微信小程序公开课信息分析《一》

    以前我开过一些帖子,我们内部也做过一些讨论,我们从张小龙的碎屏图中 ,发现了重要讯息: 1:微信支付将成为重要场景: 2:这些应用与春节关系不小,很多应用在春节时,有重要的场景开启可能性: 3:春节是 ...

  2. vue与微信小程序的写法对比

    好记性不如烂笔头,学过的知识不复盘,不经常使用就会记不清楚.之前工作中一直用的vue,遇到新的项目需要做微信小程序,发现有很多相似之处,容易混淆:做个笔记对比着记更容易一些 第一.指令 vue中都是& ...

  3. JAVA开发(后端):微信小程序API调用详细分析及步骤

    关键词:微信登录.统一下单(支付).统一下单通知(回调).统一下单查询.企业付款至零钱.支付查询.获取ACCESS_Token.获取小程序二维码 因为做项目涉及到微信这些接口的调用,尽管看了很多博客, ...

  4. 微信小程序之图像智能分析

    知识: 微信前端基础.python基础.django基础 设计思路: 前端发送图片(base64格式),后端接收图片,调用腾讯云图像分析接口分析图片,将分析结果返回前端展示. 参数: image_ba ...

  5. 微信小程序日历插件对比

    今天研究微信小程序插入日历,简单的对比了三个日历插件,如下.后面详细记录日历插件的具体使用 1.名称:Okr日历 AppID:wxa3eebcbd5f0cd759 地址:https://mp.weix ...

  6. 微盟微信小程序商城运营策略分析

    微盟和有赞是微信商城领域的头部企业,也是上市企业,他们的销售额表现不错. 微盟的商业模式,核心以微信小程序为主导,建立商品管理,运输,结账,营销,培训一整套服务,专注于微信小程序,让微盟快速崛起,这也 ...

  7. 微信小程序组件解读和分析:六、progress进度条

    progress进度条组件说明: 进度条,就是表示事情当前完成到什么地步了,可以让用户视觉上感知事情的执行. progress进度条是微信小程序的组件,和HTML5的进度条progress类似. pr ...

  8. 微信小程序学习-app.json分析

    使用app.json文件来对微信小程序进行全局配置,包括页面文件的路径.窗口表现,tab菜单,设置网络超时时间等: 以下是一个简单配置: {"pages": ["page ...

  9. 公众号、小程序、App对比分析

    本文主要从功能.开发.推广.体验等多个维度对公众号.小程序.App做了对比,如下图: 1.公众号:面向营销与消息传递,适合频次低,粘性不高场景服务. a)优势: i.H5开发,支持跨平台,无适配问题, ...

最新文章

  1. hw叠加层开还是不开_HW叠加层是什么?
  2. java byte char io流_吃透Java IO:字节流、字符流、缓冲流
  3. java中redis实现篇
  4. 枚举枚举和修改“最终静态”字段的方法
  5. SharePoint 2013 开发——其他社交功能
  6. php 判断是否文件,php 判断是否一个文件的函数is_file()应用举例
  7. css transition过渡
  8. 什么是php的ast结构,什么是AST?Vue源码中AST语法树的解析
  9. C语言 如何判断一个主机是大端还是小端
  10. JAVA Swing GUI设计 WindowBuilder Pro Container使用大全7——JDesktopPane使用
  11. Spring Boot设置上传文件大小
  12. vrep系列教程(一)——熟悉vrep
  13. 静态HTML+CSS 中国高等教育学生信息网(学信网)网站
  14. 【计蒜客 A1594 --- 封印之门】floyd
  15. 什么时候需要消息队列
  16. pubwin扫描安装
  17. ArduPilot 开发环境安装
  18. 有MDF文件和LDF文件之后怎么创建数据库
  19. 项目型公司 VS 产品型公司
  20. 【经验分享】设置电脑定时开关机

热门文章

  1. 基于聚类算法的城市餐饮数据分析与店铺选址
  2. 實戰案例 - 資料對接工具程式碼重構 (2)
  3. 最近插入法和最近邻点法
  4. 相关性系数及其python实现
  5. ES5 标准对象说明
  6. LeetCode - 罗马数字转整型
  7. JCameraView 仿微信拍照Android控件(点击拍照,长按录小视频)
  8. Typecho情侣博客Brave主题源码
  9. CUDA之GPU生态系统
  10. 光环:研发云搭建及人才梯队建设——姚冬