webview白屏的问题查找和修复
介绍
有运营反应,有部分用户访问我们的小程序后,打开 webview 页面,显示白屏,删除小程序重新进入也未解决问题。
初步判断
这里有俩个关键点
仅部分用户出现白屏
以前是能正常访问
初步判断是代码执行的兼容性问题
顺藤摸瓜
刚巧团队内部有个同事的 iphone 7 能复现这个问题, 于是我们首先进行了 charles 抓包, 分别拿到了正常手机和白屏手机的请求, 对比发现俩者从服务端拿到的资源请求包括文件名 hash 是一致的。

到了这里我们基本可以确定不同设备上拿到的代码是一致的,出问题的是兼容性,在不同机型上渲染执行可能出错导致的白屏。
前面提到用户以前是能正常访问 webview 的,也就是在某一段时间我们的代码编译后导致的白屏.
于是我接下来的重点放到了查找问题代码,通过切换月份分支,从 5,6,7 月分别调试缩小到7月范围,然后按照 commit 减半调试缩小范围,确定了包含问题代码的 commit 记录

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

出问题的代码分析
这是老版本的代码,使用
js实现::: code-group
:::
这是升级后新版本的代码,使用
ts实现::: code-group
:::
对比发现 ts 的代码实现使用了单例模式,并且内部使用了defineProperty, getOwnPropertyDescriptor 等属性,这也是导致某些机型上不执行代码导致白屏的原因, 因为在编译时没有提供 polyfill 支持旧版浏览器。
解决方案
由于线上 bug 需要紧急修复,所以当前先简单处理,发布一个新的 npm 包 js 版本替换原先的 ts 版本, 然后紧急发版。以后有时间会优化代码,在 ts 版本上尝试修复编译导致的问题。
Last updated
Was this helpful?