当前位置: 首页 > news >正文

React - css 模块化(modules)

什么是 css modules?

因为 React 没有Vue的Scoped,但是React又是SPA(单页面应用),所以需要一种方式来解决css的样式冲突问题,也就是把每个组件的样式做成单独的作用域,实现样式隔离,而css modules就是一种解决方案,但是我们需要借助一些工具来实现,比如webpack,postcss,css-loader,vite等。

如何在Vite中使用css modules

css modules,可以配合各种css预处理去使用,例如lesssassstylus等。

安装css预处理
npm install less -D // 安装less 任选其一
npm install sass -D // 安装sass 任选其一
npm install stylus -D // 安装stylus 任选其一
在Vite中css Modules 是开箱即用的,只需要把文件名设置为xxx.module.[css|less|sass|stylus],就可以使用css modules了。
案例

src/components/Async/index.module.scss

.async {color: red;
}

 使用

src/components/Async/index.tsx

import style from './index.module.scss'
const AsyncComponent =()=> {return (<div className={style.async}>Async</div>)
}export default AsyncComponent

编译结果

可以看到async类名被编译成了_async_8ofwx_1,这就是css modules的实现原理,通过在类名前添加一个唯一的哈希值,来实现样式隔离。

 

修改css modules 规则 

在vite.config.ts中配置css modules的规则
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react-swc'// https://vite.dev/config/
export default defineConfig({plugins: [react()],css: {modules: {localsConvention: 'dashes', // 修改css modules的类名规则 可以改成驼峰命名 或者 -命名等generateScopedName: '[name]__[local]___[hash:base64:5]', // 修改css modules的类名规则},},
})
localsConvention配置
 localsConvention: 'camelCaseOnly', // camelCaseOnly 只会把非驼峰的命名转为驼峰,并删除之前的类名localsConvention: 'camelCase',  //camelCase 会把非驼峰的命名转为驼峰,并保留之前的类名localsConvention: 'dashesOnly', // dashesOnly 会将所有的-类名转化为驼峰,并且原始的类名会被删除localsConvention: 'dashes', // dashes 会将所有的-类名转化为驼峰,会保留原始的类名
 如果想同时支持驼峰命名和-连接的命名
localsConvention:[camelCase|dashes] //可以设置为localsConvention:[camelCase|dashes],这样就可以同时支持驼峰命名和-连接的命名。
 generateScopedName配置
  generateScopedName: '[local]_[hash:base64:5]' // 只保留类名和哈希值generateScopedName: '[hash:base64:8]' // 只使用哈希值generateScopedName: '[name]_[local]' // 只使用文件名和类名,没有哈希generateScopedName: '[local]--[hash:base64:4]' // 自定义分隔符
<button class="button_pmkzx_6">类名 + 哈希值</button>
<button class="pmkzx_6">哈希值</button>
<button class="index-module_button">文件名 + 类名</button>
<button class="button--pmkzx_6">类名 + 分隔符 + 哈希值</button>

维持类名  

意思就是说在样式文件中的某些样式,不希望被编译成css modules,可以设置为global,例如:

.app{background: red;width: 200px;height: 200px;:global(.button){color:red;}
}
//在使用的时候,就可以直接使用原始的类名 button
import styles from './index.module.scss';
const App: React.FC = () => {return (<><div className={styles.app}><button className='button'>按钮</button></div></>);
}

http://www.lryc.cn/news/585825.html

相关文章:

  • 解决‘vue‘ 不是内部或外部命令,也不是可运行的程序
  • 智慧公安总体建设方案PPT(78页)
  • 江协科技STM32入门教程——通信接口
  • 《Java Web程序设计》实验报告四 Java Script前端应用和表单验证
  • Vue.js:从 Web 到桌面的跨端实践与技术选型指南
  • C++11的整理笔记
  • 【PTA数据结构 | C语言版】出栈序列的合法性
  • 20250712-3-Kubernetes 应用程序生命周期管理-服务编排(YAML)及编写技巧_笔记
  • 【算法笔记】7.LeetCode-Hot100-图论专项
  • Java 接口详解:从基础到高级,掌握面向对象设计的核心契约
  • DBeaver连接MySQL8.0报错Public Key Retrieval is not allowed
  • 代码训练LeetCode(46)旋转图像
  • 视频分析应用的搭建
  • Java 大视界 -- 基于 Java 的大数据可视化在城市生态环境监测与保护决策中的应用(344)
  • xFile:你的 Windows/Linux,也能像 Mac 一样安全
  • 深入理解大语言模型:从核心技术到极简实现
  • Qt窗口:菜单栏
  • 企业选择大带宽服务器租用的原因有哪些?
  • Spring Ai Alibaba Gateway 实现存量应用转 MCP 工具
  • 如何查看服务器当前用户的权限
  • [es自动化更新] Updatecli编排配置.yaml | dockerfilePath值文件.yml
  • QT中设计qss字体样式但是没有用【已解决】
  • 进制转换小题
  • Django母婴商城项目实践(三)
  • 【Luogu】每日一题——Day1. P3385 【模板】负环
  • Redis概念和基础
  • [论文阅读] 人工智能 + 软件工程 | LLM辅助软件开发:需求如何转化为代码?
  • 端口到底是个什么鬼?回答我!
  • Java大厂面试故事:谢飞机的互联网医疗系统技术面试(Spring Boot、MyBatis、Kafka、Spring Security、AI等)
  • Umi-OCR 的 Docker安装(win制作镜像,Linux(Ubuntu Server 22.04)离线部署)