微前端父子应用css命名冲突的解决方案
遇到的问题
微前端项目集成子应用过程中,往往会遇到css命名冲突,样式污染问题。
例如乾坤框架支持沙箱css,可以开启strictStyleIsolation
等解决方案。
也可以在项目开发时约定各自的前缀,vue style scoped 样式作用域等避免样式污染。
但很多项目项目UI库用的是element-plus或element-ui,大版本都不一致,就必须做样式隔离。
这里采用PostCSS的 postcss-namespace
插件,简单实现添加前缀的方式,支持webpack和vite构建,方法都一样。
效果示例
1 | // 转换前 |
实现步骤
npm安装依赖包
1 | npm i -D postcss-loader postcss-selector-namespace |
在项目根目录放置一个文件,postcss.config.js
,文件内容:
1 | module.exports = { |
在index.html文件,html下增加一个class
1 | <html lang="zh-CN" class="global-css"> |
常见问题
- html 样式丢失
因为html的样式被转成 .global-css html
了。添加一个不需要添加前缀的文件 unNamespace.less
,全局引入。
然后在 postcss.config.js
文件添加一个判断,如果css名包含 unNamespace
字眼,就跳过。
1 | if (css.includes('unNamespace')) return ''; |
- postcss-loader 安装失败,提示版本冲突
使用命令:npm i postcss-loader --legacy-peer-deps
,目的是绕过peerDependency, 忽略项目中引入的各个modules之间的相同modules但不同版本的问题并继续安装。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 口水随想!