微前端应用隔离时子应用样式被污染怎么办?

设计师新玲 阅读 324

我在用qiankun做微前端时,发现父应用的全局样式影响了子应用的组件显示,比如子应用的按钮样式突然变成红色,但它的Less文件里没定义这个颜色。

尝试过在子应用配置里开启sandbox:sandbox: { styles: true },但问题依旧存在。子应用入口文件有加Vue.config.productionTip = false,也不行…

父应用的main.js里有引入全局样式:

#app button { 
  background: red !important; 
  font-size: 1.2em;
}

子应用的按钮类名是.unique-btn,但渲染后还是被父应用的#app button样式覆盖了,这该怎么彻底隔离样式呢?

我来解答 赞 5 收藏
二维码
手机扫码查看
2 条解答
A. 朝炜
A. 朝炜 Lv1
这个问题我太熟悉了,qiankun的 sandbox.styles 其实只隔离 JS 的全局变量和事件,对 CSS 的隔离是弱鸡,根本挡不住你这种带 #app button 这种高优先级选择器的全局样式。

首先得知道:CSS 的作用域不是靠框架自动隔离的,尤其是你父应用用了 #app button 这种带 ID 的选择器,权重太高了,子应用根本扛不住。

靠谱做法有两个方向:

一是改父应用的样式写法,别用 ID 选按钮这种野路子,换成类名限定,比如 .app-root button,然后配合子应用加一个 unique 的前缀容器,比如把整个子应用挂到
上,父应用的样式写成 .app-root button 就不会影响子应用,除非你子应用自己也用了 .app-root,但一般不会这么干。

二是用 CSS 沙箱插件,比如 qiankun 官方推荐的 sanitizeStyle 或者社区的 qiankun-css-isolation 插件,这类插件会在子应用挂载时,自动把子应用的样式包裹一层唯一前缀的