styled-components 升级 V6 踩坑之旅

763 阅读3分钟

项目当前在升级,各个依赖的版本都逐步升到新版本,在升级 styled-components 到 V6(6.0.2) 的过程中,遇到了几个问题,记录一下这里的踩坑之旅

直接根据官方文档的升级指南操作:What do I need to do to migrate to v6? 安装了 styled-components 和 stylis 新版本的依赖,然后运行项目,直接就是一整个大报错,开始踩坑

前置问题:yarn link

因为项目中有使用一个私有库,也使用了 styled-components,不确定一下就能升级成功,需要本地调试(不用每次修改都发新版本,然后宿主项目安装依赖),使用 yarn link 调试,具体操作可以查看这篇文章

坑1: @types/stylis

这里查询了好久,没有找到合适的解决方式,但是看源码大概定位到是 ts 类型问题导致的,然后在 styled-components 的 issue 中找到(链接),通过安装 @types/stylis 解决。

安装完成,项目启动成功,也没报错,哇塞好开心,居然一下就成了,然后一看页面,我去,好多样式乱套了......

坑2: Pseudoelements, pseudoselectors, and nesting

V6之前的版本,伪类/伪元素的前面,可以加 & 符号,也可以不加,但是V6之后,伪类/伪元素前必须加 & 符号,否则样式会不生效

const Test = styled.div`
    // ...其他样式
    :hover {            // 不生效
        color: red; 
    }
    &:hover {           // 生效
        color: yellow; 
    }
`

补充:因为项目中有大量的伪类/伪元素的样式,一个一个的修改实在是太费时间了,一开始想找 stylelint 有没有内置的/其他插件可以校验伪类/伪元素的,找了一圈没找到,styled-components 官方给的校验方式也不行(链接)所以最后写了一个自定义插件来校验&定位当前没有添加 & 符号的伪元素/伪类的样式位置,链接在此

坑3: Passed props

自定义的 react 组件,在设置一些自定义的 props 的时候,需要加 $ 前缀

坑4: props 不能传递布尔类型的值

这个问题,一开始我觉得很奇怪,我之前 react 的 props 传参也有传过 boolean 类型的啊!这里为什么有警告,而且样式还没生效。 chatGPT给我的回答是这样的:

  • 第一次尝试:我改成了 <MyComponent dropdown={condition && true} /> 这种写法,样式生效了,但是控制台的警告仍然存在;
  • 第二次尝试:我改成了 <MyComponent dropdown={condition ? 1 : 0} /> 这种写法,样式生效了,报错也消失了;
  • 终极解决方式:<MyComponent $dropdown={condition} />,样式生效且控制台并未报错(完美~); 参考这个issue

其实我感觉这个问题和第三个坑本质上是一样的,不能直接把 true/false 加在 DOM 上,所以这里直接加 $ 前缀,当成一个自定义的 props 就好了

坑5: css 属性插值处理方式

解决完以上7个问题,样式看起来都正常了,我以为没有问题提交代码部署,然后发现打包失败了。 检查项目是因为,一个 polished 中的插件 ellipsis 报错了

了解了下这个插件中的这个方法,大概意思就是插入超出显示省略号的 css 代码到样式中。

知道了作用,但是不知道为什么报错,而且看起来报错的是类型问题,便以为是类型不兼容,查询了比较久的资料,无果。最后问 chatGPT 得出原因(其实还是对styled-components不熟悉),就是语法问题 改成如下代码就没有问题了~

至此,所有的样式问题和项目中的警告都解决啦~