离线包更新后白屏,怎么排查?
我们 App 用 WebView 加载本地离线包,但最近一次发版后,部分用户更新完打开就白屏,控制台也没报错。
我试过清除缓存、重新下载离线包都不行。奇怪的是开发环境和测试包都正常,只有线上正式包有问题。是不是资源路径没对上?
离线包解压后结构是这样的:
offline/
├── index.html
├── static/
│ ├── js/app.js
│ └── css/app.css
└── config.json
而 index.html 里引用的路径是相对路径:<script src="./static/js/app.js"></script>,这样应该没问题吧?
首先,相对路径 "./static/js/app.js" 本身没问题,但问题很可能出在打包配置上。开发测试正常线上不行,基本就是构建产物和离线包打包流程不匹配。
几个可能的原因:
第一,看下打包工具的 publicPath 配置。如果你用的是 webpack 或 vite,默认 publicPath 可能是 "/" 或者空,但离线包加载时 webview 的根路径可能不是根目录。比如你 webview 加载的是 file:///data/data/xxx/offline/index.html,但 js 引用的是 ./static/js/app.js,浏览器会从 index.html 所在目录去找,这其实是对的。但有时候打包工具会在前面自动补路径,导致找不到。
第二,检查打包后 js/css 文件名是否带 hash。如果带了,每次发版文件名都变,但你离线包里的 index.html 引用的是旧名字。线上发版时离线包是新的,但 webview 可能缓存了旧的 index.html 或者加载顺序有问题。
第三,也是最可能的:你的离线包解压后到底放在哪,webview 加载的路径是什么。很多 App 离线包解压路径和 webview 加载路径不一致,比如解压到 /xxx/offline/,但 webview 加载的是 /xxx/offline/index.html,然后 static 目录实际在 /xxx/offline/static/,你引用的 ./static/ 能不能正确找到取决于 webview 的 baseURL 设置。
排查方法很简单:在白屏页面随便打个断点或者让客户端同学把 webview 的 URL 打印出来,看看到底加载的是什么路径。然后你本地模拟一下这个路径能不能访问到资源。
如果还不行,把你的打包配置(webpack.config.js 或 vite.config.ts)贴出来,我帮你看看 publicPath 那块。