Vite中css模块化的处理
这些全都是在node端实现的。
- vite在读取到main.js中引用到的css文件
- 使用fs模块去读取css文件的内容
- 然后创建一个style标签,文件的内容注入到这个标签里面
- 将这个style标签插入到index.html的head标签里面
- 原本的css内容会被替换成js脚本,方便后续的热更新
| 12
 3
 4
 5
 
 | html, body {width: 100%;
 height: 100%;
 background: #646cff;
 }
 
 | 
以上便是vite处理css文件的流程
为什么要进行模块化的处理,因为在实际开发中,对于一些样式类的命名,在团队中可能你开发了一个组件,写了一个样式类名叫
.content,
在协同开发中,另一个人也写了一个样式类名叫.content。这样就造成了样式冲突。
下面来介绍模块化的处理,在vue模板文件中,我们常常会这样写
| 12
 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文件夹。
目录结构如下
| 12
 3
 4
 5
 6
 7
 
 | src├── component_test
 │   ├── styles
 │   │   └── componentACSS.module.css
 │   │   └── componentBCSS.module.css
 │   └── ComponentA.js
 │   └── ComponentB.js
 
 | 
内容如下
| 12
 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;
 }
 
 | 
| 12
 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;
 }
 
 | 
| 12
 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;
 
 | 
| 12
 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这个工程,后续学习我应该会继续扩展这个工程。
| 12
 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
 }
 })
 
 |