Vite5了用这个CSSModule 插件优雅进行样式隔离

无论是微服务还是大型的项目,样式多了就容易被覆盖,目前css-in-js,scoped等都可以来实现,当然我比较喜欢使用CSS-Module,主要可以自由的定制class名称,也可以很好的去做区分,Vite其实也提供了CssModule,也可以根据不同的文件来自定义名称,但抛弃不掉的是.module.scss, 下面就说一下类似webpack中oneOf功能的Vite CssModule 插件,可以针对不同的正则来使用不同的CSS Module规则。

这个使用了postcss -modules ,不清楚的可以进去看看github.com/madyankin/p...

安装

当然也可以使用yarn cnpm ,npm 都可以安装

js 复制代码
pnpm add -D vite-plugin-oneof-css-module

使用

在vite配置文件中,如下进行配置

js 复制代码
import { defineConfig } from 'vite';
import VitePluginOneofCssModule from "vite-plugin-oneof-css-module"
export default defineConfig({
      plugins: [
        VitePluginOneofCssModule({
            modules: [
                {
                    test: /\.scss$/,
                    generateScopedName: "k-[local]"
                }
            ]
        })
      ]
});

功能一

比如我想在项目中使用index.scss 文件

index.scss 文件中

css 复制代码
.box{
    width:100px;
    height:200px;
    border:1px solid red;
    
}

index.tsx 文件中

js 复制代码
import $style from "./index.scss"
<div className={$style.box}></div>

转换后的结果就是

css 复制代码
.k-box{
    width:100px;
    height:200px;
    border:1px solid red;
}

功能二

开启devsourcemap则转换后的class可以定位到具体的,默认false,如果在开发环境开启devsourcemap:true则转换后的class可以定位到具体的css位置,如果设置成false,则在style标签中

js 复制代码
export default defineConfig({
      css:{
          devSourcemap:true
      }
      plugins: [
        VitePluginOneofCssModule({
            modules: [
                {
                    test: /\.scss$/,
                    generateScopedName: "k-[local]"
                }
            ]
        })
      ]
});

功能三

可以针对不同的文件进行处理,比如说按如下配置

js 复制代码
export default defineConfig({
     
      plugins: [
        VitePluginOneofCssModule({
            modules: [
                {
                    test: /index\.scss$/,
                    generateScopedName: "k-[local]"
                },
                {
                    test: /app\.scss$/,
                    generateScopedName: "v-[local]"
                }
            ]
        })
      ]
});

app.scss文件

css 复制代码
.body{
    color:green;
}

app.tsx 文件

js 复制代码
import $style from "./app.scss"
<div className={$style.body}>我是另一个scss文件</div>

转换后结果为: app.scss

css 复制代码
.v-body{
    color:green;
}

index.scss

css 复制代码
.k-box{
    width:100px;
    height:200px;
    border:1px solid red;
}

功能四

可以使用additionalData 全局注入scss 变量,比如如下

php 复制代码
export default defineConfig({
     
      plugins: [
        VitePluginOneofCssModule({
            additionalData 全局注入: "$color:red;",
            modules: [
                {
                    test: /index\.scss$/,
                    generateScopedName: "k-[local]"
                },
                {
                    test: /app\.scss$/,
                    generateScopedName: "v-[local]"
                }
            ]
        })
      ]
});

在任何scss文件中可以直接使用$color 变量

css 复制代码
color:$color;

功能案例五

当然也可以添加postcss plugins 插件 ,可以使用postcssPlugin插件,这里就简单举个例子 比如使用postcss-preset-env 这个postcss 插件

arduino 复制代码
import postcssPresetEnv from "postcss-preset-env"
export default defineConfig({
     
      plugins: [
        VitePluginOneofCssModule({
            postcssPlugin: [
                postcssPresetEnv()
            ]
        })
      ]
});

如下

sql 复制代码
  user-select: none;

将被转换为

sql 复制代码
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;

混合使用

当然,你如果在VitePluginOneofCssModule不去匹配这个文件,那该文件是被Vite内置的插件处理的,如下可以混合处理的

javascript 复制代码
import $style from './App.scss'
import "./index.scss"
function App () {
    return (
        <div className={$style.app}>
            我是APP
            <div className='header'></div>
            <div className={$style.body}>
                我是body
            </div>
        </div>
    )
}

export default App
相关推荐
是一碗螺丝粉9 小时前
React Native 运行时深度解析
前端·react native·react.js
Jing_Rainbow9 小时前
【前端三剑客-9 /Lesson17(2025-11-01)】CSS 盒子模型详解:从标准盒模型到怪异(IE)盒模型📦
前端·css·前端框架
爱泡脚的鸡腿9 小时前
uni-app D6 实战(小兔鲜)
前端·vue.js
青年优品前端团队9 小时前
🚀 不仅是工具库,更是国内前端开发的“瑞士军刀” —— @qnvip/core
前端
北极糊的狐9 小时前
Vue3 中父子组件传参是组件通信的核心场景,需遵循「父传子靠 Props,子传父靠自定义事件」的原则,以下是资料总结
前端·javascript·vue.js
看到我请叫我铁锤9 小时前
vue3中THINGJS初始化步骤
前端·javascript·vue.js·3d
q***252110 小时前
SpringMVC 请求参数接收
前端·javascript·算法
q***333710 小时前
Spring Boot项目接收前端参数的11种方式
前端·spring boot·后端
烛阴10 小时前
从`new()`到`.DoSomething()`:一篇讲透C#方法与构造函数的终极指南
前端·c#
还债大湿兄10 小时前
阿里通义千问调用图像大模型生成轮动漫风格 python调用
开发语言·前端·python