关于微前端架构(qiankun)下子系统内调用Worker报错问题处理

96 阅读1分钟

报错信息如下:

DOMException:Failed to construct 'Worker':Script at 'XXXX 某个子系统的地址' cannot be accessed from origin 'XXXX 某个主系统的地址'

如果是自己写的代码倒还好处理,但这个是引用其他的代码库引起的,所以不想从源码修改的情况下还有什么解决方案呢?

一、出现原因

web worker 有严格的同源策略限制,chrome浏览器安全机制导致,判定为跨域了

二、解决方案

方案一

把所有实现都放到主应用中,然后通过iframe获取

方案二

直接在子应用系统里添加一个无需登陆及权限验证的地址,然后内部使用iframe调用,即可避免跨域问题,这里需要注意的是子系统中调用的接口需要使用nginx转,还有接口鉴权需要token,这里通过跳转iframe url将token信息带过去并在组件调用时再次设置一次token 其中还需要用到iframe通讯

<iframe
        id="vision_gif"
        src={`${host}/xxxx?&id=${info.id}&token=${tokenUtil.get()}`}
        frameBorder="0"
        width={1200}
        height={700}
        onLoad={() => {
          window.addEventListener('message', close);
        }}
      ></iframe>

在iframe元素中使用onLoad 添加message的监听,监听函数如下

 const close = function (event: { source: any; data: any }) {
    let message = event.data;
    try {
      message = JSON.parse(message);
      //窗口取消
      if (message.type === 'modal_cancel') {
        window.removeEventListener('message', close);
        onCancel();
      }
      if (message.type === 'modal_success') {
        window.removeEventListener('message', close);
        onOk();
      }
      //保存成功
    } catch (error) {}
  };

这样就可以使用iframe实现原本同样的效果啦