single-spa 子应用切换时样式冲突怎么解决?
我用 single-spa 搭了两个子应用,一个用 Ant Design,另一个用 Element Plus,结果切换的时候样式互相影响,比如按钮样式错乱。试过在子应用里加 scoped,但好像没用,因为这些 UI 库的样式是全局注入的。
有没有办法让每个子应用的样式隔离?或者在卸载子应用时自动移除它的 CSS?现在页面越切越乱,头都大了……
// 我在子应用的 mount/unmount 里尝试手动删样式,但不知道该删哪些
export async function mount(props) {
// ...
}
export async function unmount(props) {
// 怎么清理全局样式?
}
最直接的解决方案是在子应用里给样式标签打标记,卸载时删掉。
先在子应用的入口文件这样改造:
然后在你的生命周期里调用:
不过这个方案有个问题,就是首次加载时 UI 库的样式还没打标记。我一般是这样处理:在子应用入口用 JS 动态创建 style 标签,把 CSS 内容直接灌进去,这样样式就在你掌控之中了。
更省心的办法是用现成的库。single-spa 社区有个 single-spa-css 插件,你装一下然后在子应用配置里加上,它会自动帮你管理样式的加载和清理,基本不用自己写清理逻辑。
如果还嫌麻烦,可以直接给每个子应用套个唯一的 class 前缀,然后用 PostCSS 的插件自动给所有选择器加前缀。不过这个改动比较大,Ant Design 和 Element Plus 这种级别的库改起来要谨慎。
我个人推荐先用第一种手动标记的法子,改动最小,先把问题解决了再说。