qiankun快照沙箱(IE和不支持proxy的低版本Chrome)下子应用干扰主应用样式问题

问题复现场景

qiankun快照沙箱(IE和不支持proxy的低版本Chrome)下,进入子应用,f5刷新留在子应用,再点击切换到主应用的一个路由页面,此时如主应用该子页面是用代码分割懒加载加载css、js,则会发生主应用该子页样式丢失问题。

问题分析

在子应用跳转到主应用时,子应用的卸载需要一点点的时间,在这段时间内,主应用加载了,插入了 css,但是被子项目的 css 沙箱记录了,然后被移除了。父项目的事件监听也是一样的,所以需要在子项目卸载完成之后再跳转。
其实是子应用切到主应用时,要进行快照沙箱的切换(这个切换是循环遍历赋值,所以慢),切换过程需要时间,而主应用的css等资源加载在切换缝隙内,使用了子应用的沙箱机制,加载和插入到了子应用容器,js资源默认执行不受影响,因为加载后放到了内存里。

解决方案

临时解决办法:先复制一下 HTMLHeadElement.prototype.appendChild 和 window.addEventListener ,路由钩子函数 beforeEach 中判断一下,如果当前路由是子应用,并且去的路由是父应用的,则还原这两个对象。

const childRoute = ['/app-vue-hash','/app-vue-history'];
const isChildRoute = path => childRoute.some(item => path.startsWith(item))
const rawAppendChild = HTMLHeadElement.prototype.appendChild;
const rawAddEventListener = window.addEventListener;
router.beforeEach((to, from, next) => {
  // 从子项目跳转到主项目
  if(isChildRoute(from.path) && !isChildRoute(to.path)){
    HTMLHeadElement.prototype.appendChild = rawAppendChild;
    window.addEventListener = rawAddEventListener;
  }
  next();
});

方案原理

因为快照沙箱的切换慢,在切换完成前,我们想使用主应用沙箱,但是被错误使用了子应用沙箱,这是产生原因。
沙箱切换慢,也是一个过程,我们可以让我们关注的内容先切换过来。
所以,有了上述方案,改变沙箱切换内部顺序(默认循环遍历),让用到的方法提前变为父级的。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值