Vite中css模块化的处理
这些全都是在node端实现的。
- vite在读取到main.js中引用到的css文件
- 使用fs模块去读取css文件的内容
- 然后创建一个style标签,文件的内容注入到这个标签里面
- 将这个style标签插入到index.html的head标签里面
- 原本的css内容会被替换成js脚本,方便后续的热更新
1 | html, body { |
css文件被替换成了js脚本
文件内容被插入到head标签里面
以上便是vite处理css文件的流程
为什么要进行模块化的处理,因为在实际开发中,对于一些样式类的命名,在团队中可能你开发了一个组件,写了一个样式类名叫.content
,
在协同开发中,另一个人也写了一个样式类名叫.content
。这样就造成了样式冲突。
下面来介绍模块化的处理,在vue模板文件中,我们常常会这样写
1 | <template></template> |
这个scope就是限制了样式的作用域,只在当前组件中生效,这样就不会影响到其他组件的样式。
就是利用cssModule这个特性来实现的。
- module.css是一种约定,给样式文件带上一个module就说明开启了css模块化。
- 开启之后,vite会将这个文件里面的所有类名通过一个hash算法生成一个唯一的类名,比如
.content
会被转换成.content_1q2w3e4r5t6y7u8i9o0p
这样的类名。 - 并且会创建一个映射对象
{content: content_1q2w3e4r5t6y7u8i9o0p}
- 同样的,这些个module.css、module.less、module.scss里面的内容都会被替换成js脚本,方便后续的热更新。
- {
3
中所创建的映射对象会被js脚本默认导出,这样我们就可以在vue模板文件中使用这个对象了。
示例工程实践
在项目根目录下的src
文件夹中创建一个component_test文件夹。
目录结构如下
1 | src |
内容如下
componentACSS.module.css
1 | .card{ |
1 | .card{ |
1 | import componentACSS from './styles/componentACSS.module.css'; |
1 | import componentBCSS from './styles/componentBCSS.module.css'; |
别忘记在main.js中引入这两个组件
检验
在下面可以看到,两个组件的样式都是独立的,不会互相影响,这就是css模块化的处理。并且可以看到,这个被哈希化的css样式类名
被映射到js脚本中并被默认导出了。
console选项卡
network选项卡
element选项卡
vite中css模块化的处理
这里直接把一个基础的示例配置文件放出来,这个基础配置是vite环境变量的配置那片文章延申出来的
具体的github项目地址在这里,对应目录下的是test-vite这个工程,后续学习我应该会继续扩展这个工程。
1 | // 基础配置 |