qiankun 主应用与子应用跨域部署时,跨域资源加载依赖子应用服务端配置 CORS 响应头,沙箱隔离依赖主应用 registerMicroApps 配置。两者属于不同层面,跨域解决 HTTP 请求权限,沙箱解决 JavaScript 运行时与样式污染。
先说结论:跨域通信不需要特殊沙箱配置,只需确保子应用资源允许跨域加载,主应用开启沙箱选项即可隔离运行环境。
- 适合:主应用与子应用部署在不同域名或不同端口场景
- 先准备:子应用服务器配置 Access-Control-Allow-Origin 响应头
- 验收:浏览器控制台无 CORS 报错,子应用样式不影响主应用
快速处理思路
跨域问题通过 Web 服务器配置解决,沙箱问题通过 qiankun 配置项解决。先确保子应用 entry html 能跨域 fetch,再在主应用中启用 strictStyleIsolation 或 experimentalStyleIsolation。
为什么会这样
跨域加载和沙箱隔离是 qiankun 运行的两个独立环节。浏览器同源策略限制子应用 HTML 和 JS 资源的 fetch 请求,必须通过 CORS 放行;沙箱机制在资源加载完成后生效,通过 Proxy 或快照隔离全局变量,通过 CSS 规则隔离样式。
分步处理
第一步配置子应用服务器 CORS。Nginx 示例配置中添加 add_header Access-Control-Allow-Origin *;,确保主应用域名能请求子应用入口文件。
第二步主应用注册子应用。在 registerMicroApps 中配置 entry 为子应用跨域地址,activeRule 设置路由匹配规则。
第三步开启沙箱隔离。配置 sandbox 对象,设置 strictStyleIsolation 为 true 启用 ShadowDOM,或 experimentalStyleIsolation 为 true 启用样式 scoped。
第四步配置通信机制。使用 props 传递初始化数据,或调用 initGlobalState 建立全局状态通信,通信逻辑不受跨域影响。
怎么验证是否生效
打开浏览器开发者工具 Network 面板,检查子应用 entry 请求响应头是否包含 Access-Control-Allow-Origin。检查 Console 面板无 CORS 错误报错。检查 Elements 面板,确认子应用样式未泄露到主应用全局。
常见坑
子应用内部请求接口未配置 CORS,导致子应用加载后内部 Ajax 失败。主应用开启严格样式隔离后,子应用使用全局样式库可能失效。旧版浏览器不支持 Proxy 沙箱,需确认兼容性配置。
常见问题
子应用加载报 CORS 错误怎么办
检查子应用服务器响应头是否缺少 Access-Control-Allow-Origin。确保主应用域名在允许列表中,或直接设置为 * 测试。
沙箱开启后样式丢失怎么处理
strictStyleIsolation 使用 ShadowDOM 会隔离全局样式,建议改用 experimentalStyleIsolation 或检查子应用 CSS 选择器特异性。
主应用与子应用通信失效原因
检查 props 传递时机是否在 mount 之前,或 globalState 是否在双方都正确订阅。跨域不影响通信逻辑,只影响资源加载。
参考来源
qiankun 官方文档,子应用配置,https://qiankun.umijs.org/zh/guide/getting-started
qiankun 官方文档,沙箱机制,https://qiankun.umijs.org/zh/guide/tutorial#sandbox