要查看微前端子应用原始html,需绕过nginx反代直连子应用服务(如curl http://subapp-service:8080/index.html)或解压构建产物dist目录中的index.html;二者均不含反代注入的base标签和路径前缀,能真实反映子应用初始资源路径假设。

直接用浏览器“查看网页源代码”看到的是反代后、已注入 base 标签和资源路径修正逻辑的 HTML,不是微前端子应用原始 entry;要还原真实结构,得绕过代理层或从源头抓取。
用 curl 或 requests 绕过 Nginx 反代直连子应用服务
反代层(如 Nginx)通常会对 HTML 做 sub_filter 替换或注入 <base>,导致你看到的 HTML 已被改写。想看子应用部署时的原始 entry,就得跳过代理,直连子应用自己的 HTTP 服务端口(比如 http://localhost:8080 或内网地址)。
- 确认子应用是否暴露了独立服务:查构建产物中
index.html的实际来源,不是/app1/index.html,而是http://subapp-service:8080/index.html - 用
curl -s http://subapp-service:8080/index.html获取未被代理修改的原始 HTML - 若子应用用 Webpack/Vite 构建且设了
base: '/',那原始 HTML 里所有script和link的src/href都是绝对路径(如/assets/index.abc123.js),和反代后带前缀的路径(/app1/assets/...)明显不同 - 注意:该方式要求子应用服务可直连,生产环境常禁用——此时只能靠构建产物本地解压分析
从构建产物中提取未注入 base 的原始 index.html
微前端子应用打包后生成的 index.html 是最接近“真实结构”的静态快照,它不含运行时注入的 <base href="/app1">,也没被 Nginx 的 sub_filter 替换过路径。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 找到子应用 CI/CD 流水线产出的 dist 目录或 tar 包,解压后定位
index.html - 检查里面是否有
<base>标签:没有,说明这是原始结构;有,说明构建时就固化了 base(应避免) - 对比 script 标签:
<script src="/assets/index.js"></script>是原始写法;<script src="/app1/assets/index.js"></script>是反代后结果 - 这个文件能准确反映子应用对资源路径的初始假设,是调试路径错位问题的第一手依据
在浏览器 Elements 面板中识别被反代注入的结构痕迹
即使看不到原始 HTML,也能通过 DevTools 快速识别哪些节点是反代层加的、哪些是子应用自己渲染的——关键看 <base>、data-micro-app 属性和资源 URL 前缀。
-
<base href="/app1">几乎肯定是主应用或 Nginx 注入的,原始子应用不会自带 - 所有
<script></script>和<link rel="stylesheet">的src/href如果以/app1/开头,基本是sub_filter或主应用 runtime 补全的 - 子应用容器节点(如
<div id="subapp-root" data-micro-app="app1">)是主应用挂载时插入的,不在原始 HTML 中 <li>右键该容器 → “Copy outerHTML”,粘贴出来就是子应用运行时的真实 DOM 结构(含 Shadow DOM 内容,如果用了的话)</li> <h3>用 DOMParser 解析并剥离反代干扰内容</h3> <p>当需要程序化提取“子应用视角”的结构(比如做自动化校验或快照比对),不能直接用 <code>document.documentElement.outerHTML,因为里面混着反代注入的 base、meta、script。- 先用
fetch('/app1/index.html')拉取当前页面 HTML 字符串(仍是反代后的) - 用
new DOMParser().parseFromString(html, 'text/html')解析成文档对象 - 手动移除
doc.head.querySelector('base')和所有带data-micro-app-injected的节点 - 只保留
doc.body.innerHTML和doc.head.querySelectorAll('script[type="module"], link[rel="stylesheet"]')中非反代注入的部分 - 这样得到的结构更贴近子应用“认为自己该长什么样”的预期,适合用于沙箱加载前的预处理
真正难的不是拿到 HTML 字符串,而是区分哪部分来自子应用构建产物、哪部分是反代或主应用动态加的——尤其当
sub_filter和 runtime 路径补全都存在时,base 标签可能被写两次,script src 可能被改三次。盯住location配置和子应用构建配置的 base 一致性,比任何解析技巧都管用。 - 先用










