webview白屏的问题查找和修复

介绍

有运营反应,有部分用户访问我们的小程序后,打开 webview 页面,显示白屏,删除小程序重新进入也未解决问题。

初步判断

这里有俩个关键点

  1. 仅部分用户出现白屏

  2. 以前是能正常访问

初步判断是代码执行的兼容性问题

顺藤摸瓜

刚巧团队内部有个同事的 iphone 7 能复现这个问题, 于是我们首先进行了 charles 抓包, 分别拿到了正常手机和白屏手机的请求, 对比发现俩者从服务端拿到的资源请求包括文件名 hash 是一致的。

webview_charles_1

到了这里我们基本可以确定不同设备上拿到的代码是一致的,出问题的是兼容性,在不同机型上渲染执行可能出错导致的白屏。

前面提到用户以前是能正常访问 webview 的,也就是在某一段时间我们的代码编译后导致的白屏.

于是我接下来的重点放到了查找问题代码,通过切换月份分支,从 5,6,7 月分别调试缩小到7月范围,然后按照 commit 减半调试缩小范围,确定了包含问题代码的 commit 记录

webview_commit_1

在多次注释更新的包后,最终确定了问题定位出在 package.json 升级的新包 @muyi086/var-type 上.

webview_commit_2

出问题的代码分析

  1. 这是老版本的代码,使用 js 实现

    ::: code-group

    :::

  2. 这是升级后新版本的代码,使用 ts 实现

    ::: code-group

    :::

对比发现 ts 的代码实现使用了单例模式,并且内部使用了defineProperty, getOwnPropertyDescriptor 等属性,这也是导致某些机型上不执行代码导致白屏的原因, 因为在编译时没有提供 polyfill 支持旧版浏览器。

解决方案

由于线上 bug 需要紧急修复,所以当前先简单处理,发布一个新的 npmjs 版本替换原先的 ts 版本, 然后紧急发版。以后有时间会优化代码,在 ts 版本上尝试修复编译导致的问题。

Last updated

Was this helpful?