前几日做者在掘金上看到了【微信小程序性能优化】这篇文章,当时心想这个团队作的事情和咱们方向很类似,仔细一看原来是微信公开课上小程序专场中“小程序性能优化”模块的记录,而其中咱们提出的建议(独立分包)也即将发布。借着这个机会,咱们也决定把在扫码付小程序中的一些优化实践分享出来。前端
美团扫码付小程序是一款面向C端消费者推出的线下收单业务。它寄托在美团小程序下,在实际场景中,用户先使用微信扫一扫扫描商家二维码,接着调起扫码付小程序,进入支付页后输入金额向商家完成商品支付。json
咱们一直在作一件事情:提高扫码付小程序的支付转化率。这里所提的支付转化率指:整个业务流程中用户成功支付到扫码的占比。支付转化率与扫码付业务来说,百分比越高,扫码付业务的营业额收入越高,带来的收益是成正比的。而这部分转化率流失的影响,咱们认为包含两个部分:小程序
在扫码到进入小程序环节,微信会完成小程序基本信息获取、资源准备(代码下载或更新)等准备事项,在准备事项中若准备失败或时间过长会致使用户手动离开,这部分由微信控制的环节称之为外部环节;在进入小程序到支付环节,页面会进行渲染、数据请求等,若是渲染时间长、数据请求时间长也易致使用户手动离开,而数据请求失败也会形成用户使用流程终止而离开,这部分由咱们本身控制的环节称之为内部环节。微信小程序
对于小程序开发者而言,扫码到小程序调起这个环节是黑盒的,咱们没法得知此处的细节。而咱们在扫码付小程序中尝试和微信的同窗作了一次梳理,发现扫码付小程序在外部环节的丢失率较高,查询数据发现其中大部分用户手动点击了右上角的退出。从业务出发,用户使用扫码付能够认为用户是有强需求进行支付,可以形成用户手动点击退出的行为部分缘由可能来自于等待时间较长,而在这个环节对时间形成影响更多的是资源准备,即小程序代码下载或者更新的行为。缓存
影响下载和更新时间可能的因素有:性能优化
用户网络是咱们没法控制的,只能尝试从代码包开始下手。而在当时未使用分包的状况下,咱们的主包大小约3M,意味着新用户和无缓存小程序用户均须要在首次使用时等待下载3M左右的包大小,在这种状况下虽然用户享受了小程序离线缓存包的福利,却丢失了大部分新用户的体验。因而咱们尝试从包代码大小作了一些优化:微信
在作了这些事情后,扫码付分包从原先的整包3M缩减到了361k(主包300k+分包61),而外部环节的转化率也提高了3%。虽然转化率提高了,但前置环节的转化率仍然有部分丢失,理论上继续缩减300k的主包能有效提高,但因为业务性质的缘由没法再继续缩减,因而咱们向微信小程序提出了独立分包的概念:用户在使用独立分包时无需下载主包。经过独立分包加载,程序使用期间下载更新阶段只须要加载61k的分包大小,目前这个功能还在内测阶段,扫码付小程序也在做为第一批的内测用户进行体验,优化效果在以后的实践中咱们也会分享出来。网络
在进入小程序到支付这个环节,属于咱们的业务流程。在这个环节中的转化率丢失虽然是咱们能掌控的,但咱们并没有头绪,因此咱们作了一些数据监控来寻求方法:app
异常监控。页面的任何异常均可能致使支付页面的渲染失败,从而没法正常支付。咱们对页面的接口异常、微信API异常进行了监控。接口异常可在API(wx.request)的fail函数中直接捕获,从而上报监控;对于接口超时,则只能经过全局的app.json进行全局设置(默认60s,时间过长,对用户体验较差),此前咱们曾尝试在小程序中设置全局的5s请求超时,但实际应用中并不是全部场景须要设置统一的超时,最终咱们单独封装了接口请求超时。微信API的异常经过微信的一些fail中进行监控便可。函数
性能监控。小程序内部转化环节中关注进入小程序后的白屏时间和可交互时间。内部白屏时间从onLoad处打点,到页面onReady处结束;内部可交互时间从onLoad处打去kjnpl0o09o0点,到页面数据请求结束后的可点击支付时间截止。
平常监控中,咱们也发现了一些问题,例如接口调用超时、接口调用失败,这些问题会致使页面流程终止。针对这些问题,作了一些优化:
对于这两类异常,在接口超时、调用失败时采起重试。而为了不在极端状况下服务端流量陡增、峰值倍数增长,页面的可重试次数会在前置获取全局配置时根据“可重试次数”控制,而且每次重试须要在一段时间后用户手动触发。超太重试次数时,则流程终止。
前面咱们也提到,对于小程序开发者而言,扫码到小程序调起这个环节是黑盒的,咱们开发者没法得知此处的细节,因此说在监控外部环节这方面咱们开发者彷佛可作的事情屈指可数。可是,不知道细心的同窗有没有发现,微信在每次扫码后会给咱们在query参数上附带一个scancode_time字段。其实这个字段表示的是用户在使用扫一扫时微信服务端记录的时间,因此基于这个字段的考量,咱们作了以下尝试,针对如下两个参数值分别作了实时监控:
Tips:因为客户端的时间戳是获取本地手机系统的时间,可能存在差别。因此为了保证上报的准确性,咱们在每次onLoad的时候取了一次咱们服务端的时间,记录了客户端的时间与服务端的一个时间差额,而且在后续全部涉及到服务端的时间都参照这个时间差额作计算(网络100-200ms级别的传输时延暂可忽略)
但因为咱们扫码付小程序的特殊应用场景就是为了保障用户进行快速可靠的支付,既然在外部环节可控度不高,那是否是能够考虑在内部的业务流程方面把监控统计作的细粒度一点,作到能对每个可能影响到支付的环节有数据可循呢?因此咱们针对这个方向,区别于传统的pv、uv统计,对业务上报作了以下分类:
基于上述方案的探索,咱们小组基本上作到了对可能影响支付环节的某些业务指标的把控。从而在下一步,能够针对每一个潜在的可优化点作进一步思考与考量,做出及时的策略优化与更新。
经过对扫码付小程序的探索,咱们积累了比较宝贵的优化经验,不过对于能优化的方面,还须要咱们更进一步探索,距离咱们的目标还很远。固然若是你有兴趣,咱们更但愿你能加入咱们,一块儿探索将来。因此这里呢也打个广告,对咱们“智能支付大前端团队”有兴趣的同窗可直接简历发送给陈小二同窗(chenyao05@meituan.com)。