微前端的样式隔离

在微前端架构中,样式隔离是一个非常重要的问题,否则不同子应用的 CSS 会互相污染,导致样式错乱。我们来看看 qiankun、Wujie 和 micro-app 是如何实现样式隔离的。

qiankun 的样式隔离

qiankun 是基于 single-spa 和 JS 沙箱实现的微前端框架,它提供了两种主要的样式隔离机制:

1.1 动态样式隔离

qiankun 会在子应用加载的时候,动态解析所有 <style> 标签和 <link> 标签。
使用 ScopedCSS 的模式来给所有的 CSS 选择器加上前缀,保证只作用在当前子应用的 DOM 节点下。

例如:

1
2
3
4
5
6
7
8
9
/* 原始的样式 */
.app-title {
color: red;
}

/* 经过 ScopedCSS 处理后的样式 */
[data-qiankun="sub-app-1"] .app-title {
color: red;
}

1.2 Shadow DOM 模式(可选)

qiankun 允许使用 experimentalStyleIsolation: true 开启 Shadow DOM 隔离。
样式和 DOM 被完全封装在 Shadow Tree 内,不会与外部冲突。
缺点是:Shadow DOM 内部的全局样式(如 body、html)不会继承主应用的样式。

1.3 优缺点

优点 缺点
兼容性好,不依赖浏览器特性 ScopedCSS 有性能损耗
样式污染的风险极小 动态解析样式有一定开销

Wujie 的样式隔离

Wujie 是一款轻量且高性能的微前端解决方案,内部实现更加细致。

2.1 内置 Shadow DOM 隔离

Wujie 默认开启 Shadow DOM 隔离模式。
子应用所有 DOM 都会被插入到 Shadow DOM 内部,这样主应用和其他子应用都无法影响它的样式。
这意味着:即使是全局样式(如 body { margin: 0 })也无法污染到子应用。

2.2 样式沙箱处理

除了 Shadow DOM,Wujie 还会:

  • 拦截所有 <style><link> 标签,将其作用域局限在 Shadow Root 内部
  • 支持 ::part::slotted 机制来暴露特定 DOM 样式给主应用

2.3 优缺点

优点 缺点
样式隔离彻底,不会污染外部 Shadow DOM 在低版本浏览器不兼容
无需手动处理 CSS Scope 需要 Polyfill 兼容处理

micro-app 的样式隔离

micro-app 是一款轻量的微前端框架,注重性能与隔离。

3.1 基于 Shadow DOM 和 Style Scoped

micro-app 优先使用 Shadow DOM 进行隔离,子应用的所有 DOM 节点会自动插入 Shadow Tree 中。
如果开启 disableSandbox,会降级为 ScopedCSS 处理。

3.2 ScopedCSS 隔离

如果浏览器不支持 Shadow DOM,micro-app 会自动对 <style> 标签进行解析和作用域隔离。

3.3 JS 隔离

micro-app 会自动拦截子应用的 document.styleSheets,阻止修改外部样式。

3.4 优缺点

优点 缺点
兼容性强,能自动降级处理 对复杂 CSS 动态渲染处理稍显不足
无污染且不影响外部样式 需要额外处理一些动画和动态加载样式

总结对比

框架 样式隔离方式 兼容性 隔离效果 性能损耗
qiankun ScopedCSS、Shadow DOM(可选)
Wujie Shadow DOM + 样式沙箱
micro-app Shadow DOM + ScopedCSS