不需要。css modules 通过构建时哈希天然隔离作用域,使 bem 的命名约束失去必要性;bem 在模块化中仅保留语义价值,非技术必需,且嵌套修饰符易出错,真正关键的是类名可溯源与扁平化维护。

CSS Modules 已经隔离作用域,BEM 不再是必需项
直接说结论:不需要。CSS Modules 的核心价值就是用构建时哈希替代人工命名约束,.button 和 .button__icon 在编译后会变成两个完全不相关的类名(如 Button_button__abc123、Button_icon__def456),不存在覆盖风险,也无需靠 __ 和 -- 来“声明关系”。BEM 是为解决 CSS 全局污染而生的约定,而 CSS Modules 从机制上消除了这个前提。
为什么有人还在 .module.css 里写 BEM 风格?
这不是技术必须,而是语义保留和团队习惯的折中选择。当项目已有大量 BEM 经验,或组件结构复杂到需要显式表达层级时,开发者会主动沿用 BEM 命名,只为在源码里一眼看懂结构——但此时 __ 和 -- 不再承担作用域职责,只作语义分隔符。
- 好处:搜索
card__title仍能快速定位卡片标题样式,调试时不用跳转哈希类名对应文件 - 代价:JS 中引用修饰符需加引号,
styles['card--expanded']而非styles.card--expanded(语法错误) - 注意:
card__title--large这种嵌套修饰符在 BEM 里本就属反模式,CSS Modules 下更没必要——直接拆成card__title+card__title--large两行定义更清晰
Webpack/Vite 中启用 CSS Modules 后,BEM 类名反而容易出错
常见错误是把 BEM 当成“必须遵守的语法”,结果写出不符合构建规则的类名,导致样式丢失或哈希失效:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 误写
.card__header__logo(三层嵌套):BEM 规范禁止 Element 嵌套 Element,CSS Modules 虽不报错,但破坏语义可读性 - 动态拼接类名漏引号:
className={styles.card__body + '--expanded'}→ 实际生成的是Card_card__body__xyz123-expanded,不是预设的哈希类 - 混用全局 CSS 和模块化 CSS:在
.module.css里写.reset-button(无前缀),结果被外部重置样式覆盖,因为未启用模块化
真正该关注的不是“要不要 BEM”,而是类名是否可推断组件归属
比起纠结命名风格,更关键的是确保每个类名都能在编辑器里 Ctrl+Click 跳转到定义处,且不会因重构一个按钮而意外影响导航栏。这取决于两件事:
- CSS Modules 的
localIdentName配置是否保留足够语义,比如用[name]__[local]--[hash:base64:5]而非纯哈希 - 团队是否统一约定:所有
.module.css文件只写扁平类名(root、title、content),状态通过props控制而非修饰符类名
后者尤其重要——当 Button.module.css 里只有 .root 和 .loading,而加载态由 className={styles.root + (loading ? ' ' + styles.loading : '')} 控制时,你已经甩开了 BEM 最耗神的部分:手动维护修饰符组合。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










