CSS Module:告别类名冲突,拥抱模块化样式(5)

CSS Module 是一种解决 CSS 类名冲突的全新思路。它通过构建工具(如 webpack)将 CSS 样式切分为更加精细的模块,并在编译时将类名转换为唯一的标识符,从而避免类名冲突。本文将详细介绍 CSS Module 的实现原理和使用方法。

1. 思路

CSS Module 遵循以下思路解决类名冲突问题:

  1. 类名冲突:类名冲突往往发生在大型项目中。
  2. 构建工具:大型项目往往会使用构建工具(如 webpack)搭建工程。
  3. 模块化:构建工具允许将 CSS 样式切分为更加精细的模块。
  4. 变量机制:同 JS 的变量一样,每个 CSS 模块文件中难以出现冲突的类名,冲突的类名往往发生在不同的 CSS 模块文件中。
  5. 避免冲突:只需要保证构建工具在合并样式代码后不会出现类名冲突即可。
    在这里插入图片描述

2. 实现原理

在 webpack 中,作为处理 CSS 的 css-loader,它实现了 CSS Module 的思想。要启用 CSS Module,需要将 css-loader 的配置 modules 设置为 true

css-loader的实现方式如下:
在这里插入图片描述

原理极其简单,开启了css module后,css-loader会将样式中的类名进行转换,转换为一个唯一的hash值。

由于hash值是根据模块路径和类名生成的,因此,不同的css模块,哪怕具有相同的类名,转换后的hash值也不一样。

在这里插入图片描述

3. 如何应用样式

css module带来了一个新的问题:源代码的类名和最终生成的类名是不一样的,而开发者只知道自己写的源代码中的类名,并不知道最终的类名是什么,那如何应用类名到元素上呢?

为了解决这个问题,css-loader会导出原类名和最终类名的对应关系,该关系是通过一个对象描述的
在这里插入图片描述

3.1 示例

假设有一个 CSS 文件 style.css

.red {color: #f40;
}

在 JS 文件中,可以这样导入和应用类名:

import React from 'react';
import styles from './style.css';function App() {return (<div className={styles.red}>Hello, World!</div>);
}export default App;

4. 其他操作

4.1 全局类名

某些类名是全局的、静态的,不需要进行转换。可以在类名位置使用 :global 语法:

:global(.main) {/* 全局样式 */
}

使用了 :global 的类名不会进行转换,相反的,没有使用 :global 的类名,默认使用 :local

:local(.main) {/* 局部样式 */
}

4.2 控制最终的类名

大部分情况下,我们不需要控制最终的类名,因为控制它没有任何意义。如果一定要控制最终的类名,可以配置 css-loaderlocalIdentName

例如:

module.exports = {module: {rules: [{test: /\.css$/,use: ['style-loader',{loader: 'css-loader',options: {modules: true,localIdentName: '[local]_[hash:base64:5]'}}]}]}
};

5. 其他注意事项

  • 配合构建工具:CSS Module 通常配合构建工具(如 webpack)使用。
  • 避免嵌套类名:CSS Module 仅处理顶级类名,尽量不要书写嵌套的类名,也没有这个必要。
  • 不处理其他选择器:CSS Module 仅处理类名,不处理其他选择器。
  • 避免使用 ID 选择器:CSS Module 还会处理 ID 选择器,但任何时候都没有使用 ID 选择器的理由。
  • 命名规范:使用了 CSS Module 后,只要能做到让类名望文知意即可,不需要遵守其他任何的命名规范。

6. 总结

通过本课程,你已经了解了 CSS Module 的基本概念、实现原理和使用方法。CSS Module 提供了一种全新的方式来解决类名冲突问题,使得 CSS 代码更加模块化和可维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/472330.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动力商城-03 Idea集成apifox Mybatis-Plus字段策略

1.Idea下载apifox插件 2.新建令牌放入Idea 3.右键上传到对应接口 4.设置前置url 插件能够自动识别swagger注解 Mybatis-Plus字段策略 1、FieldStrategy作用 Mybatis-Plus字段策略FieldStrategy的作用主要是在进行新增、更新时&#xff0c;根据配置的策略判断是否对实体对…

使用 npm 安装 Yarn

PS E:\WeChat Files\wxid_fipwhzebc1yh22\FileStorage\File\2024-11\spid-admin\spid-admin> yarn install yarn : 无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后…

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件 Excel导出系列目录&#xff1a;★★★★尤其注意&#xff1a;引入依赖创建导出模板类逻辑处理controllerservice 导出效果总结 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springb…

深入理解 source 和 sh、bash 的区别

1 引言 在日常使用 Linux 的过程中&#xff0c;脚本的执行是不可避免的需求之一&#xff0c;而 source、sh、bash 等命令则是执行脚本的常用方式。尽管这些命令都能运行脚本&#xff0c;但它们之间的执行方式和效果却有着显著的区别。这些区别可能会影响到脚本的环境变量、工作…

CC6学习记录

&#x1f338; cc6 cc6和cc1的国外链其实后半条链子是一样的&#xff0c;但是cc6的不局限于jdk的版本和commons-collections的版本。 回忆一下cc1的后半条链子&#xff1a; LazyMap.get()->InvokerTransformer.transform() 这里我们就结合了URLDNS链的思路&#xff0c;在…

飞凌嵌入式RK3576核心板已适配Android 14系统

在今年3月举办的RKDC2024大会上&#xff0c;飞凌嵌入式FET3576-C核心板作为瑞芯微RK3576处理器的行业首秀方案重磅亮相&#xff0c;并于今年6月率先量产发货&#xff0c;为客户持续稳定地供应&#xff0c;得到了众多合作伙伴的认可。 FET3576-C核心板此前已提供了Linux 6.1.57…

路漫漫其修远兮,吾将上下而求索---第一次使用github的过程记录和个人感受

文章目录 1.仓库位置2.新建仓库3.配置仓库4.克隆和上传5.推荐文章和我的感受 1.仓库位置 这个仓库的位置就是在我们的这个个人主页的右上角&#xff1b;如果是第一次注册账号的话&#xff0c;这个主页里面肯定是不存在仓库的&#xff0c;需要我们自己手动的进行创建&#xff1…

docker与大模型(口语化原理和实操讲解)

文章目录 一、镜像images1&#xff09;下载安装2&#xff09;docker images相关命令(保存、删除、上传、别名、搜索镜像) 二、容器container1&#xff09;展现所有在跑的容器服务ps2&#xff09;start /restart / kill / stop /rm 三、dockerfile四、volume五、network六、dock…

《基于Oracle的SQL优化》读书笔记

查看执行计划set autotrace traceonly explain在当前session中将优化器模式改为RULE。alter session set optimizer_modeRULE;统计信息存储在oracle的数据字典里&#xff0c;且从多个维度描述了oracle数据库里相关对象的实际数据量&#xff0c;实际数据分布等详细信息。 -- 对…

css:浮动

网页的本质上就是摆放盒子&#xff0c;把盒子摆到相应的位置上 css提供了三种传统的布局方式&#xff1a; 普通流&#xff08;标准流&#xff09;&#xff1a;标签按默认方式排列&#xff0c;最基本的布局方式 浮动 定位 实际开发中&#xff0c;一个网页基本包含了三种这种布局…

c++入门--引用与指针,const与引用,NULL与nullptr

1.引用与指针&#xff1a; 1.1引用的介绍&#xff1a; 引用相当于一个变量的别名&#xff0c;向函数传参后或者在main函数中可以直接对这个变量进行操作。 1.2引用的返回&#xff1a; 函数返回的时候是生成了一个临时变量&#xff0c;这个变量具有常性&#xff0c;是不能对这…

单片机智能家居火灾环境安全检测

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 在现代社会&#xff0c;火灾安全始终是人们关注的重点问题。随着科技的不…

SpringBoot3全面复习

Springboot3 Spring Boot 3是Spring Boot框架的一个主要版本&#xff0c;它基于Spring Framework 6构建&#xff0c;引入了对最新Java版本&#xff08;如Java 17及以上&#xff09;的支持&#xff0c;并提供了许多新特性和改进。Spring Boot 3旨在简化Spring应用的初始搭建以及…

海思3403对RTSP进行目标检测

1.概述 主要功能是调过live555 testRTSPClient 简单封装的rtsp客户端库&#xff0c;拉取RTSP流&#xff0c;然后调过3403的VDEC模块进行解码&#xff0c;送个NPU进行目标检测&#xff0c;输出到hdmi&#xff0c;这样保证了开发没有sensor的时候可以识别其它摄像头的视频流&…

哈佛商业评论 | 未来商业的技术趋势:百度李彦宏谈技术如何变革商业

在《哈佛商业评论》的HBR IdeaCast节目中&#xff0c;百度联合创始人、首席执行官兼董事长李彦宏分享了他对人工智能&#xff08;AI&#xff09;和其他技术趋势的见解。这期节目讨论了百度如何将生成式AI融入业务&#xff0c;以及这些技术如何重塑我们的生活和工作方式。让我们…

插入排序——希尔排序

插入排序——希尔排序 7.5 插入排序——希尔排序概念和思路参考程序希尔排序的特性总结复杂度稳定性 7.5 插入排序——希尔排序 概念和思路 我们都知道&#xff0c;直接插入排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)&#xff0c;但当数据无限接近有序或本身就是有序的时候&a…

Python小试牛刀:第一次爬虫,获取国家编码名称

使用场景&#xff1a; 需要初始化国家&#xff08;地区表&#xff09;&#xff0c;字段有国家名称、国家编码等等。 解决方案&#xff1a; 使用requests发送请求&#xff0c;使用bs4解析得到的HTML&#xff0c;打开F12&#xff0c;查看元素&#xff0c;&#xff08;可以Ctrl…

Java中的集合类与线程安全的讨论

1.ArrayList ArrayList是线程不安全的&#xff0c;可以在单线程中使用&#xff0c;在多线程中可以根据代码选择合适的时机进行加锁&#xff0c;实现线程安全的操作&#xff0c;但对代码能力要求较高。 2.Collections.synchronizedList(new ArrayList) 返回的List中的关键操作…

【数据结构】线性表——栈与队列

写在前面 栈和队列的关系与链表和顺序表的关系差不多&#xff0c;不存在谁替代谁&#xff0c;只有双剑合璧才能破敌万千~~&#x1f60e;&#x1f60e; 文章目录 写在前面一、栈1.1栈的概念及结构1.2、栈的实现1.2.1、栈的结构体定义1.2.2、栈的初始化栈1.2.3、入栈1.2.4、出栈…

A030-基于Spring boot的公司资产网站设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…