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

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

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

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

今天给大家带来的主题是《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

相关推荐

以文本的方式绘制简单的SVG流程图——flowchart.js

介绍flowchart.js是在浏览器和终端中运行的流程图DSL和SVG渲染。节点和连接是分别定义的,因此可以重复使用节点,并可以快速更改连接。也可以在DSL中对节点和连接器样式进行细微的更改。Git...

全国首套构网型SVG在木垒投运

中新网新疆新闻1月5日电(翟文辉)12月29日,全国首套构网型SVG在新疆木垒华电220千伏四十个井子汇集站并网,本项目是新疆电网继阿克陶构网型储能后又一次构网型支撑项目示范。为全面响应国家“双碳”...

Popmotion – 小巧,灵活的 JS 运动引擎

Popmotion是一个只有12KB的JavaScript运动引擎,可以用来实现动画,物理效果和输入跟踪。原生的DOM支持:CSS,SVG,SVG路径和DOM属性的支持,开箱即用。Popmoti...

零基础教你学前端——43、初识SVG

解决网站图标问题的最佳方案——SVG!SVG是一种基于XML语法的图像格式,英文全称是:ScalableVectorGraphics,即可缩放矢量图,是W3C的一项建议。我们用手机拍摄...

2.3 文件格式全解:PSD/JPG/PNG/SVG/GIF

2.3文件格式全解:PSD/JPG/PNG/SVG/GIF一、文件格式的核心意义文件格式是数字图像的存储规则,决定了:-信息保留程度(图层/透明度/动画)-压缩方式与画质损失-跨平台兼容性-...

vite v6.3.2 发布!HMR 优化+CSS 增强+稳定性提升,前端开发再提速!

前言:Vite6.3.2来了!2025年4月18日,Vite团队正式发布了v6.3.2版本!虽然是一个小版本更新,但修复了多个关键问题,并带来了性能优化和稳定性提升,让开发体验更丝滑!如果你还...

一篇文章带你了解SVG 蒙版(Mask)

SVG蒙版功能可将蒙版应用于SVG形状。蒙版可确定SVG形状的哪些部分可见,以及具有什么透明度。运行效果可以将SVG蒙版视为剪切路径的更高级版本。一、简单的蒙版代码解析:本示例使用ID=mask1定义...

SVG实现的流程图绘制

一、项目简介使用SVG技术实现的流程图绘制二、实现功能流程图块生成、连线、拖拽产生相应的xml和xpdl导入导出json数据放大缩小功能保存操作(选择、自动插入、开始结束、普通活动、子活动、块活动、路...

解锁国内 404 页面:Next.js 设置指南和 33 个有趣 SVG 资源分享

前言当我们访问网站时,如果访问到不存在的路径时,会出现404错误。为了避免给访问者带来不良体验,设计网站时通常会在页面上展示“404页面不存在”的提示,并引导用户进行返回首页等操作。因此在建立网...

交互设计师做好动画后,提交给开发的文档有哪些?

谢邀!简单的说一下自己的看法。首先从制作动画开始。目前制作动画的方式主要有:Gif动画视频动画Web动画,而Web动画又包括:CSS动画、JS动画(Canvas动画、原生JS动画API)、SVG动画等...

Motion for Vue:为Vue量身定制的强大动画库

在前端开发中,动画效果是提升用户体验的重要手段。Vue生态系统中虽然有许多动画库,但真正能做到高性能、易用且功能丰富的并不多。今天,我们要介绍的是MotionforVue(motion-v),...

Web开发人员的福音!8个实用的SVG工具

SVG可缩放矢量图形(ScalableVectorGraphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式。SVG是W3C在2000年8月制定的一种新的二维矢量图形格式...

一键画波浪线、一键多图片调色?这3个网站好玩到停不下来

作为一个经常收集网站的PPT设计师,无意中发现了一些超级有趣的网站。只要你动手能力足够强,就一定会利用它做出创意作品。不说废话,直接进入主题。1、炫酷的光线绘画网站http://weavesilk.c...

vite 6.2.5 更新速递:告别SVG路径Bug,构建效率再提升!

Vite6.2.5更新公告2025年4月3日,Vite团队正式发布了Vite6.2.5版本!此次更新虽然是一个小版本迭代,但修复了一个关键问题,涉及SVG文件路径检查,对前端开发者尤...

DrawSVG – SVG 路径动画 jQuery 插件

jQueryDrawSVG使用了jQuery内置的动画引擎实现SVG路径动画,用到了stroke-dasharray和stroke-dashoffset属性。DrawSVG是完全...