qiankun
qiankun copied to clipboard
[Feature Request] 关于样式隔离
Background
主应用是element-ui, 子应用是element-plus, 现在部分子应用的样式, 覆盖掉了主应用的样式
Proposal
希望子应用样式, 不要对主应用生效, 官方提了个antd的方案,
Additional context
但是element-ui全系不支持增加类名前缀
有个实验属性,https://qiankun.umijs.org/zh/api#startopts 开启sandbox.experimentalStyleIsolation
有个实验属性,https://qiankun.umijs.org/zh/api#startopts 开启sandbox.experimentalStyleIsolation
之前加过这个了, 会引发新问题, 因为element有些组件弹窗, 下拉框, 是放到body下面的
遇到了同样的问题
遇到了同样的问题,求官方解答
the same question
遇到同样问题@官方
+1
+1
+1 临时通过postcss的命名空间插件解决,大致原理就是添加了一个命名空间,至于element写在body上的样式添加了ignore配置 (ps:不是完美方案,只能保证基本可用)
+1 临时通过postcs的命名空间解决方案,大致原理就是添加一个自定义空间,至于元素写在上的样式添加了保证配置 (ps:不是完美,基本可以)
我还是不太明白,能说的明白一点吗,谢谢
+1 临时通过postcss的命名空间解决方案,大致原理就是添加一个自定义空间,至于元素写在上的样式添加了保证配置 (ps:不是完美,基本可以)
我还是不太明白,能说的明白一点吗,谢谢
样式冲突原因:是因为主子应用的elment使用了相同的类名 但是属性不一样对吧 思路:添加命名空间 方案:postcss-plugin-namespace插件对主应用的element的css添加命名空间,目的是主应用css只对主应用节点生效,那么问题就解决了对吧 方案隐患:不能解决element在body上添加的样式,不过目前看问题不大,可以作为官方解决前的临时方案
+1 遇到同样的问题
使用命名空间命名之后,要怎么处理在body下面的样式呢
升级element-plus版本到2.2.2以上,用namespace来控制element-plus的class名称
不要使用隔离的方案去处理,太多限制了,甚至fork一个element-ui的仓库,手动改里面所有的class前缀都可以
这个方案之前要改源码,请问现在还需要吗?
---原始邮件--- 发件人: @.> 发送时间: 2022年5月31日(周二) 中午11:48 收件人: @.>; 抄送: @.@.>; 主题: Re: [umijs/qiankun] [Feature Request] 关于样式隔离 (Issue #1963)
升级element-plus版本到2.2.2以上,用namespace来控制element-plus的class名称
— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>
我也是遇到了这个问题
可以在编译时或运行时给三方库加个命名空间,对于逃逸到body节点下组件可以改造三方库源码(逃逸到命名空间下而不是到body节点下,这类组件没那么多,组件库升级也不那么频繁)
https://element-plus.org/zh-CN/guide/namespace.html 组件库方案,从根本上解决了问题
使用命名空间命名之后,要怎么处理在body下面的样式呢
逃逸到body下的组件,组件在创建dom时外部添加一层容器,容器className 为命名空间。
也遇到了同样的问题。
三种解决方案:
- excludeAssetFilter css逃逸 缺点会影响到主应用样式
- 修改子应用的appendtobody,让它插入到子应用的根节点而非body下
- 现在主流的组件库对于弹窗也基本提供了更改挂载容器的方法。比如antd modal getContainer
三种解决方案:
- excludeAssetFilter css逃逸缺失点会影响到主要应用样式
- 修改子应用的appendtobody,让它插入到子应用的根节点而不是body下
- 现在主流的组库对弹窗也基础提供了更修改挂载容器的方法。比如antd modal getContainer
请问方案2怎么实现,直接修改 document.body.appendChild = xxx 时会影响主应用上的这个方式
升级element-plus版本到2.2.2以上,用namespace来控制element-plus的class名称
instance = createApp(App) instance.use(ElementPlus, { locale: zhCn, namespace: "myName" })