微前端子应用切换时样式冲突怎么解决?
我在用 qiankun 搭微前端,主应用和子应用都用了 Ant Design,结果切换子应用时样式互相覆盖,按钮大小一会儿大一会儿小,特别诡异。尝试过给子应用加 CSS Modules,但公共组件还是炸了。
网上说可以用 shadow DOM 或者动态插入/移除样式表,但我试了动态移除,子应用卸载后样式确实删了,可下次加载又没样式了。有没有更靠谱的方案?比如下面这样在子应用挂载时加个命名空间?
const app = createApp(App);
app.mount('#subapp-container');
// 尝试包裹一层带唯一前缀的 div?
const wrapper = document.createElement('div');
wrapper.className = 'subapp-unique-prefix';
wrapper.id = 'subapp-wrapper';
document.getElementById('subapp-container').appendChild(wrapper);
你尝试过的包裹一层带唯一前缀的 div 是个不错的思路,但光这么做还不行,还需要配合 CSS 预处理器或者 PostCSS 插件来自动生成这些命名空间。不过,如果你不想引入额外的工具,可以直接在子应用的样式文件里手动添加命名空间。
假设你在使用 Less 或 Sass,可以在入口文件里定义一个全局变量作为命名空间前缀,然后在每个样式规则前加上这个前缀。这样,所有生成的样式类名都会带上这个前缀,从而避免与其它子应用或主应用的样式冲突。
比如,你可以这样做:
然后在你的样式文件里(这里假设使用 Less):
这样编译后的 CSS 类名就会变成
.subapp-unique-prefix-button,确保不会和其他应用的样式冲突。记得在子应用挂载的时候,将整个应用挂载到那个带有唯一前缀的 div 上,就像你之前尝试的一样:
这样就能有效隔离子应用的样式,避免冲突了。希望这能帮到你,解决微前端里的这个老大难问题。