BEM 的 block__element--modifier 不能写成 block-element-modifier因会破坏语义分层、混淆工具链识别、引发样式优先级与命名冲突问题。为什么 BEM 的 block__element--modifier 不能写成 block-element-modifier因为 CSS 选择器解析和样式优先级会出问题而且破坏了 BEM 的语义分层。连字符写法让 __ 和 -- 的边界彻底消失工具链比如 PostCSS 插件、BEM 工具也认不出结构。__ 是固定层级标识表示“属于某个 block 的子元素”浏览器不关心但人和工具靠它定位作用域-- 必须紧贴在 __element 后面否则 button--primary 会被误判为独立 block而不是 button__text--primary 这类合法变体用连字符替代双下划线后header-logo-dark 无法区分是 header__logo--dark 还是 header-logo 这个新 block团队协作时命名冲突概率翻倍如何给 React 组件的根节点自动注入 BEM class 名别手写 classNamebutton button--large button__icon容易漏、难维护。核心是把 BEM 逻辑封装进一个函数或 Hook让组件只管传参。用 clsx 纯函数最轻量const bem (block) (element, modifier) { if (element) return ${block}__${element}${modifier ? --${modifier} : }; return ${block}${modifier ? --${modifier} : };};// 使用bem(button)(icon, loading)React 中更推荐用自定义 Hook 封装状态感知逻辑比如useBem(button, { size: large, loading: true }) 返回完整 class 字符串注意不要在 render 里动态拼接字符串避免每次渲染都新建字符串对象缓存 bem(button) 函数实例比缓存结果更可靠第三方组件库如 Ant Design怎么和 BEM 共存不能强行改它的 class 名也不该用 !important 覆盖。关键是分清「谁负责样式」——你写的组件用 BEM它提供的组件只当黑盒用通过 wrapper 层隔离。给 AntdButton 包一层 div classmy-button所有 BEM 修饰都在 wrapper 上内部原样透传如果必须定制内部结构比如改 Icon 颜色用 CSS-in-JS 或 :where(.my-button) .ant-btn-icon 这类低权重选择器避免污染全局警惕 css-modules 和 BEM 混用模块化生成的哈希名会让 BEM 的可读性归零要么全用 BEM 普通 CSS要么全用 css-modules别交叉build 时提取 BEM class 名做静态检查是否必要有必要但不是为了“防止写错”而是为了提前发现结构断裂点比如某处写了 card__title 却没定义 card 这个 block。 今天学点啥 秘塔AI推出的AI学习助手