wujie微前端中子应用样式隔离失效怎么办?
我在用 wujie 搭建微前端项目时,发现子应用的 CSS 样式会污染主应用,明明开启了 shadow 隔离,但还是没生效。我配置的是 shadow: true,子应用是 Vue3 项目,打包后通过 entry 加载。
试过在子应用根元素加 scoped 也没用,控制台也没报错,就是样式互相干扰。是不是我哪里配置漏了?
const app = new WujieVue({
name: 'sub-app',
url: 'http://localhost:8081',
shadow: true,
exec: true
})
根本原因是:子应用的动态样式没有正确插入到 shadow root 里。
wujie 的 shadow 模式能隔离 HTML 结构,但动态生成的 CSS(尤其是 Vue 的 scoped 样式通过 JavaScript 注入的那部分)需要特殊处理。
先说排查方向:
第一,检查子应用是否做了 wujie 适配。Vue3 子应用需要使用 wujie 提供的生命周期改造代码,在子应用入口加上这段:
第二,如果子应用有动态创建的 style 标签,需要在子应用里手动把样式移动到 shadow root。可以在子应用的 mount 生命周期里做这个处理:
第三,检查子应用的入口配置有没有问题。你用的是 url + exec: true,这种模式下子应用是独立运行的,需要确保子应用自身已经处理好了样式。可以试试改成这种方式:
第四,还有一个常见坑:如果子应用用了 CSS in JS 或者运行时样式处理,shadow 模式是挡不住的。这种情况要么改用 CSS Module 之类的方案,要么在主应用里用 CSS 命名空间包裹子应用容器:
最后,如果以上都试过还是不行,可以临时用一下 CSS 命名空间方案,在子应用根元素上加个唯一的 class 或者给子应用容器加 scoped 属性:
然后在主应用全局样式里用属性选择器覆盖:
你先把前几个排查点看看,特别是第一个——子应用有没有做 wujie 的适配改造,这个最关键。