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 一定不适合

相关推荐
时间的情敌6 小时前
Cesium 流动管线、管道动画、管线流向仿真,管网、油气、水利孪生高频需求
前端·交互·cesium
wangxiaoxuan2178 小时前
SLAM 的基本结构:前端、后端、回环与地图优化
前端·机器人·科沃斯八界
Agent世界11 小时前
用 CDP 做发布自动化:四道机器闸门与产物验收
前端·javascript
FungLeo11 小时前
成为全栈·Vue 管理后台篇·编辑器图片上传:从文件选择到文章附件关联
前端·vue.js·编辑器·markdown·文件上传·formdata·附件管理
某哈压力大11 小时前
SSH 突然 Connection reset?不是密钥坏了,是 OpenSSL 把 sshd 干趴了
前端·node.js·命令行
程序员大阳11 小时前
副队长ES6+教程(3)--解构赋值
前端·javascript·es6·赋值·解构
神膘护体小月半11 小时前
css - 元素背景图由 hover 触发,初次加载时闪动的解决办法
前端·javascript·css
程序员大阳12 小时前
副队长ES6+教程(2)--let 与 const
前端·javascript·es6·const·let·var
deli00712 小时前
写满 200GB 后 SSD 为什么掉到 95MB/s?SLC 缓存模型实测
前端
曦樂~13 小时前
【Web Development】03JavaScript 基础和事件
开发语言·前端·javascript