在做Hybrid app的热更新时,我改了页面按钮的CSS样式,但新样式完全没生效。之前用vue-hotreload-api能更新JS,但CSS怎么都不行。
我尝试过清除缓存、检查网络请求发现新CSS确实被拉取了,但页面还是显示旧样式。比如这个按钮样式:
.button {
border-radius: 8px;
background: #4CAF50;
}
新版本改成了border-radius:16px,颜色#2196F3,但页面还是显示老圆角和绿色。重启app也没用,是不是需要额外处理样式注入?
首先确保你的webview开启了缓存控制,在加载url时加上时间戳参数:
如果还不行,试试暴力点的方法 - 直接操作style标签:
注意安全:动态注入CSS时要做好内容校验,防止XSS攻击。建议限制只允许修改特定class。
还有个骚操作是在CSS文件名加hash,比如
style.12345.css,每次更新都改这个hash值强制浏览器重新加载。最后检查下是不是CSS选择器优先级问题,有时候不是没加载而是被更高优先级的样式覆盖了。可以用开发者工具看下计算后的样式。
Vue的hot reload api主要处理组件实例和js逻辑,对全局CSS支持不完整。你需要手动接管样式注入。
优化一下方案:在热更新拿到新CSS内容后,不要直接appendChild,而是先找到老的style标签干掉它。
比如你用link标签加载css,可以给它加个特殊id:
这样能确保旧样式被清除,避免层叠干扰。注意别用link rel=stylesheet,因为浏览器缓存太难控制,直接用style标签内联最稳。
另外检查下你的构建配置,确保extract-css-from-js是关的,不然css会被抽成单独文件,热更新时路径变了也容易出问题。