浅析在vite中如何处理css

vite中的默认特性

vite是天然支持css的

我们在工程中新建a.js文件,引入a.css文件

看下返回值和响应头

当浏览器请求css资源时,vite服务器默认会将对应的css解析成js代码返回 ,将对应的css代码copy到style标签里并插入html头部

这里和webpackcss-loaderstyle-loader是类似的,不同的是vite是在浏览器发出请求时才会做出这样的行为返回这样的内容,而webpack是一开始就会将对应的文件编译并将该部分代码嵌入到一个bundle中供浏览器加载。

为什么vite要将其解析成js代码呢?

  • 方便热更新
  • 方便做css模块化

vite中的css模块化

新建b.jsb.css

入口处先引入a.js 再引入 b.js

发现b.css的style是后插入的,相同类名覆盖掉了a.css,要想解决这个问题,我们就要引入css模块化的概念

a.cssb.css后缀改为a.module.cssb.module.css当成模块来引入并使用类名

很明显不同模块下的相同类名都被处理增加后缀了,样式并没有冲突,两个盒子分别对应两个类名

看下被vite处理过的css文件

很明显解析成的js代码具有导出功能 ,并对类名进行处理

打印一下a.js中导入的对象

总结一下
.mocule.css相当于一种约定 ,表示启用css模块化

  • 原本css部分的类名会被替换带有hash后缀的类名
  • 对应模块内部会导出一个映射对象,key 是原本我们起的类名,比如my-divvalue 是被替换后带有hash后缀的类名,比如._my-div_4u4xp_1。通过module[key]的形式就取到了替换后的类名

vite中内置postcss

vite中是天然内置postcss的,不过预设配置 (插件)还是需要我们手动添加配置的
yarn add postcss-preset-env -D

js 复制代码
    // postcss.config.js
    const postCssPresetEnv = require('postcss-preset-env')
    module.exports = {
        plugins: [postCssPresetEnv()]
    }

vite添加预处理器

vite中虽然天然支持css,但是预处理器还是需要我们手动添加配置的,比如less
yarn add less -D

js 复制代码
import { defineConfig } from "vite"
export default defineConfig({
    ...
    css: {
        // 对预处理器的一些配置 less scss
        preprocessorOptions: {
            less: {  // 可以做一些配置参数   webpack可以在less-loader中配置
                math: 'always',
                globalVars: {
                    contenColor: 'red', // 全局变量
                }
            }
        }
    }
    ...
})    

vite中关于css的配置

上面都是一些vite默认支持的一些特性,比如天然支持css,css模块化,postcss,如果我们想改变一些默认的特性可以通过vite.config.js

js 复制代码
import { defineConfig } from "vite"
// const postCssPresetEnv = require('postcss-preset-env')
export default defineConfig({
  ...
	css: {
		// modules的配置会传递给postcss modules
		modules: {
			localsConvention: 'dashes',  // 修改cssModule映射对象key的展示形式(中划线,驼峰) 'camelCase' | 'camelCaseOnly' | 'dashes' | 'dashesOnly'
			scopeBehaviour: 'local',  // local正常模块化,类名带hash;global 全局模块化类名不带hash,引入的映射对象是空的
			generateScopedName: '[name]_[local]_[hash:5]', // 转换后的类名  映射对象的value值
			hashPrefix: 'hello',  // 参与hash值的构成
			globalModulePaths: ['./style/b.module.css'] // 不想参与css模块化的路径(类名不带hash,引入的映射对象是空的)
		},
		// 对预处理器的一些配置 less scss
		preprocessorOptions: { // key : config 的形式 
			// yarn add less 内部会有lessc编译工具 
			less: {  
				// 可以做一些配置参数   webpack可以在less-loader中配置
				math: 'always',
				globalVars: {
					contenColor: 'red', // 全局变量
				}
			}
		},
		devSourcemap: true,
		// 也可以在postcss.config.js中写配置
		// postcss: {
		// 	plugins: [postCssPresetEnv()]
		// }
	}
})
相关推荐
泯泷4 分钟前
第 2 篇:设计第一套字节码:Opcode、Instruction 与 Constant Pool
前端·javascript·安全
妙码生花4 分钟前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
泯泷4 分钟前
第 1 篇:从 1 + 2 开始:亲手写出第一台 JSVM
前端·javascript·安全
团团崽_七分甜6 分钟前
Spring Boot 核心知识点总结
前端
lichenyang45321 分钟前
从一个按钮开始,理解 ASCF 框架到底在做什么
前端
古夕44 分钟前
第三方 SSO 接入实践:redirect_uri 编码、回调一致性与跨项目联调
前端·vue.js
朦胧之1 小时前
页面白屏卡住排查方法
前端·javascript
用户593608741401 小时前
Playwright 黑魔法:用 ClipboardEvent 绕过 React 富文本编辑器
前端
石山岭1 小时前
自己动手写了一个 Android 虚拟定位 App:GPSSimulate 技术实
android·前端
犇驫聊AI2 小时前
Chrome DevTools MCP + Claude Code 自定义skills生成接口代码生成器
前端·javascript