codecamp

支付宝小程序扩展能力 白屏解决方案

名词解释

小程序白屏

顾名思义,小程序白屏就是指小程序页面无任何内容,完全空白。技术上说就是页面无任何 view/dom 节点。支付宝框架会在 6s 的时候判定一下页面的节点状态,如果无 view/dom 节点,则判定为白屏。

img

接口依赖

小程序提供了 my.httpRequest、my.request 等网络接口,方便开发者从服务端动态获取数据。如果页面在网络接口未返回数据之前,页面一直是白屏状态,则认为页面存在网络接口依赖。同理,getAuthCode 其实也是需要经过服务端调用才返回结果的,如果页面依赖 getAuthCode,也可以认为是网络接口依赖。再延伸一下,只要在接口结果返回之前,页面是白屏的,则可以说页面存在接口依赖。接口请求耗时多长,页面则白屏多长。常见的耗时较多的接口有 my.httpRequest、my.request、my.getAuthCode、my.getLocation。

分析白屏原因

白屏产生的几个原因,特别是活动期间,业务流量突增,服务端响应较缓慢甚至无响应,大量接口超时,资源无响应,更容易放大白屏问题。

  1. 接口 API 超时等异常。
  2. getAuthCode、getCurrentLocation 等 jsapi 超时等异常。
  3. jserror 异常。

接口 API 超时

如果一个页面最开始是全白,通过 my.httpRequest、my.request 等接口 API 请求获取数据后才开始展示内容。这个页面就有了网络依赖,是否白屏就会受网络波动影响,而网络环境并不是100%稳定的。事实上,因用户环境、运营商、网络节点等抖动,接口会有一定概率请求失败、超时。通常这个概率会在 1% 以上,因此,追求低白屏率,就需要去除网络依赖。比如启动中加载一部分数据,或做接口缓存,优先从缓存中读取,异步后台刷新。

img

getAuthCode、getLocation 等 jsapi 超时等异常

getAuthCode 事实上也是网络接口,接口成功率受网络抖动影响,白屏原理同网络接口超时。getLocation 是获取定位的接口,定位一般有三种方式:GPS、基站定位、网络定位。极端情况下,定位也会较长时间才返回结果,并且这类接口还需要用户授权才能真正执行,这种情况下接口耗时还需加上小程序启动到页面授权弹窗及用户选择确定或取消的时间。

img

jserror 报错

网络接口返回数据后,业务要经过一层逻辑处理,比如接口中某个字段是页面渲染必须的,但是某些异常情况下该字段并未返回,此时页面就可能是白屏。

img

接口超时白屏解决方案参考

  • 页面能提前展示的尽量提前展示,接口缓存到本地供下一次使用。
  • 页面没内容情况,接入如下 通用的骨架屏 来避免 loading 过程中界面白屏,且提升了用户体验。

Step1 安装

npm install ant-skeleton --save

Step2 代码中引用

在页面 json 中文件中进行注册

{
  "usingComponents": {
    "ant-skeleton":"ant-skeleton/components/skeleton/skeleton"
  }
}

在 axml 文件中进行调用

<view>
  <ant-skeleton a:if="{{ isLoading }}"/>
  <view a:else class="content"/> 
</view>

详情请参见 自定义组件

接入效果展示

img

支付宝小程序扩展能力 附录 3:性能调试工具
支付宝小程序扩展能力 页面访问受限解决方案
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

支付宝小程序开发文档

支付宝小程序 快速示例

支付宝小程序 小程序快速示例

支付宝小程序 框架

支付宝小程序 组件

支付宝小程序组件 基础组件

支付宝小程序组件 无障碍访问

支付宝小程序 扩展组件

支付宝小程序扩展组件 UI组件

支付宝小程序 API

支付宝小程序 开发工具

支付宝小程序 云服务

支付宝小程序 Serverless

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }