研发都应该了解的如何在vite中接入现代化css工程化方案

news/2024/10/22 14:19:46

作者:京东物流 刘微微

背景

好的css工程化方案可以增强我们项目的可维护性、提高样式的复用性、进行自动化处理等,在提高页面加载速度和性能的同时,我们可以有更多的精力进行js逻辑的处理。

添加全局样式文件

使用场景: 有一个scss/less文件,此文件中定义了一些全局变量,需要在其他的样式文件中使用,此时需要将这些变量放在全局

// vite.config.ts
// 全局 scss 文件的路径
const variablePath = path.resolve("./src/variable.scss");export default defineConfig({// css 相关的配置css: {preprocessorOptions: {scss: {// additionalData 的内容会在每个 scss 文件的开头自动注入additionalData: `@import "${variablePath}";`}}}
})

CSS Modules

CSS Modules 在 Vite 也是一个开箱即用的能力,Vite 会对后缀带有.module的样式文件自动应用 CSS Modules。接下来我们通过一个简单的例子来使用这个功能。

首先,将 Header 组件中的index.scss更名为index.module.scss,然后稍微改动一下index.tsx的内容,如下:

// index.tsx
import styles './index.module.scss';
export function Header() {return <p className={styles.header}>This is Header</p>
};

PostCSS自动添加css兼容前缀

一般你可以通过 postcss.config.js 来进行 postcss 的配置,不过在 Vite 配置文件中已经提供了 PostCSS 的配置入口,我们可以直接在 Vite 配置文件中进行操作。

首先,我们来安装一个常用的 PostCSS 插件——autoprefixer:

pnpm i autoprefixer -D

这个插件主要用来自动为不同的目标浏览器添加样式前缀,解决的是浏览器兼容性的问题。接下来让我们在 Vite 中接入这个插件:

// vite.config.ts 增加如下的配置export default {css: {// 进行 PostCSS 配置postcss: {plugins: [autoprefixer({// 指定目标浏览器overrideBrowserslist: ['Chrome > 40', 'ff > 31', 'ie 11']})]}}
}

CSS 原子化框架

在目前的社区当中,CSS 原子化框架主要包括Tailwind CSS 和 Windi CSS。Windi CSS 作为前者的替换方案,实现了按需生成 CSS 类名的功能,开发环境下的 CSS 产物体积大大减少,速度上比Tailwind CSS v2快 20~100 倍!当然,Tailwind CSS 在 v3 版本也引入 JIT(即时编译) 的功能,解决了开发环境下 CSS 产物体积庞大的问题,但这也是后来的事情了。接下来我们还是选择 Windi CSS 作为 CSS 原子化框架来接入到 Vite 中。

首先安装 windicss 及对应的 Vite 插件:

pnpm i windicss vite-plugin-windicss -D

随后我们在配置文件中来使用它:

// vite.config.ts
import windi from "vite-plugin-windicss";export default {plugins: [// 省略其它插件windi()]
}

接着要注意在src/main.tsx中引入一个必需的 import 语句:

// main.tsx
// 用来注入 Windi CSS 所需的样式,一定要加上!
import "virtual:windi.css";

这样我们就完成了 Windi CSS 在 Vite 中的接入,接下来我们在 Header 组件中来测试,组件代码修改如下:

// src/components/Header/index.tsx
import { devDependencies } from "../../../package.json";export function Header() {return (<div className="p-20px text-center"><h1 className="font-bold text-2xl mb-2">vite version: {devDependencies.vite}</h1></div>);
}

windicss的 attributify 和 shortcuts

除了本身的原子化 CSS 能力,Windi CSS 还有一些非常好用的高级功能,在此我给大家推荐自己常用的两个能力: attributify 和 shortcuts。

要开启这两个功能,我们需要在项目根目录新建windi.config.ts,配置如下:

import { defineConfig } from "vite-plugin-windicss";export default defineConfig({// 开启 attributifyattributify: true,
});

首先我们来看看attributify,翻译过来就是属性化,也就是说我们可以用 props 的方式去定义样式属性,如下所示:

<button bg="blue-400 hover:blue-500 dark:blue-500 dark:hover:blue-600"text="sm white"font="mono light"p="y-2 x-4"border="2 rounded blue-200"
>Button
</button>

这样的开发方式不仅可以省去了繁琐的 className 内容,而且还加强了语义化,代码更容易维护,可以说大大提升了开发体验。

shortcuts 用来封装一系列的原子化能力,尤其是一些常见的类名集合,我们在 windi.config.ts来配置它:

//windi.config.ts
import { defineConfig } from "vite-plugin-windicss";export default defineConfig({attributify: true,shortcuts: {"flex-c": "flex justify-center items-center",}
});

比如这里封装了flex-c的类名,接下来我们可以在业务代码直接使用这个类名:

<div className="flex-c"></div>
<!-- 等同于下面这段 -->
<div className="flex justify-center items-center"></div>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74631.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

怎么申请电子邮箱

申请电子邮箱的步骤:1.确定用户类型,选择典型代表;2.设定申请目标,明确申请流程;3.选择申请方式,确定申请渠道;4.安排申请流程,按步骤进行;5.研究用户需求,满足期望。电子邮箱申请的第一步是确定用户类型。1.确定用户类型,选择典型代表电子邮箱申请的第一步是确定用…

医疗健康行业获客难?来看这位区域总经理的业绩增长破局之道

在医疗健康行业摸爬滚打多年的老张是一家知名医疗器械公司的区域总经理。 医疗健康行业的客户生态复杂多样,主要分为终端医院与渠道两大核心板块。对于终端医院,老张采取的是稳健而深入的列名经营策略,通过持续不断的学术交流、积极参与行业展会以及国家、省市等各级别的招投…

Taro 鸿蒙技术内幕系列(一):如何将 React 代码跑在 ArkUI 上

作者:京东零售 朱鸣辉基于 Taro 打造的京东鸿蒙 APP 已跟随鸿蒙 Next 系统公测,本系列文章将深入解析 Taro 如何实现使用 React 开发高性能鸿蒙应用的技术内幕 背景 随着鸿蒙操作系统的快速发展,开发者们期待将现有跨平台应用迁移到鸿蒙平台。Taro作为一个流行的跨平台开发框…

设置弹性域缺省值

如何设置辅助属性默认值,并在单据上直接带出默认值?

在网络图中什么是ES、EF、LS、LF、TF、FF

在项目管理中的网络图中,ES(Early Start)、EF(Early Finish)、LS(Late Start)、LF(Late Finish)、TF(Total Float)和FF(Free Float)是关键路径方法(Critical Path Method,CPM)中用于描述活动和事件时间的重要概念。1. 在网络图中ES、EF、LS、LF、TF、FF的基本介…

Dify - 使用小记

Dify - 使用小记 记录使用 Dify 创建小流程

k8s 中的 Gateway API 的背景和简介【k8s 系列之四】

本文通过介绍 Gateway API 的背景和各种类型的资源,简单介绍了 Gateway API 的配置和请求流,供参考。〇、Gateway API 的背景 第一阶段:Service 初始的 Kubernetes 内部服务向外暴露,使用的是自身的 LoadBlancer 和 NodePort 类型的 Service。 在集群规模逐渐扩大的时候,这…

LaMI-DETR:基于GPT丰富优化的开放词汇目标检测 | ECCV24

现有的方法通过利用视觉-语言模型(VLMs)(如CLIP)强大的开放词汇识别能力来增强开放词汇目标检测,然而出现了两个主要挑战:(1)概念表示不足,CLIP文本空间中的类别名称缺乏文本和视觉知识。(2)对基础类别的过拟合倾向,在从VLMs到检测器的转移过程中,开放词汇知识偏向…