根本原因是webview对静态资源强缓存且忽略http头,vue.config.js加时间戳后缀(含filename/chunkfilename)并配合服务端禁用index.html缓存最有效。

为什么H5在移动端WebView里总加载旧JS/CSS
根本原因是浏览器或WebView对静态资源(index.html、app.js、chunk-vendors.css)做了强缓存,而你没主动打破它。尤其在微信、钉钉、企业微信等容器中,WebView缓存策略更激进,甚至忽略部分HTTP头。单纯改代码、重新打包,用户点开还是旧版本——因为URL没变,浏览器直接从本地磁盘读取了缓存文件。
vue.config.js里加时间戳后缀最有效
这是目前实操中成功率最高、兼容性最好的方案,核心是让每次打包生成的JS/CSS文件名都不同,强制浏览器当作新资源请求。
- 只对H5平台生效:
process.env.UNI_PLATFORM === 'h5'判断必须加,否则App端也会被影响 - 后缀要带点:
Timestamp = '.' + new Date().getTime(),不是+拼接数字,否则可能被CDN或代理截断 - 必须同时改
filename和chunkFilename,否则异步模块(如路由懒加载)仍走缓存 - 别只改JS:CSS同样要处理,用
VUE_APP_INDEX_CSS_HASH变量配合template.h5.html中引用
示例关键段落(放入vue.config.js):
if (process.env.UNI_PLATFORM === 'h5') {
const Timestamp = '.' + new Date().getTime()
module.exports.configureWebpack = {
output: {
filename: `static/js/[name].[contenthash:8]${Timestamp}.js`,
chunkFilename: `static/js/[name].[contenthash:8]${Timestamp}.js`
}
}
}
index.html本身也得防缓存
index.html是所有资源的入口,如果它被缓存,哪怕JS/CSS文件名变了,页面首次加载时仍会执行旧HTML里的旧引用路径——导致新文件根本不会被请求。
- 不能只靠meta标签:
<meta http-equiv="Cache-Control" content="no-cache">在iOS WKWebView和部分安卓WebView里基本无效 - 必须服务端配合:Nginx/Apache配置
index.html响应头为Cache-Control: no-cache,且禁用Expires - 更稳妥的做法是给
index.html加版本参数,比如index.html?v=20260618,通过构建脚本自动注入或后端重定向
注意:微信公众号内嵌页还额外要求后端做跳转中间层,前端单靠改HTML无法绕过微信的二级缓存。
上线后验证缓存是否真失效
别信“我清了缓存”这种说法,真实环境要用工具确认:
- 打开Chrome DevTools → Network → 刷新页面 → 看
index.html响应头是否有cache-control: no-cache,状态码是不是200(不是304) - 检查
app.js等文件的URL是否含时间戳,比如app.abc12345.1718698234567.js - 在真机上用Safari远程调试(iOS)或Chrome inspect(Android),看Network里资源是否全部来自网络而非disk cache
最容易被忽略的是:服务端CDN或反向代理(如Nginx)可能自己缓存了index.html,即使你前端配了no-cache,也要去CDN控制台手动刷新该路径或关掉HTML缓存规则。











