处理样式
普通CSS
TIP
vite
支持直接处理css
main.js
import './common.css'
console.log('handle style')
common.css
html {
background-color: #f5f5f5;
}
处理css
的流程如下:
vite
解析文件时,读取到main.js
中引用到了common.css
使用
fs
模块读取common.css
的文件内容创建
style
标签,将common.css
中的文件内容复制到style
标签中,并将style
标签插入到index.html
的head
标签中将
common.css
的内容替换为js脚本(方便热更新/css模块化)
,同时设置Content-Type为application/javascript
,让浏览器以js脚本
的形式来执行该css后缀
的文件
经过vite
处理后,最终加载请求到的common.css
内容如下:
请求common.css
的响应头如下:
CSS Module
TIP
vite
默认支持css模块化
css
文件以.module.css
结尾,表明要开启css模块化
将css
文件命名为xxx.module.css
,引入js
文件中,处理CSS Module
流程如下:
vite
会将xxx.module.css
文件中所有类名
进行替换(例如将countWrapper
替换为_countWrapper_xxx
)- 将替换过后的内容放进
style
标签中然后插入到index.html
的head
标签中 - 同时会创建一个映射对象
{countWrapper: '_countWrapper_xxx'}
- 将
xxx.module.css
内容替换成js
脚本,将创建的映射对象在脚本中导出
src/Count/index.js
export const num = 100;
import styles from './count.module.css'
const countDiv = document.createElement('div');
countDiv.classList.add(styles.countWrapper)
document.body.appendChild(countDiv);
// {countWrapper: '_countWrapper_2td7t_1'} 'count styles'
console.log(styles, 'count styles');
count.module.css
.countWrapper {
width: 200px;
height: 200px;
background-color: aqua;
font-size: 22px;
}
经过vite
处理后,最终加载请求到的count.module.css
内容如下:
CSS Module
配置
modules
中的配置最终会传给postcss-modules
interface CSSModulesOptions {
scopeBehaviour?: 'global' | 'local'
globalModulePaths?: RegExp[]
generateScopedName?:
| string
| ((name: string, filename: string, css: string) => string)
hashPrefix?: string
/**
* default: null
*/
localsConvention?:
| 'camelCase'
| 'camelCaseOnly'
| 'dashes'
| 'dashesOnly'
| null
}
vite.config.js
/**
* @type {import('vite').UserConfig}
*/
const config = {
css: {
modules: {
localsConvention: 'camelCase',
scopeBehaviour: 'local',
generateScopedName: "[name]__[local]___[hash:base64]",
hashPrefix: undefined,
globalModulePaths: undefined
}
}
}
export default config;
scopeBehaviour: 配置当前的模块化行为是模块化还是全局,配置成全局
global
后,css
模块化会失效,默认是local
globalModulePaths: 不参与
css
模块化的文件名称路径generateScopedName: 自定义
CSS Module
生成类名的规则,具体可以看这里hashPrefix: 此字段会参与生成
hash
字符串,在generateScopedName
选项中可用到此hash
localsConvention: 修改生成的映射对象中的
key
的形式,是驼峰
还是中划线
Sass/Less
Vite
本身对CSS
各种预处理器语言(Sass/Scss、Less
)等做了内置支持只需要安装
Sass/Less
,然后就可以使用Sass/Less
编写样式了
pnpm install -D sass
# 或者
pnpm install -D less
预处理器编译选项
- 通过配置
preprocessorOptions
选项来设置sass/less
编译时的配置
例如
vite.config.js
import path from "node:path";
/**
* @type {import('vite').UserConfig}
*/
const config = {
resolve: {
alias: {
'@src': path.resolve(__dirname, 'src')
}
},
css: {
modules: {
localsConvention: 'camelCase',
scopeBehaviour: 'local',
// generateScopedName: "[name]__[local]___[hash:base64]",
// hashPrefix: 'custom_prefix',
// globalModulePaths: null
},
preprocessorOptions: {
scss: {
//define global scss variable
additionalData: `@import '@src/variable.scss';`
},
less: {
// xxx
}
}
}
}
export default config;
开启sourceMap
通过配置
devSourcemap
选项来开启CSS sourceMap
开发环境都是通过创建
style
标签,将处理过后css
内容放入style
标签然后将style
标签插入到index.html
的head
标签中,当想要去调试时,很不方便,可以通过开启CSS sourceMap
来方便调试
import path from "node:path";
/**
* @type {import('vite').UserConfig}
*/
const config = {
resolve: {
alias: {
'@src': path.resolve(__dirname, 'src')
}
},
css: {
modules: {
localsConvention: 'camelCase',
scopeBehaviour: 'local',
// generateScopedName: "[name]__[local]___[hash:base64]",
// hashPrefix: 'custom_prefix',
// globalModulePaths: null
},
preprocessorOptions: {
scss: {
//define global scss variable
additionalData: `@import '@src/variable.scss';`
}
},
devSourcemap: true, // 开启css sourceMap
}
}
export default config;
postcss
配置
- 针对
postcss
有两种不同的配置方式- 内联配置,格式和
postcss.config.js
一致,但是对于plugins
选项只支持数组
格式,点击这里查看说明 - 使用postcss-load-config插件推荐的配置方法(
vite
内置了postcss-load-config
插件)
- 内联配置,格式和
WARNING
如果提供了内联配置
,Vite
将不会搜索其他PostCSS
配置源
示例
例如配置浏览器兼容前缀(该示例使用
内联配置
)
- 下载
autoprefixer
pnpm install autoprefixer -D
- 配置
vite.config.js
如下
import path from "node:path";
import autoprefixer from "autoprefixer";
/**
* @type {import('vite').UserConfig}
*/
const config = {
resolve: {
alias: {
'@src': path.resolve(__dirname, 'src')
}
},
css: {
modules: {
localsConvention: 'camelCase',
scopeBehaviour: 'local',
// generateScopedName: "[name]__[local]___[hash:base64]",
// hashPrefix: 'custom_prefix',
// globalModulePaths: null
},
preprocessorOptions: {
scss: {
//define global scss variable
additionalData: `@import '@src/variable.scss';`
}
},
devSourcemap: true,
postcss: {
plugins: [autoprefixer()]
}
}
}
export default config;
效果如下:
- 关于
postcss
插件更多内容,可以查看www.postcss.parts
其他
相关代码可查看handle-style