css or css in js ?

第一次发文章,力求简单明了,不讲废话。

emotion

css in js 库有很多种, 比较著名的就是 emotion, 但通过 Sam Magura 的文章 可知这类库的优缺点都很明显

优点

  • css 模块化 (重要功能)
  • 与 js 代码合在一起 (不用单独写 css 文件, 感觉可能更难维护...)
  • 能将 js 变量应用到样式上 (React 也能做到, 不过只能是 inline-style)

缺点

  • 性能问题 (忍不了)
  • 样式权重问题 (影响样式覆盖, 基础库不能容忍此缺点)
  • 增加了包体积 8kb (略微牵强, 可忽略)

为什会有性能问题 ?

css in js 会将 css 转换为 hash 值, 每次页面更新都需要重新序列化得到 css 后再次计算 hash, 因此增加了额外的性能开销, 例如下面的 style

html 复制代码
<style data-emotion="css mj4qsp" data-s>
.css-mj4qsp {
  display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display: flex;-webkit-align-items: center;
  -webkit-box-align: center;-ms-flex-align:center;align-items: center;border-bottom: 1px solid rgba(5, 5, 5, 0.06);
  padding-inline: 24px! important;height: 48px; line-height: 48px; background: transparent! important;
}
</style>

怎么解决 ?

将 hash 缓存起来, 不就好了? 因此 antd 给出了方案

antd-style

通过缓存的方法去减少序列化 css 的次数, 只关注 antd version 和 token, 当二者改变时才重新计算 hash

如果样式是受控的怎么办 ?

这个问题其实很简单, 每个组件都是一个独立的存在, 无论怎么受控, 样式都是存在于组件内的, 因此我们给组件做缓存即可。(props.style 不是 css in js)

antd-style 就是完美的吗?

antd-style 基于 emotion, 但它有一下优缺点

优点

  • 性能好
  • 兼容 antd5 token
  • 更适合基于 antd 二次封装的组件库, createInstance 发挥了重要作用
  • 样式覆盖优秀 (:where)

缺点

  • 组件级: 需要独特的 key
  • 不能直接复写样式, 需要先传 className, 如果组件不支持 className 就难受了
  • 兼容性差 :where 兼容性
  • 综上: 只适合组件库

结论 ------ 如何选择 css in js

基础组件库、基于 antd 二次封装的组件库: 毫无疑问, antd-style 是首选

业务项目: 首先抉择好性能问题 , 并且 antd-style 一定不适合

相关推荐
计算机魔术师15 分钟前
黄仁勋台上接特朗普电话开免提,全场听到一句话:AI 不会减速
前端
yivifu37 分钟前
HTML元素的textContent和innerText两个属性的差别
前端·html
咸鱼老弟1 小时前
Speculative Decoding(投机采样):大模型"先猜后验",生成速度翻倍
前端·算法·ai编程
a1117761 小时前
网页版「MATLAB」开源
前端·开源
JianZhen✓1 小时前
解决SPA发版旧版本残留+动态路由打包失效的完整方案(附落地代码)
前端·状态模式
计算机魔术师1 小时前
Dario Amodei 发文呼吁放缓前沿 AI 开发后各方表态汇总
前端
anyup2 小时前
仍然是简单一句话,uView Pro Starter 一键清理 Skill 发布
前端·人工智能·uni-app
福兮说2 小时前
纯前端把图片压缩到指定体积:canvas.toBlob 配合二分查找
前端·javascript·canvas·图片处理
是立不是利2 小时前
CSS 入门与进阶:从选择器到响应式布局的完整指南
前端·css
镭立智能制造2 小时前
电线电缆换线频繁?MES系统如何缩短换线时间40%
前端·制造