前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CSS in JS 新秀:vanilla-extract 浅析

CSS in JS 新秀:vanilla-extract 浅析

作者头像
Tecvan
发布于 2022-01-25 13:15:59
发布于 2022-01-25 13:15:59
2.2K00
代码可运行
举报
文章被收录于专栏:TecvanTecvan
运行总次数:0
代码可运行

前言

2021年,vanilla-extract 作为黑马登顶了 css-in-js 满意度榜首(虽然使用率仅为1%),号称是一个类型安全、高度兼容 TS 场景的库,国内相关讨论还很少,稍微看了一下还挺好用的。

介绍

官方文档:https://vanilla-extract.style/documentation/

打开vanilla-extract官网文档,里面已经罗列了他的那些优点。作为一个如果使用 css-in-js 会首选styled-components的我来说,比较关注的点主要是:

  • All styles generated at build time
  • Type-safe styles via CSSType.

这两点说白了就是,零运行时且支持typescript

  • 零运行时:vanilla-extract会在编译时期,编译出 css modules值和css内容,不需要带任何运行时内容到生产环境,相对来说运行速度更高,产物体积更小;
  • typescript:支持typescript类型检查,CSS安全;

目前,业界大多数相关竞品如 styled-components就是一个运行时方案且基于标签模板进行书写,主要基于stylis解析器解析,如果频繁更新props还会造成style标签大量插入到head里。

安装

Webpack 环境下,需要同时安装 @vanilla-extract/css@vanilla-extract/webpack-plugin 插件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yarn add @vanilla-extract/css @vanilla-extract/webpack-plugin

安装完成后,修改 Webpack 配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const { VanillaExtractPlugin } = require('@vanilla-extract/webpack-plugin')

module.exports = {
  entry: './src/index.js',
  // ....
  plugins: [new VanillaExtractPlugin()]
};

这里可以看见,当我们使用 vanilla-extract 时,需要安装两个库:

  • @vanilla-extract/css:开发核心库,基于该库进行项目业务样式开发;
  • @vanilla-extract/webpack-pluginwebpack插件。前面也提及了vanilla-extract是一个零运行的库,主要是通过该插件处理。
    • 通过增加webpack配置项,对相关后缀文件使用自定义的@vanilla-extract/webpack-plugi/loader进行处理。
    • 在其内部通过eval库在编译时先执行得到className结果,避免在运行时执行过程;
    • 再移除@vanilla-extract/css库,使其不会影响到生产环境下js包体大小;

构建样式API

这里只会对vanilla-extract比较核心的构建样式相关几个API提及,其他API可以直接前往官网查看。

style

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { style } from '@vanilla-extract/css';

export const parentClass = style({
  background: 'red',
  ':hover': {
    background: 'blue',
  },
});

export const childClass = style({
  selectors: {
    '&:nth-child(2n)': {
      background: '#fafafa',
    },
    [`${parentClass} &`]: {
      color: 'pink',
    },
  },
});
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { childClass, parentClass } from './index.styles.css';

const Demo = () => (
  <div className={parentClass}>
    <div className={childClass}>DEMO1</div>
    <div className={childClass}>DEMO2</div>
    <div className={childClass}>DEMO3</div>
  </div>
);

export default Demo;

这个简单的demo我相信,看几下就已经明白是怎么使用了。但是需要理解的地方是,为了提高可维护性,「每个样式块只能针对某个元素(或者说是使用这个样式块的元素)」。那么在上述代码里的selectors而言,「其目标必须是」**&**(也就是自身元素)而不能是其他元素。例如:`${parentClass} &`是OK的,但是`& div`是不允许的。这样的设计,我觉得更是一种职责分离吧,每个样式块都针对某个元素,那么对于项目而言,样式的可维护性就大大提高了,相比于其他css in js(styled-components)就不容易出现样式冗余的问题。对于一些特殊情况,比如:在写styled-components我们会利用其包裹arco组件(或是其他组件),然后对其内部元素样式进行覆写或是新增。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const StyledSelect = styled(Select)`
    div {
        color: red;
    }
`

那么在vanilla-extract样式块里是不能直接做到的,因为每个样式块都是针对某个元素,是不能直接通过该样式块,直接对其兄弟元素、子元素进行样式调整。但是,对于这种情况,是可以使用另一个APIglobalStyle进行开发。

globalStyle

顾名思义,就是全局样式API。但是因为本身vanilla-extractcss module,每个className都是独一无二,那么通过globalStyle来对其子元素进行样式调整覆盖完全是可行的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { style, globalStyle } from '@vanilla-extract/css';

export const parentClass = style({});

globalStyle(`${parentClass} > div`, {
  color: 'red'
});

const Demo = () => (
    <div className={parentClass}>
        <Select/>
    </div>
)

相比于 Styled-components 的优点

  • 零运行时;
  • 样式开发走Typescript安全类型;
  • style设计职责分离;(当然,styled-components也是可以的,只是完全取决于看开发者)
  • ...

总结

目前了解下来,vanilla-extract是一个总体还不错的css in js库,虽然目前使用率比较低,但是后续厂商平台项目会考虑在一些地方使用看看效果(毕竟不会增大js体积)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tecvan 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CSS Modules VS. styled-components,哪个才是解决 CSS 不足之处的更好方案?
CSS 是一门标记语言,用于元素布局及样式定义。它存在很多问题,例如书写效率和维护性低;缺乏模块机制、变量、函数等概念;容易出现全局样式污染和样式冲突等。目前前端社区存在很多解决上述问题的方案,主要包括 CSS Module以及 styled-components💅(CSS-in-JS 的代表)。 styled-components 在我的日常开发中用得很多,并且用得非常顺手。它的 CSS-in-JS 思想以及通过 props 来动态更改样式跟 React 的开发理念一脉相承,并且还基于 React Con
玖柒的小窝
2021/10/31
8K1
CSS Modules VS. styled-components,哪个才是解决 CSS 不足之处的更好方案?
CSS in JS的好与坏
CSS-in-JS是一种技术(technique),而不是一个具体的库实现(library)。简单来说CSS-in-JS就是将应用的CSS样式写在JavaScript文件里面,而不是独立为一些 .css, .scss或者 less之类的文件,这样你就可以在CSS中使用一些属于JS的诸如模块声明,变量定义,函数调用和条件判断等语言特性来提供灵活的可扩展的样式定义。值得一提的是,虽然CSS-in-JS不是一种很新的技术,可是它在国内普及度好像并不是很高,它当初的出现是因为一些 component-based的Web框架(例如React,Vue和Angular)的逐渐流行,使得开发者也想将组件的CSS样式也一块封装到组件中去以解决原生CSS写法的一系列问题。还有就是CSS-in-JS在React社区的热度是最高的,这是因为React本身不会管用户怎么去为组件定义样式的问题,而Vue和Angular都有属于框架自己的一套定义样式的方案。
进击的大葱
2022/08/22
2.4K0
CSS in JS的好与坏
再见,CSS-in-JS
大家好,我 ssh。在过去的开发中,我一直在用 styled-component 库作为 CSS 的解决方案。它有很多优点,灵活、可复用性强、功能强大、可以接受动态 JS 变量传入组件等等…… 但今天我看到一篇文章,说都是 Spot 团队的人已经决定抛弃 CSS-in-JS 的方案了,因为对他们来说,性能损耗已经远远超过其灵活性的优势了。接下来,我来和大家分享一下这篇Why We're Breaking Up with CSS-in-JS
ssh_晨曦时梦见兮
2023/10/14
5120
再见,CSS-in-JS
5件你可能不知道可以使用 CSS-in-JS 来做的事情
除了传统的 CSS,你还可以使用 内联样式 和 CSS-in-JS 作为 React 应用程序的样式选项。
一墨编程学习
2019/01/02
1.5K0
为什么和 CSS-in-JS 说拜拜
本文是由 Emotion 的第二大活跃维护者 Sam 分享,本文第一人称都指的是 Sam。Emotion 是一个广泛流行的 CSS-in-JS 库,用于React。文文章 Sam 会带大家深入探讨 CSS-in-JS 最初吸引人的原因,以及为什么作者(以及Spot团队的其他成员)决定放弃它。
前端小智@大迁世界
2022/11/30
2.4K0
为什么和 CSS-in-JS 说拜拜
精读《我们为何弃用 css-in-js》
emotion 排名第二的维护者 Sam 所在公司弃用了 css-in-js 方案,引起了不小的讨论:Why We're Breaking Up with CSS-in-JS
黄子毅
2022/11/21
1.2K0
React组件设计实践总结03 - 样式的管理
CSS 是前端开发的重要组成部分,但是它并不完美,本文主要探讨 React 样式管理方面的一些解决方案,目的是实现样式的高度可定制化, 让大型项目的样式代码更容易维护.
_sx_
2019/08/07
7.2K0
React组件设计实践总结03 - 样式的管理
css-in-js 探讨
Web开发是需要掌握多种技术。我们习惯于与多种语言密切合作。而且,随着开发Web应用程序变得越来越普遍和差别细微化,我们经常寻找创造性的方法来弥合这些语言之间的差距,从而使我们的开发环境和工作流程更容易,更高效。
frontoldman
2019/09/03
5.5K0
在React项目中使用CSS Module
就在前几天,写了一篇CSS 20大酷刑,然后看后台数据,反馈还是挺好的,看来大家还是对这个「最熟悉的陌生人」,有种「食之无味,弃之可惜」的感觉。在上篇中,我们就说过,由于CSS庞杂的体系和令人眼花缭乱的属性,总是让人「望而却步」。但是,它也是我们翻身农奴做主人,势必要翻过的四座大山之一 CSS/Html/JavaScript/WebAsssembly。(自认为,WebAssembly也会成为一座我们需要逾越的大山,有关它的介绍,可以看我们之前写的浏览器第四种语言-WebAssembly)
前端柒八九
2023/09/10
1.5K0
在React项目中使用CSS Module
React基础(10)-React中编写样式CSS(styled-components)
React是一个构建用户界面的js库,从UI=render()这个等式中就很好的映射了这一点,UI的显示取决于等式右边的render函数的返回值.
itclanCoder
2020/10/17
4.4K0
7. 精读《请停止 css-in-js 的行为》
styled-components 利用 ES6 的 tagged template 语法创建 react 纯样式组件。消除了人肉在 dom 和 css 之间做映射和切换的痛苦,并且有大部分编辑器插件的大力支持(语法高亮等)。此外,styled-components 在 ReactNaive 中尤其适用。
黄子毅
2022/03/14
2K0
7. 精读《请停止 css-in-js 的行为》
【React】:CSS 模块化
以下是 CSS Guidelines 中的一个示例,这个示例展示了一个问题:除了写这段代码的人,没有人知道这段代码是干什么的。
WEBJ2EE
2020/07/14
1.3K0
【React】:CSS 模块化
react的css
与传统 html 标签类属性不同,react 中 class 必须编写为 className,比如
愧怍
2022/12/27
1.6K0
react的css
CSS Modules与Styled Components:提升CSS可维护性
CSS Modules和Styled Components都是现代Web开发中用于提升CSS可维护性的解决方案,它们通过不同的方式解决了传统CSS的一些问题,如样式冲突、命名约定和全局作用域。
天涯学馆
2024/08/17
1130
技术天地 | CSS-in-JS:一个充满争议的技术方案
为了解决传统CSS在现代前端应用开发中遇到的痛点,FreeWheel评估了大量新一代的CSS框架/工具/方案。在本文中,作者以评估过程为线索,介绍了CSS-in-JS的背景、现状、开发特点和趋势。
用户6543014
2020/08/07
2.6K0
技术天地 | CSS-in-JS:一个充满争议的技术方案
如何在 React 中优雅的写 CSS
看目录结构清晰明了,由于“ CSS 文件分离 != CSS 作用域隔离”这样的机制,如果我们不通过一些工具或规范来解决 CSS 的作用域污染问题,会产生非预期的页面样式渲染结果。
政采云前端团队
2019/12/20
4.1K0
如何在 React 中优雅的写 CSS
styled-components不完全手册
大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder
前端柒八九
2024/03/25
1240
styled-components不完全手册
Emotion库维护者解释为什么Spot公司不再使用运行时CSS-in-JS
Sam Magura 是 Spot 的软件工程师,也是活跃的 Emotion 库维护者。最近,他详细解释了 Spot 公司为什么放弃运行时 CSS-in-JS 库 Emotion,而选择了 Sass 模块——运行时开销、负载开销和服务器端渲染问题导致了较差的用户体验。
深度学习与Python
2022/11/28
7630
React 进阶 - 模块化 CSS
随着 React 项目日益复杂化、繁重化,React 中 css 面临很多问题,比如样式类名全局污染、命名混乱、样式覆盖等。这时, css 模块化就显得格外重要。
Cellinlab
2023/05/17
2K0
React 进阶 - 模块化 CSS
27. 精读《css-in-js 杀鸡用牛刀》
继 精读《请停止 css-in-js 的行为》 这篇文章之后,我们又读了一篇抵制 css-in-js 的文章,虽然大部分观点都有道理,但部分存在可商榷之处,让我们分析一下这篇文章,了解 css 还做了哪些努力,以及 css-in-js 会如何发展。
黄子毅
2022/03/14
7500
27. 精读《css-in-js 杀鸡用牛刀》
相关推荐
CSS Modules VS. styled-components,哪个才是解决 CSS 不足之处的更好方案?
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文