为什么选择CSS in JS?

Souleigh ✨
• 阅读 967

为什么选择CSS in JS?


为什么选择CSS in JS?

天生的 Scoped 样式

传统基于类选择器的 CSS, 有一个被大家诟病的地方就是没有本地作用域,所有声明的样式都是全局生效的,这让大型项目的 CSS 编写和维护变得异常困难。为了解决这个问题,前端社区花了非常大的精力解决这个问题,比如 BEM/SMACSS/OOCSS 等 CSS 使用方法论,比如 Less/Sass/Stylus 等 CSS 预处理器。

BEM/SMACSS/OOCSS 的问题在于它们只是约定,你很难让团队成员达成这些方法论的共识,并且长期完美的格遵循这些约定。

Less/Sass/Stylus 试图把编程能力带到 CSS,可惜带来的并不是真正的编程能力,反而让工具链变得复杂,而且扩展的语法也并不好用。

CSS-in-JS 呢? 它是天生的 Scoped 样式,它从机制上解决 CSS 作用域问题,而不是一些难以遵守的约定。

消除无用代码

由于 HTML 和 CSS 一般通过类名建立联系, 他们之间存在隐式关系,因此通常很难跟踪未使用的 CSS 样式,删除组件后,很难精确删除对应的 CSS,因为你会害怕其他地方使用了样式,你会没信心删除,而且缺乏安全感。使用 CSS-in-JS,样式和结构的关系是显式的,样式和结构是绑定的,结构和样式的增加、修改、删除是同步,几乎不会出现死代码。

特别是大型前端项目,使用传统的方法很容易让无用的 CSS 膨胀,越来越来越多,并且每人敢动,而使用 CSS-in-JS,不会出现无用代码。

动态样式

根据应用的状态控制组件的样式,我们称之为动态样式。CSS-in-JS 非常强大的特性之一是基于状态的样式。传统的处理方式是,定义多个 CSS 类名,用 JS 根据应用状态改变 CSS 类名。这种处理方式的最大缺点: 样式的状态是脱离应用状态的上下文(Context)的,它通过 CSS 类名钩子关联,另外这种方式代码编写十分繁琐。使用 CSS-in-JS,样式规则直接根据应用状态生产,样式在状态的上下文中,你可以理解为 Style=f(State),不用通过 CSS 类名这些中间人隐式地描述动态样式。

组件化

曾经 Web 应用是基于页面 (Page)的,一个页面的实现通常由 HTML、JS、CSS 3 个文件组成,那时关注点分离是合理的。现在,前端进入了组件化时代,一个页面通常由多个组件组合完成,这时 CSS in JS 更适合组件化的场景。

更好的开发体验

你不需要写 CSS,只需写 JS,心智负担更小,而且可以配合 TypeScript,类型提示更加精准。 CSS-in-JS 使开发人员更具表现力,同时鼓励使用比级联更可维护的模式。在组件体系结构中,将多个组件的关注点放在一个地方就成为了当务之急。

强约束性

多年以来,前端开发人员一直在与 CSS 的各种方法论作斗争,比如 BEM/SMACSS/OOCSS,但在没有严格监督的情况下都很难落实和管理。Fower 提供一种提约束的编写样式方法: Atomic Props,让每个人使用同样的方式编写样式。

支持非浏览器,如 React Native, 小程序

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
梦
3年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Stella981 Stella981
3年前
AssemblyScript 入门指南[每日前端夜话0xEB]
每日前端夜话0xEB每日前端夜话,陪你聊前端。每天晚上18:00准时推送。正文共:2459 字预计阅读时间:10分钟作者:DannyGuo翻译:疯狂的技术宅来源:logrocket!(https://oscimg.oschina.net/oscnet/b880277c594152a503
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
Node.js 12中的ES模块[每日前端夜话0x9E]
每日前端夜话0x9E每日前端夜话,陪你聊前端。每天晚上18:00准时推送。正文共:2552字预计阅读时间:10 分钟作者:BrianDeSousa翻译:疯狂的技术宅来源:logrocket!(https://oscimg.oschina.net/oscnet/2ccaf94cecd3
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Sass
嵌套规则(NestedRules)Sass允许将一套CSS样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器mainp{color:00ff00;width:97%;.redbox{
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_