qainkun 子应用更新,但是访问主应用时显示的还是旧的内容
使用qiankun时,子应用只改了一个页面里很细微的东西。比如:只改了一个文字等等。访问主应用时却还是旧的页面。清除浏览器缓存才刷新过来。即使我子应用打包时文件都有了 动态的hash生成也会出现这种问题。qiankun 微应用文件更新之后,访问的还是旧版文件。
前言:
使用qiankun时,子应用只改了一个页面里很细微的东西。比如:只改了一个文字等等。访问主应用时却还是旧的页面。清除浏览器缓存才刷新过来。即使我子应用打包时文件都有了 动态的hash生成也会出现这种问题。
qiankun官方也给了解决方案:
服务器需要给微应用的 index.html 配置一个响应头:Cache-Control no-cache,意思就是每次请求都检查是否更新。
以 Nginx 为例:
location = /index.html {
add_header Cache-Control no-cache;
}
我的解决方案
本质上是解决浏览器缓存问题:
h5的可以看看:React、vue、h5端项目避免缓存
如果qiankun给的方案依然不行,就可以试试:
子应用项目里新建一个 version.json 写上版本号(需要注意的是需要打完包部署后可以访问到的地方):
{
"sub-pdProduct": "1.0.10"
}
然后主应用 注册子应用时 entry 后面拼上版本号:
先 请求对应地址的json文件
fetch(xxx/version.json, {
method: 'GET', mode: 'cors', cache: 'no-cache'
})
.then((response) => response.json())
.then((res) => {
if (localStorage.getItem("subPbVersion") !== res["sub-multi-tabs-admin"]) {
localStorage.setItem("subPbVersion", res["sub-multi-tabs-admin"]);
}
})
.catch(function (err) {
localStorage.setItem("subPbVersion", timeStr.toString());
});
然后:
{
name: 'sub-pdProduct',
entry: xxx + "?version=" + localStorage.getItem("subPdVersion"),
container: '#qiankun-imp-wrap',
activeRule: '/#/sub-pdProduct',
},
这样做会遇到一些问题,比如 跨域。如果实在不行,也可以把所有子应用的版本号维护放到一个接口里。子应用更新了也要同步更新版本号。
我只是提供这么一个思路,具体实施需要根据自己的需求来定(目前我就是用 各个子项目维护自己的版本号,缺点是 子应用有几个就需要请求几个json,后面考虑合并到一起)。
如果不想这么麻烦,还有个方法就是 直接加 时间戳:
显而易见这个的缺点就是 每次访问时都会重新请求资源(其实我觉得这个也不会造成太大的资源浪费)
const timeStr = new Date().getHours();
{
name: 'sub-xxx',
entry: xxx "?time=" + timeStr,
container: '#qiankun-imp-wrap',
activeRule: '/#/sub-xxx',
},
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)