CSS Modules VS CSS in JS

2,411 阅读2分钟

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」。

CSS Modules vs CSS in JS,应该是前端开发界蛮具争议的一个问题了,在对比两种类型之前我们先来思考下为什么已有原生的CSS还需要两这种类型的库,原因是在工程化的开发中,我们经常需要多人合作,不同的模块。最后把所有的模块都和到一起测试上线。原生CSS是没有命名空间的,经常会出现重复命名导致污染其他模块的现象。所以需要实现CSS样式的局部隔离,就出现了CSS Modules跟CSS in JS,React里面常用的styled-components库就是CSS in JS的实现。

CSS modules是使用独特的class名,通过文件名、路径生产独特的hash前缀来隔离各个模块,这个hash是构建工具比如webpack的css-loader插件去生成,而CSS in JS中的样式是JS 运行时解析,然后挂载到head。

CSS in JS

硬伤

  • 样式是和JS文件打包在一起,所以会拖慢JS文件加载时间

  • 没有单独CSS文件所以无法缓存

  • 大多数的库跟插件样式都不是CSS in JS 开发的,业务开发时代码可CV性差

  • 不能使用SCSS, Less等CSS 语言(根据库情况不同,比如styled-components有支持)

优点

  • 可以用JS的逻辑,比如函数,比较灵活,复用性强

  • 小项目中比较方便

  • 语义化更加友好

CSS Modules

缺点

  • 全局样式需要用:global 的非原生语法去定义

  • 需要引入样式

优点

  • 可以用SCSS, Less等CSS语言

  • 样式代码与JS代码分离,代码会相对简洁

  • 只是在CSS基础上加入了局部作用域跟模块以来,代码相对规范

  • 规则简单易学

结论

CSS in JS有自己的特点跟优缺点,值得注意的是他不是纯粹的CSS,所以维护性较差,而且不能缓存且影响JS文件加载速度,对比CSS文件可以和JS文件并行加载,理论性能会差。开发的时候也的lint工具的支持不够完善,容易写出Bug,需要有合适的工具去解决这些问题。同时CSS in JS也因为耦合度高适合作为小型的模块被复用。综上还是建议大型项目选择CSS Modules的方式去处理CSS命名冲突,小型、个人开发或特殊需求可以选择CSS in JS。

参考

CSS Modules vs CSS-in-JS. Who wins?

CSS Modules 用法教程