Vite中css模块化的处理
这些全都是在node端实现的。
- vite在读取到main.js中引用到的css文件
- 使用fs模块去读取css文件的内容
- 然后创建一个style标签,文件的内容注入到这个标签里面
- 将这个style标签插入到index.html的head标签里面
- 原本的css内容会被替换成js脚本,方便后续的热更新
1 2 3 4 5
| html, body { width: 100%; height: 100%; background: #646cff; }
|
以上便是vite处理css文件的流程
为什么要进行模块化的处理,因为在实际开发中,对于一些样式类的命名,在团队中可能你开发了一个组件,写了一个样式类名叫
.content
,
在协同开发中,另一个人也写了一个样式类名叫.content
。这样就造成了样式冲突。
下面来介绍模块化的处理,在vue模板文件中,我们常常会这样写
1 2 3
| <template></template> <script></script> <style scope></style>
|
这个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 2 3 4 5 6 7
| src ├── component_test │ ├── styles │ │ └── componentACSS.module.css │ │ └── componentBCSS.module.css │ └── ComponentA.js │ └── ComponentB.js
|
内容如下
1 2 3 4 5 6 7 8 9
| .card{ background-color: #f4f4f4; width: 400px; margin: 20px auto; padding: 20px; border-radius: 10px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); height: 100px; }
|
1 2 3 4 5 6 7 8 9
| .card{ background-color: darkred; width: 400px; margin: 20px auto; padding: 20px; border-radius: 10px; box-shadow: 0 2px 5px rgba(0,0,0,0.1); height: 100px; }
|
1 2 3 4 5
| import componentACSS from './styles/componentACSS.module.css'; const div = document.createElement('div'); console.log(componentACSS); document.body.appendChild(div); div.className = componentACSS.card;
|
1 2 3 4 5
| import componentBCSS from './styles/componentBCSS.module.css'; const div = document.createElement('div'); console.log(componentBCSS) document.body.appendChild(div); div.className = componentBCSS.card
|
别忘记在main.js中引入这两个组件
检验
在下面可以看到,两个组件的样式都是独立的,不会互相影响,这就是css模块化的处理。并且可以看到,这个被哈希化的css样式类名
被映射到js脚本中并被默认导出了。
vite中css模块化的处理
这里直接把一个基础的示例配置文件放出来,这个基础配置是vite环境变量的配置那片文章延申出来的
具体的github项目地址在这里,对应目录下的是test-vite这个工程,后续学习我应该会继续扩展这个工程。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| import {defineConfig} from 'vite'
export default defineConfig({ optimizeDeps: { exclude: [], }, envPrefix: 'ENV_', css: { modules: { localsConvention: "camelCaseOnly", scopeBehaviour: "local", hashPrefix: "hello", globalModulePaths: [], }, preprocessorOptions: { less: { math: "always", globalVars: { primaryColor: "#1890ff", successColor: "#52c41a", warningColor: "#faad14", errorColor: "#f5222d", defaultColor: "#d9d9d9", }, } }, devSourcemap: true } })
|