百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

2023 年最受前端欢迎的 10 大 CSS-in-JS 库!

myzbx 2025-03-03 19:25 55 浏览

家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

今天给大家带来的主题是《2023 年最受欢迎的 10 大 CSS-in-JS 库!》,其中针对部分 CSS-in-JS库后面会单独出文介绍,可以随时保持关注。话不多说,直接开始!

styled-components

Styled Components 可以轻松地为 Web 应用程序创建和管理样式,其允许开发者在 JavaScript 中编写样式,这些样式可以更加模块化、可重用并与应用程序逻辑的其余部分集成。

此外,Styled Components 允许开发者使用 JavaScript 表达式来创建动态样式。 这对于希望根据特定条件(例如屏幕宽度或当前用户的首选项)设置元素样式的情况非常有用。 开发者还可以使用 Props 将信息从组件传递到样式。

以下是 styled-components 的一些主要特点:

  • 一种声明式语法,使样式更具可读性和可维护性
  • 通过 JavaScript 表达式支持动态样式
  • 能够使用 props 将信息从组件传递到样式
  • 强大的社区支持和不断发展的插件和集成生态系统。

以下示例展示了 styled-components 的基本用法。

import React from 'react';
import styled from 'styled-components';
// 创建一个  反应组件来渲染一个 <h1> 
// h1居中,浅紫色,大小为 1.5em
const Title = styled.h1`
  font-size: 1.5em;
  text-align: center;
  color: palevioletred;
`;
// 创建一个 <Wrapper> 组件来渲染一个 <section>
// 一些填充和背景
const Wrapper = styled.section`
  padding: 4em;
  background: papayawhip;
`;
// 像使用任何其他 React 组件一样使用它们——除了它们是样式化的!
<Wrapper>
  <Title>Hello World, this is my first styled component!
;

在 Github 上,styled-components 已经有超过 38.7k 的 star 和 2.4k 的 fork,每周的平均下载量达到了 5451k。目前有超过 1672 k 的项目使用 styled-components、项目贡献人数 310+,增长势头迅猛。

CSS Modules

CSS 模块让开发者可以在常规 CSS 文件中编写样式,然后将这些样式导入 JavaScript 组件。 这可以帮助开发者避免一些编写全局样式的陷阱,例如:冲突和意外的副作用,同时仍然享受使用 CSS 的好处。

CSS Modules 的关键特性之一是它会自动为样式生成唯一的类名, 这意味着开发者可以像在常规 CSS 文件中一样使用熟悉的选择器和规则编写样式。

但是,值得注意的是,当将样式导入 JavaScript 组件时,CSS 模块会自动重命名类名,以确保它们不会与应用程序中的其他样式冲突。这可以帮助开发者避免命名冲突和使用全局样式时可能出现的其他常见问题。

举一个例子,从 JS 模块导入 CSS 模块时,它会导出一个对象,其中包含从局部名称到全局名称的所有映射。

import styles from './style.css';
element.innerHTML = '
';

在 Github 上,css-modules 已经有超过 16.8k 的 star 和 0.55k 的 fork,每周的平均下载量达到了 5451 k。

Styled JSX

Styled JSX 是一个库,它允许开发者编写限定在特定组件范围内的 CSS 样式。 无需将 CSS 放在单独的文件中,开发者可以将其直接写入组件文件,从而更灵活控制样式应用方式。

使用 Styled JSX 的主要优点之一是它允许开发者以与组件结构更紧密的方式编写样式,从而使得样式更容易理解和维护,尤其是在具有许多组件的大型项目中。

Styled JSX 还可以轻松地根据 props 或 state 动态地设置组件的样式。 这对于创建可自定义以适应不同场景的可重用组件很有用。

// 按钮组件
function Button({ children }) {
  return (
    
  );
}

以下是 Styled JSX 的一些主要特性:

  • 直接在 JavaScript 代码中编写样式
  • 使用 JavaScript 的全部功能来创建样式
  • 易于阅读和理解的语法
  • 不需要单独的 CSS 文件
  • 高度模块化和可重用的代码。

在 Github 上,styled-jsx 已经有超过 7.4k 的 star 和 0.4k 的 fork,每周的平均下载量达到了 3397k。目前有超过 1234 k 的项目使用 styled-jsx、项目贡献人数 70+,是妥妥的前端明星项目。

Emotion

Emotion 是一个允许开发者在 JavaScript 中编写样式的库,它允许将所有样式与组件放在一起,而不是放在单独的 CSS 文件中。

@emotion/css 包与框架无关,是使用 Emotion 的最简单方法,比如下面的示例:

import { css } from '@emotion/css';
const color = 'white';
render(
  
Hover to change color.
);

同时 Emotion 还提供了@emotion/react 包用于与 React 集成,比如下面的示例:

import { css } from '@emotion/react';
const color = 'white';
render(
  
Hover to change color.
);

该库还提供了很多其他集成,例如: Styled Components。 并为 Babel、ESLint、Jest 等提供自定义包。

以下是 Emotion 的一些主要功能:

  • 它会自动限定样式范围,以避免与页面上的其他样式发生冲突。
  • 使用强大的模板文字语法,可使用熟悉的 CSS 语法,但具有 JavaScript 的附加优势。
  • 允许使用 JavaScript 表达式来定义样式,这使得创建基于 props 或 state 的动态样式变得容易。

在 Github 上,Emotion 已经有超过 16.3k 的 star 和 1.1k 的 fork,每周的平均下载量达到了 3397k。目前有超过 270 k 的项目使用 Emotion、项目贡献人数 300+,是妥妥的前端明星项目。

JSS

JSS 支持所有现有的 CSS 特性,并默认生成唯一的类名,以避免全局样式冲突。 JSS 还允许代码重用、动态样式、用户控制的动画和关键 CSS 提取。

JSS 具有基于插件的架构,允许自定义插件和表达语法。 JSS 还与 React 很好地集成,提供动态主题和惰性执行等功能。 总的来说,JSS 提供了一种在 React 应用程序中使用 CSS 的强大而高效的方式。

import React from 'react';
import { render } from 'react-dom';
import { createUseStyles } from 'react-jss';
// 创建你的样式,请记住,由于 React-JSS 使用默认预设,
// 大多数插件无需进一步配置即可使用。
const useStyles = createUseStyles({
  myButton: {
    color: 'green',
    margin: {
      // jss-expand 提供更易读的语法
      top: 5, 
      // jss-default-unit 默认值 5px
      right: 0,
      bottom: 0,
      left: '1rem',
    },
    '& span': {
      // jss-nested 将其应用于子级span
      fontWeight: 'bold', 
      // jss-camel-case turns this into 'font-weight'
    },
  },
  myLabel: {
    fontStyle: 'italic',
  },
});

const Button = ({ children }) => {
  const classes = useStyles();
  return (
    
  );
};
const App = () => ;
render(, document.getElementById('root'));

在 Github 上,JSS 已经有超过 6.9k 的 star 和 0.42k 的 fork,每周的平均下载量达到了 2098k。目前有超过 572 k 的项目使用 JSS、项目贡献人数 130+,是妥妥的前端明星项目。

Styled System

Styled System 是一个库,可帮助开发者使用声明式方法设计 React 组件的样式,这意味着开发者只需要指定希望组件看起来像什么,Styled System 将默认处理其余部分。

Styled System 最好的地方之一是它建立在流行的 CSS-in-JS 库之上,例如: Emotion 和 Styled Components。 这意味着它与范围广泛的现有工具和库兼容,开发者可以将它与任一库结合使用。

//示例使用 styled-components,但 styled-system 也适用于大多数其他 css-in-js 库
import styled from 'styled-components'
import { space, layout, typography, color } from 'styled-system'
// 将样式化系统函数添加到您的组件
const Box = styled.div`
  ${space}
  ${layout}
  ${typography}
  ${color}

Styled System 的一些主要功能包括:

  • 简单直观的 API,可让开发者快速轻松地定义样式
  • 内置支持各种样式属性,包括:大小、颜色和间距
  • 能够创建适应不同屏幕尺寸的响应式设计(Grid 和 Flexbox 包)
  • 一个强大的插件和实用程序生态系统,可以轻松扩展和自定义样式

在 Github 上,Styled System 已经有超过 7.6k 的 star 和 0.53k 的 fork,称得上是一个值得关注的前端明星项目。

vanilla-extract

vanilla-extract 零运行时特性很棒,它允许开发者编写样式表并在构建时将它们编译成静态 CSS 文件。 这提供了类型安全和局部作用域样式的好处。

// styles.css.ts
import { createTheme, style } from '@vanilla-extract/css';
export const [themeClass, vars] = createTheme({
  color: {
    brand: 'blue',
  },
  font: {
    body: 'arial',
  },
});
export const exampleStyle = style({
  backgroundColor: vars.color.brand,
  fontFamily: vars.font.body,
  color: 'white',
  padding: 10,
});

vanilla-extract 的突出特点之一是它对主题的支持。 开发者可以创建一个全局主题或多个主题,所有主题都具有类型安全的令牌合约,这使得自定义项目的外观变得容易。

Vanilla-extract 的另一个优势是它与框架无关,它具有流行框架和打包器(如 webpack、esbuild、Vite 和 Next.js)的官方集成。

总的来说,Vanilla-extract 是一个很优秀的库,适合任何希望利用 TypeScript 的附加优势大规模编写可维护的 CSS 的人。

在 Github 上,vanilla-extract 已经有超过 8k 的 star 和 0.2k 的 fork,有超过 18.6 k 的项目使用 ,是妥妥的前端明星项目。

Linaria

Linaria 是一个 CSS-in-JS 库,允许开发人员使用 JavaScript 编写 CSS,并在构建期间将样式提取到 CSS 文件中。 这提供了动态样式和熟悉的 CSS 语法以及类似 Sass 的嵌套的好处。

除了作为一个零运行时库之外,Linaria 还通过 React 绑定支持基于属性的动态样式。 这利用了幕后的 CSS 变量,使得基于组件 props 的应用样式变得毫不费力。

Linaria 由两个主要部分组成:Babel 插件和打包器集成。 Babel 插件负责在代码中查找 css 和 style 标签,提取 CSS 并将其返回到文件的元数据中, 它还将根据文件名哈希生成唯一的类名。

import { css } from '@linaria/core';
import { modularScale, hiDPI } from 'polished';
import fonts from './fonts';
//在 `css` 标签中写下你的样式
const header = css`
  text-transform: uppercase;
  font-family: ${fonts.heading};
  font-size: ${modularScale(2)};

  ${hiDPI(1.5)} {
    font-size: ${modularScale(2.5)};
  }
`;
//然后用它作为类名

Hello world

;

使用 styled 标签时,动态插值将替换为 CSS 自定义属性, 对作用域中常量的引用也将被内联。 如果多次使用相同的表达式,插件将为这些创建单个 CSS 自定义属性。

import { styled } from '@linaria/react';
import { families, sizes } from './fonts';
// Write your styles in `styled` tag
const Title = styled.h1`
  font-family: ${families.serif};
`;
const Container = styled.div`
  font-size: ${sizes.medium}px;
  color: ${(props) => props.color};
  border: 1px solid red;

  &:hover {
    border-color: blue;
  }
  ${Title} {
    margin-bottom: 24px;
  }
`;
// Then use the resulting component

  Hello world
;

在 Github 上,Linaria 已经有超过 10.4k 的 star 和 0.42k 的 fork,每周的平均下载量达到了 276k。目前有超过 1.5 k 的项目使用 Linaria、项目贡献人数 130+,是妥妥的前端明星项目。

Twin

Twin 是一个库,它使开发人员能够通过结合 Tailwind CSS 和 CSS-in-JS 的优势来构建更好的应用程序。

Twin 允许使用 Tailwind 类设置前端组件的样式,然后将它们编译到任何受支持的 CSS-in-JS 库中。 这消除了对额外客户端包的需要。 Twin 与 React 和其他 React 框架兼容,并且开箱即用地支持 Vue。

Twin 的特点包括:

  • 使用 tw 属性的基本样式,用于将 Tailwind 类添加到 JSX 元素
  • 使用 css 属性和数组中的嵌套样式的条件样式
  • 在 css props 之后使用 tw props 覆盖样式
  • 通过提取样式并将它们分组到一个对象中来清理 JSX
  • 具有自定义选择器和任意变体的样式元素
  • 具有任意属性的自定义 css 和 css props
  • 具有类似 sass 的语法和对象的高级 css 样式。

比如下面的用例将 sass 样式与 css 导入混合:

import tw, { css } from 'twin.macro';
const hoverStyles = css`
  &:hover {
    border-color: black;
    ${tw`text-black`}
  }
`;
const Input = ({ hasHover }) => (
  
);

还可以使用 tw 导入来创建和设置新组件的样式:

import tw, { styled } from 'twin.macro';
const StyledInput = styled.input(({ hasBorder }) => [
  `color: black;`,
  hasBorder && tw`border-purple-500`,
]);
const Input = () => ;

在 Github 上,Twin 已经有超过 7.2k 的 star ,每周的平均下载量达到了 276k。目前有超过 10.9 k 的项目使用 Twin、是妥妥的前端明星项目。

Fela

Fela 是一个小型、高性能且与框架无关的工具,用于处理 JavaScript 中的状态驱动样式。Fela 在设计上是动态的,允许根据应用程序状态渲染样式。

Fela 生成原子 CSS 并支持所有常见的 CSS 功能,例如:媒体查询、伪类、keyframes 和字体。 Fela 附带一个强大的插件 API ,例如:供应商前缀或回退值(fallback value)支持。

Fela 可以与 React 或任何其他视图库一起使用。 它甚至支持 React Native。

假如有如下代码:

import { createRenderer } from 'fela';
// 简单的样式规则是状态的纯函数
// 返回样式声明的对象
const rule = (state) => ({
  textAlign: 'center',
  padding: '5px 10px',
  // 直接使用状态来计算样式值
  fontSize: state.fontSize + 'pt',
  borderRadius: 5,
  // 深度嵌套媒体查询和伪类
  ':hover': {
    fontSize: state.fontSize + 2 + 'pt',
    boxShadow: '0 0 2px rgb(70, 70, 70)',
  },
});
const renderer = createRenderer();
// fela 生成原子 CSS 类以实现
// 最大的样式重用和最小的 CSS 输出
const className = renderer.renderRule(rule, {
  fontSize: 14,
}); // =>  a b c d e f

通过 Fela 编译后的 CSS 结果如下所示:

.a { text-align: center }
.b { padding: 5px 10px }
.c { font-size: 14pt }
.d { border-radius: 5px }
.e:hover { font-size: 16pt }
.f:hover { box-shadow: 0 0 2px rgb(70, 70, 70) }

在 Github 上,Fela 已经有超过 2.2k 的 star ,每周的平均下载量达到了 26k。目前有超过 4.1 k 的项目依赖量、是值得长期关注的前端明星项目。

本文总结

本文主要为大家介绍2023 年最受欢迎的 10 大 CSS-in-JS 库,其中针对部分 CSS-in-JS库后面会单独出文介绍,可以随时保持关注因为篇幅有限,文章并没有过多展开,如果有兴趣,文末的参考资料提供了优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!

参考资料

https://github.com/styled-components/styled-components

https://stackdiary.com/css-in-js-libraries/

https://github.com/css-modules/css-modules

https://github.com/vercel/styled-jsx

https://github.com/cssinjs/jss

https://github.com/styled-system/styled-system

https://github.com/vanilla-extract-css/vanilla-extract

https://github.com/callstack/linaria

https://github.com/ben-rogerson/twin.macro

https://github.com/robinweser/fela

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 &quot;小贱贱&quot;韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...