Skip to content

参考

基于微前端 2026 生态 · 核于 2026-07

速查

  • 本页汇总六张表:JS 沙箱四代路线 / CSS 隔离四路线 / 通信五模式 + postMessage 安全清单 / 依赖共享三路线 + MF shared 键 / 预加载形态 / 机制×框架映射
  • 沙箱一句话谱系:快照(diff window、单实例)→ Proxy(fakeWindow、多实例)→ with + Proxy(拦自由变量、有查找税)→ iframe(物理隔离);ShadowRealm 停在 Stage 2.7 前瞻位
  • CSS 隔离一句话谱系:Shadow DOM(双向隔离、弹窗逃逸)→ 属性改写(@keyframes/@font-face 不支持)→ 样式表劫持(只管子应用之间)→ 命名约定(零运行时)
  • 通信一句话谱系:URL(页面级状态)→ props / CustomEvent(单向)→ 发布订阅(全局态克制用)→ utility module(显式契约首选)→ postMessage(跨域 iframe 唯一正门)
  • 依赖共享一句话谱系:import maps(集中裁定、Baseline 2023-03)vs MF shared(运行时协商、singleton 最高版本获胜)vs 不共享(Fowler:未必更慢);同一依赖勿混用两条路线
  • 预加载一句话谱系:资源预拉(qiankun prefetch)→ 实例化 + 预执行(wujie)→ 保活(内存换秒开);MF version-first 是隐性全量预拉
  • postMessage 安全七条(发送 targetOrigin 精确、接收 origin 白名单、语法校验、不滥挂监听、纯数据协议、event.source 回信、MessageChannel 专线)见第三节检查单
  • 读机制×框架映射表的姿势:纵向空格是定位不是缺陷(single-spa 只编排、MF 只共享),横向代表只到机制层——完整 API 进各框架叶

一、JS 沙箱路线对比表

维度快照沙箱Proxy 沙箱with + Proxyiframe 沙箱ShadowRealm(前瞻)
隔离原理mount/unmount diff window 恢复fakeWindow 写时隔离作用域链首站换成代理浏览器原生独立 window语言层独立 globalThis + intrinsics 副本
多实例✗(共用真 window)
拦截隐式全局(顶层 var✗(事后才清)✓(天然独立)✓(真隔离)
history/location 隔离✗(需额外处理)✗(需额外处理)✓ 原生无 DOM 概念
性能特征切换全量遍历 ×2读写过 Proxy 陷阱每次变量查找过 has/getwith 不可优化无查找税;iframe 实例成本同步调用、共享引擎
ESM 子应用兼容差(依赖全局导出)✗(with 与严格模式互斥)✓(iframe 原生执行)✓(importValue 原生模块)
兼容性门槛无 ES6 依赖Proxy(不可 polyfill)Proxy + 非严格语境需 WebComponent 容器配套Stage 2.7,无生产实现
路线代表qiankun 降级态(IE,强制 singularqiankun proxySandboxmicro-app 默认沙箱wujie;micro-app 可选模式TC39 提案
典型坏法双实例互吞状态this 绑定(Illegal invocation)、副作用需专项收集xxx is not defined、性能劣化micro-app 的 src 同域坑(empty.html / window.stop()拿「即将可用」做排期

详见 JS 沙箱谱系

二、CSS 隔离四路线表

维度Shadow DOM属性前缀改写动态样式表劫持命名约定
隔离方向双向(进不来出不去)单向(防泄漏不防入侵)时间维度(防残留/互踩)预防性(防撞名)
执行者浏览器原生框架运行时改写选择器框架劫持 appendChild 记账构建工具 / 团队纪律
穿透/盲区继承属性、CSS 变量、dir/lang 穿透(主题通道);弹窗挂 body 样式全丢@keyframes/@font-face/@import/@page 不支持;弹窗选不中主应用样式不管辖(需自治:antd 改 @ant-prefix + ConfigProvider第三方全局样式、不守约的队友
运行时成本低(原生);adoptedStyleSheets 一份表喂多树每条规则解析改写劫持 + 账本
路线代表qiankun strictStyleIsolation、wujie/micro-app 容器qiankun experimentalStyleIsolationqiankun 沙箱默认(「自动隔离微应用之间的样式」)BEM / CSS Modules / CSS-in-JS(Fowler 立场)

落地三层叠:命名约定打底 → 框架运行时兜底 → 主应用自治。详见 CSS 隔离

三、通信五模式表

模式方向耦合物跨域 iframe甜区典型坏法
props 下行主→子props 形状契约登录态/主题/回调下发;CE 形态走 attributeChangedCallback万能 props 袋
CustomEvent 上行子→主事件名 + detail 结构广播领域事实(team-x: 前缀命名)无前缀撞名、当请求-响应用
发布订阅/全局状态多↔多状态字段隐式约定少量全局态(initGlobalState 型 / EventBus)事件满天飞、卸载不 offGlobalStateChange
URL 即通信多↔多路由结构(公开契约)页面级状态、深链接(Fowler:倒逼忠实建模)敏感数据进 URL
utility module调用方→模块显式导出 API共享逻辑/请求缓存(single-spa 首选;反对全局 Redux)演化成全局 store
postMessage双向消息 schema + origin 白名单✓ 唯一正门跨域 iframe 集成targetOrigin: "*"、不校验 origin

postMessage 安全检查单(MDN 一手):

#检查项要点
1发送端 targetOrigin精确 origin,绝不 *;省略默认 "/"(仅同源)
2接收端 event.origin白名单校验;它是发送时刻的 origin,不代表窗口现状
3消息语法校验身份过了还要验 schema——对方的洞会顺通道变成你的 XSS
4监听器策略不期望收消息就不挂 message 监听(万无一失)
5数据形态结构化克隆:函数/DOM 节点不可传、类实例原型丢失
6回信event.source.postMessage(reply, event.origin)
7高频升级MessageChannel 转移 port2 建专线;transfer 对象转移后原端不可用

详见应用间通信

四、依赖共享三路线表

维度externals + import mapsMF shared不共享
协商时机部署时(改 map 即发布)运行时 semver 协商
裁决者map 维护者(集中)share scope 内最高版本参与者各应用
多版本共存scopes 按引用者路径指派非 singleton 各用各的天然
标准化程度Baseline Widely available(2023-03)MF 运行时私有协议
构建工具产 ESM + externals 即可需 MF 支持(webpack/Rspack/官方 Vite 插件)任意
失败模式map 指错 → 全页同错(好排查)版本漂移、意外版本获胜重复下载
立场代表single-spa(大库共享、小库各自带)Module FederationFowler(独立编译自带 code-split)

MF shared 关键键速查(机制层;插件配置细节见 webpack 深入):

默认语义与坑
singletonfalsescope 只留一份;版本冲突最高版本获胜、低版本方警告——实际版本由页面最高版本参与者决定
requiredVersion取自 package.json可接受范围;不满足警告后照用可用版本
strictVersion有 fallback 且非 singleton 时 true不满足即拒绝:有 fallback 用 fallback,import: false运行时抛错
eagerfalse打进入口同步可用;入口膨胀、提供模块必下载
import键名本地 fallback 来源;false = 只消费不提供 fallback
shareScope / shareKey'default' / 键名作用域名 / 查找键——双端必须一致
shareStrategy'version-first'初始化拉全部 remote 保版本最优(离线 remote 启动即炸);'loaded-first' 按需、容错好
尾斜杠 'react-dom/'前缀匹配全部子路径;漏写 = react-dom/client 本地副本 → 双 React DOM、hydration 报错

import maps 键速查(MDN 一手):imports(裸说明符→URL;尾斜杠前缀匹配、最具体键优先)、scopes(按引用者路径分域→同页多版本;最具体 scope 优先逐级回退)、integrity(模块级 SRI);必须先于一切模块加载声明、不能 src 外链;多 map 合并时先注册者优先。禁忌:同一依赖勿混用 import maps 与 MF shared。详见依赖共享三路线

五、预加载形态表

形态提前做到哪一步触发时机代价代表
资源预拉 prefetch: true下载进 HTTP 缓存首个子应用 mount 后带宽qiankun 默认
资源预拉 'all'同上,全量主应用 start()抢首屏带宽qiankun
资源预拉 string[] / function同上,定向/两级(criticalAppNames + minorAppsName首个 mount 后 / 自定义可控qiankun
预加载 preloadApp下载 + iframe 实例化手动 / requestIdleCallback内存wujie
预执行 exec下载 + 实例化 + 执行渲染(类 SSR 体验)预加载阶段主线程 + 内存wujie
保活 keep-alive切走不销毁,回访秒开常驻内存常驻(须设上限)wujie
version-first 隐性预拉初始化拉全部 remote entry(为版本协商)应用启动启动网络放大、离线脆弱MF 默认

性能代价四连背诵:重复运行时(n 份 React)、共享 → 构建耦合回潮、请求瀑布(MF 2.0 公告点名)、沙箱运行时税。详见预加载与性能代价

六、机制×框架映射表

机制single-spaqiankunwujiemicro-appModule Federation
JS 沙箱不提供快照(降级)/ Proxyiframewith + Proxy / iframe 可选不提供
CSS 隔离不提供Shadow DOM / 属性改写 + 样式表劫持WebComponent 容器元素隔离 + 样式隔离不提供
加载方式生命周期协议 + import mapsHTML entry(import-html-entry)HTML entry → iframe/容器HTML entry(CustomElement 触发)remoteEntry / mf-manifest
通信utility module importprops + initGlobalStateprops / window.parent / EventBus属性 setData + 事件直接 import 共享模块
依赖共享externals + import maps无内置无内置无内置shared 协商
预加载prefetch 四形态预加载/预执行/保活资源缓存version-first / manifest 预载
ESM/Vite 子应用✓(本就 ESM 工作流)✗(2.x 结构性不支持)✓(iframe 原生执行)iframe 模式 ✓✓(官方 Vite 插件)

各框架完整 API 见框架叶:single-spa / qiankun / wujie / micro-app / Module Federation

权威链接

相关页