必须用 domparser 解析子应用 html 而非 innerhtml,因后者会同步执行脚本、注入样式、污染全局环境;需拆分为样式、脚本、模板三部分,分别经沙箱管控、动态加载和容器挂载。

直接用 innerHTML = htmlString 注入子应用 HTML 会跳过沙箱、逃逸样式、执行全局脚本,90% 的白屏和样式污染都源于此。必须用 DOMParser 解析后手动分发资源。
为什么不能直接 innerHTML = htmlString
浏览器对 innerHTML 赋值时,会同步执行其中的 <script></script>、解析 <link rel="stylesheet">、注入 <style></style>,这些行为完全绕过微前端框架(如 qiankun)的沙箱控制和生命周期管理。
- 内联
<script>console.log(window.foo)</script>会立即污染主应用window -
<style>body { margin: 0 }</style>直接生效,破坏主应用全局样式 - 弹窗类组件(如 antd Modal)默认挂载到
document.body,卸载后 DOM 和样式残留 - 子应用动态调用
document.head.appendChild(styleEl),快照机制无法捕获
如何用 DOMParser 安全解析并分发资源
核心是把 HTML 字符串拆成「可管控」的三部分:样式、脚本、模板结构,并分别走沙箱加载、动态注入、容器挂载流程。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 用
new DOMParser().parseFromString(html, 'text/html')得到完整Document对象 - 提取
doc.head.querySelectorAll('link[rel="stylesheet"], style'),缓存内容或 URL,后续由沙箱统一注入(避免重复/冲突) - 提取
doc.body.innerHTML作为纯模板字符串,挂载到子应用容器节点(container.innerHTML = bodyHTML) - 所有
<script src="..."></script>必须拦截,改用execScripts(qiankun)或fetch + eval(带沙箱上下文)执行 - 禁止保留原始
doc.head—— 子应用的<meta>、<title></title>等不应影响主应用
子应用 HTML 中的相对路径怎么处理
子应用 index.html 里写 src="./main.js",主应用 fetch 后直接解析必然 404,因为浏览器按当前页面 URL 解析,不是子应用部署路径。
- 方案一:主应用加载前重写所有
src/href属性,用new URL(attrValue, subAppEntryUrl).href转为绝对路径 - 方案二:子应用构建时设
publicPath: 'auto'(Webpack 5+),配合主应用注入__webpack_public_path__ - 方案三:子应用不写相对路径,全部用占位符如
src="%PUBLIC_PATH%/main.js",主应用替换后再解析 - 注意:
publicPath只影响资源加载,不影响路由base;二者不可混用
样式快照清理为什么总失败
快照(snapshot)只记录挂载前的 document.head 状态,但子应用运行时可能新增多个 <style></style> 标签,甚至插入到 document.body 或第三方容器中,卸载时不会自动清理。
- 主应用需在
unmount阶段主动扫描并移除所有已知注入的<style></style>,建议加data-mark="qiankun-xxx"标识 - 强制子应用 UI 库指定
getContainer或rootNode到子应用容器节点,禁用document.body挂载 - 对
styled-components/emotion等 CSS-in-JS 库,需封装 wrapper 劫持其appendChild调用,重定向到子应用容器 - 子应用自身避免使用全局选择器(如
html, body { ... }),这类规则无法被沙箱隔离
真正难的不是解析 HTML,而是确保每一步都落在沙箱边界内——从路径重写、脚本执行、样式注入,到 DOM 插入点控制,漏掉任一环,污染就不可逆。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










