混合App中H5白屏修复及样式兼容

白屏修复

混合 App 中 H5 首次加载出现白屏有以下可能:

  • 代码编译过长加载的渲染阻塞(白屏时间过长,结果会正常渲染)
  • 代码编译错误引起渲染失败(一直白屏)

代码编译过长加载的渲染阻塞,可以通过优化代码解决。代码编译错误引起渲染失败,就得修复代码的 BUG 了。

是什么原因引起的编译错误

通过产品反馈的结果来看,少部分用户手机进入混合 App 中 H5 首页时,出现白屏,而多数用户没有这种情况。初步确认是手机系统上的 webview 版本低导致代码不兼容,所以编译错误,渲染失败,就一直卡在白屏了。

为了进一步验证是 webview 版本过低引起的 BUG,我借用了 2 个 Android 测试机(android 4.4.4,android 12),并借助chrome://inspect/#devices 调试混合 App 中 H5,发现在 android 4.4.4 版本测试机上,代码报错,出现白屏,而 android 12 版本测试机正常,因此得以验证:混合 App 中 H5 的代码没有兼容到低版本的 webview 。

开始修复

查看该 H5 代码,很多都是 ES6 ,需要转译成 ES5,才兼容低版本的 webview。可以通过 Babel 转译,打包项目的时候转译成 ES5。Babel 配置,详见 https://www.babeljs.cn/docs/

样式兼容

低版本的 webview 需要兼容 CSS3。怎么兼容呢,CSS3 的样式属性需要加前缀 -webkit-(安卓,IOS 用的 webview 的内核是这个, 其他前缀不用考虑)。项目那么多 CSS3 样式,难道要手动都加上吗,其实可以走配置的。PostCSS 是一个允许使用插件转换样式的插件,用法详见 https://github.com/postcss/postcss/blob/main/docs/README-cn.md

相关链接

[1] 基于 H5 的混合开发介绍(一)WebView

[2] 你需要的 App 内 h5 的调试方法