antd4升级5遇到的问题?

1,726 阅读2分钟

谷歌浏览器低版本不兼容?

在antd4升级到5,我们特意在测试环境和灰度环境,进行了为期二个月的观察,都没有遇到任何问题,但是上线后突然有用户反馈G了???抓紧调用了用户的浏览器,发现竟然还有使用86内核浏览的用户。刚开始打算先引导用户升级下浏览器,但是发现部分用户是使用的另外一个平台嵌入了我们的系统,令人糟糕的是他们平台是78内核的浏览器!!!

于是立刻想办法修复,因为样式混乱太多了,首先想着去antd官网查看有没有对应的办法,然后看到antd5有个兼容方案:ant.design/docs/react/…

antd5大部分写法使用的:where选择,该选择器的兼容性真的很差。antd通过:where降低选择器的优先级,来减少用户自定义的成本。但是降级后,由于antd5内置按需引入,和我们自定义的css文件部分情况下会存在引入先后的问题,导致究竟是我们的样式还是antd的内置样式生效。首先考虑的是否可以通过webpack调整引入的顺序,但是由于时间比较紧要当天修复,最终采用的是在我们的样式上再一个类名比如原先叫 a-btn 现在加个 b-tn来增加我们自定义样式的权重比。

修复后大部分样式已经正常了,但是仍然存在一些小问题,只能组件单独修复了。在做系统回归的时候发现message组件竟然没有生效,dom加载了,但是一直没有展示。最开始是想手动设置dom显示然后再删除,但是这样message组件竟然不会第二次触发了,大概是在外部修改antd的内容message状态池冲突了。时间紧迫就先用一个临时的message组件库react-toastify来替换上线了。

第二天有用户反馈部分modal的弹框展示不出来了,大部分都是modal.info类似这种形式的。这时候就感觉问题不简单,modal.info其实和message是类似的,都是通过ReactDOM.render来创建一个新的React实体和正常组件不一样。那全部就清楚了,message和modal.info无法获取StyleProvider提供的降级参数,所有message还是用:where预发,然后就导致低版本不兼容也就不展示。最开始也为这是antd的bug,最后发现antd5有提供新的api useModal 和 useMessage 。我们可以把context信息传递给modal实体,这样就可以解决不展示的问题了。