报错信息如下:
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实现原本同样的效果啦