bem与smacss本质解决不同问题:bem规范类名结构(block__element--modifier)和模块化文件组织,smacss划分样式职责(base/layout/module/state/theme)并明确维护分工。

现代 CSS 命名规范里,BEM 并不比 SMACSS “更流行”,而是更常被直接落地——尤其在组件库、Vue/React 项目和中小型团队中。根本原因不是 BEM 更好,而是它把“命名规则”和“作用域边界”打包成一条可执行的硬约束,而 SMACSS 的分层逻辑需要更高协作成本和架构共识才能见效。
为什么 BEM 容易上手、SMACSS 容易半途而废
BEM 的规则是机械可验证的:card__title 必须出现在 card 容器内,card__title--hovered 不能脱离 card__title 单独使用。VS Code 插件能自动补全 __ 和 --,ESLint 插件能报错 menu__item__icon 这种嵌套元素——人不用动脑,工具就能拦住破功点。
SMACSS 的五类(Base/Layout/Module/State/Theme)本质是职责切分,但类名本身不带类型标识。比如 is-hidden 是 State 类,但没人强制你不能把它写进 base.css;promo-card 是 Module 类,但也可以被当成 Layout 类用在 layout.css 里。一旦没有架构师盯文件归属、没有 PR review 检查类名前缀,SMACSS 就退化成“五个文件夹,里面全是 .btn 和 .header”。
- 团队刚推行时,BEM 只需改 class 写法,CSS 文件结构可以不动;SMACSS 要求先拆文件、再定归属、再对齐 JS 状态管理,一步卡住就停摆
-
grep -r "is-" src/查不到所有状态类,因为有人写hidden、有人写js-hidden、还有人直接内联style="display:none" - 新人看到
user-profile__avatar--large,立刻知道这是 user-profile 模块里的 avatar 元素,启用 large 变体;看到avatar-large,得翻文档或问同事这个类归哪层、是否可复用
SMACSS 真正起效的三个前提条件
SMACSS 不是写法问题,是协作分工问题。它只在满足以下条件时才比 BEM 更可持续:
- Layout 层由前端架构师统一维护,禁止业务组修改
layout.css—— 否则栅格崩了没人负责 - State 类(如
is-loading)必须和 JS 的状态变量严格一一对应,且通过统一 hooks 或 store 注入,不能靠手动加 class - 所有 Module 文件(如
modules/promo-card.css)只允许用 Base 类(.btn)、自身 Module 类(.promo-card)和 State 类(.is-hidden),禁用跨模块组合(如.promo-card .user-avatar)
缺任一条件,SMACSS 就变成“给 CSS 文件起五个名字”,而不是真正分层。
BEM 在 React/Vue 中天然适配,SMACSS 需要额外抽象
JSX 或模板里动态拼类名时,BEM 的结构让逻辑更稳:
className={`card__button ${disabled ? 'card__button--disabled' : ''} ${loading ? 'card__button--loading' : ''}`}
而 SMACSS 下,promo-card is-hidden 这种组合容易漏空格、重复加类、或把 is-hidden 错写成 hidden —— 因为没有结构约束,全靠人工记忆。
- BEM 的修饰符是封闭枚举:只有
--primary、--disabled、--loading,可提前定义常量对象 - SMACSS 的 State 类是开放集合,
is-open、is-collapsed、has-error语义重叠,review 时很难判断是否冗余 - Vite / Webpack 构建时,BEM 类名可配合
postcss-bem做校验;SMACSS 没标准插件,类名前缀检查只能靠自定义 ESLint 规则,维护成本高
最常被忽略的是:BEM 的“块”和组件边界高度重合,所以它在组件化框架里几乎零学习成本;SMACSS 的“Module”是逻辑概念,一个 React 组件可能横跨 Layout + Module + State 三层,强行按 SMACSS 拆,反而增加心智负担。要不要用 SMACSS,关键不在命名好不好记,而在团队有没有人长期守着那五类文件的边界。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











