SCSS的&不能防止类名冲突,因其仅是父选择器占位符,编译后仍生成全局类名;真正防冲突需依赖CSS Modules,它在构建阶段将.card__header重命名为Card_header__abc123等唯一标识符。
SCSS本身不解决类名冲突,编译后仍是全局类名;真正起作用的是CSS Modules——它在构建阶段把重命名为类似的唯一标识符。
为什么
嵌套写得再规范也防不住冲突
SCSS的
只是语法糖,用于生成结构清晰的类名(如
),但编译后这些类名仍暴露在全局CSS作用域中。两个不同文件里都写了
,最终CSS里就会出现两段同名规则,后加载的会覆盖前加载的。
常见错误现象:
和
都用
,但没启用CSS Modules,结果编译出两个
,样式互相干扰
关键判断:只要文件后缀不是
(或
等),
再怎么嵌套,都不具备隔离能力
Vue单文件组件里的
也不处理
逻辑——它只给选择器加
属性,并不改类名本身
启用CSS Modules必须满足的三个硬条件
光改文件名不够,Webpack/Vite需要明确识别并启用模块化处理,否则
会被当普通SCSS对待,类名原样输出。
文件命名:必须是
(或
、
),不能是
却配错loader规则
构建配置:Webpack中
需开启
,且
建议设为
,避免短哈希碰撞
Vite默认支持,但若项目自定义了
配置,需确认
匹配到了
,例如
方式不对,
就拿不到混淆后的类名
CSS Modules导出的是一个对象,原始类名作key,混淆后类名作value。如果导入方式错了,JS里根本访问不到正确类名。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
立即学习
“
前端免费学习笔记(深入)
”;
React中必须用
,然后写
或启用
后用
Vue中要写
(注意不是
),并在模板中用
错误示范:
——这只会加载样式,不返回映射对象,
或
都是
混淆类名在调试时怎么定位源文件
开发时看到
这种类名,很难对应到哪个SCSS文件。这不是bug,是CSS Modules的正常行为,但可通过配置保留可读性。
开发环境建议把
设为
,比如
,至少能看出组件和修饰符
开启Source Map:确保
和
都启用
,浏览器开发者工具就能点类名跳转到原始SCSS行
注意Vite的
默认关闭,需显式设为
;Webpack则依赖
和loader配置协同生效
混淆类名不是为了让人“看不懂”,而是让机器能区分作用域。真正容易被忽略的是:一旦用了
引入Sass变量或mixin,它们和CSS Modules无关——
解决的是Sass层的命名污染,而类名混淆解决的是CSS运行时的命名冲突,两者要配合用,不能互相替代。
.card__headerCard_header__abc123&&.card__body.card { &__title { } }Header.module.scssModal.module.scss&__title.header__title.module.scss.module.css&&[data-v-xxx].module.scss.module.scss.module.css.module.lessCard.module.scsscss-loadermodules: truelocalIdentName[path]_[name]__[local]___[hash:base64:4]css.modulespattern.module.*pattern: /\.module\.(css|scss|less)$/iimport$styleimport styles from './Button.module.scss'className={styles['btn--primary']}camelCasestyles.btnPrimary:class="$style.btn"import './Button.module.scss'$stylestylesundefinedCard_header__abc123localIdentName[name]__[local]___[hash:base64:3]button__primary__aBccss-loadersass-loadersourceMap: truecss.devSourcemaptruedevtool@use@use