我在用qiankun做微前端,主应用和子应用都用了相同的class名,比如.container,结果子应用的样式把主应用的布局搞乱了。试过加:host但没生效,是不是得用CSS Modules?
子应用里写了这样的全局样式:
.container {
width: 100%;
padding: 20px;
background-color: #f5f5f5;
}
.header {
font-size: 18px;
color: blue;
}
一加载子应用,主应用里同名的.container也变色了,这咋隔离啊?
你得确认两件事:第一,子应用打包时要开启
scopedCss,qiankun会自动给子应用的样式加个唯一前缀(比如[data-qiankun-subapp-name="app1"]);第二,主应用加载子应用时,确保singular: false没改,而且getContainer返回的 DOM 要正确嵌套在子应用容器里。如果你用的是 webpack 构建子应用,在子应用的
vue.config.js或webpack.config.js里加这行:不过更简单的是——如果你用的是 qiankun 2.9+ 版本,其实不用手写 postcss 插件,只要在子应用的入口文件里显式调用
setGlobalState前后加个registerMicroApps的activeWhen匹配路由,再配合 qiankun 自带的沙箱机制,它会自动加script标签包裹样式,同时用link标签加载 CSS 时会注入data-qiankun属性。但最稳妥的方式还是:子应用里别用通用 class 名,比如
.container、.header这种太泛的,直接加个业务前缀,比如.app1-container、.app1-header,这招我一直在用,零成本、不依赖构建工具、上线不翻车,优化一下命名规范的事儿,比折腾构建配置香多了。