必须关闭 tailwind.config.js 中的 important 选项,并严格分离 bem 结构类与 tailwind 视觉原子类,否则将引发 css 权重冲突、purgecss 误删、组件契约失效等工程问题。

tailwind.config.js 里关掉 important,BEM 类名就别再和 mt-4、rounded-lg 混写在同一元素上——这不是风格选择问题,而是工程约束失效的信号。
混用时 CSS 权重冲突根本不会报错
你在 JSX 里写 class="card__body mt-4",同时又在 CSS 文件里写了 .card__body { margin-top: 1rem; },后者大概率被覆盖,但浏览器不会提示、构建也不会失败。调试时得手动打开 DevTools,逐层比对 computed styles,才能发现 mt-4 的 margin-top: 1rem 覆盖了你的样式规则。
原因很简单:mt-4 是类选择器 + 属性声明,而 .card__body 也是类选择器,权重相同;谁在 CSS 文件里定义得晚,谁赢。Tailwind 默认按工具类顺序生成 CSS,mt-4 几乎总在你手写的 BEM CSS 后面。
- 必须在
tailwind.config.js中设important: false(默认是false,但有人会开) - BEM 类只保留结构职责:如
display: flex、position: relative、is-active状态开关 - 所有视觉表现(padding、border、shadow、rounded)全交给 Tailwind 原子类,不写进 BEM CSS 文件
purge 配置错误会让 BEM 类莫名消失
Tailwind 的 content 配置只扫描模板中出现的类名字符串。如果你的 card__body 只出现在 Card.css 里,没在 JSX/HTML 中显式写出,PurgeCSS 就会把它当死代码删掉——尤其在生产构建时突然发现卡片内边距没了,查半天才发现是 class 被误删。
哪怕你坚持混用,也得把 BEM 类名显式加进 safelist:
module.exports = {
content: ["./src/**/*.{js,jsx,ts,tsx}"],
safelist: [/^card(__|--)*/, /^button(__|--)*/],
// ...
}
否则,card--compact、button__icon--small 这类修饰符类极易被清空。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
团队协作中“语义”责任开始错位
当一个新人看到 user-card__avatar w-12 h-12 rounded-full bg-gray-200,他可能顺手删掉 user-card__avatar,只留 Tailwind 类——因为“反正样式还在”。但这个元素立刻脱离组件体系:JS 逻辑无法通过 document.querySelector(".user-card__avatar") 找到它,自动化测试用的 selector 全挂,Storybook 快照比对也失效。
BEM 不是装饰前缀,它是组件契约的锚点。Tailwind 负责“怎么画”,BEM 负责“这是什么”。一旦这个分工模糊,维护成本就指数级上升。
- Block 层(如
card、search-form)必须保留,用于组件识别和测试定位 - Element 层(如
card__header)建议保留,但可叠加 Tailwind 类 - Modifier 层慎用 Tailwind 模拟:
card--compact可以存在,但别写成card md:px-2——后者 JS 逻辑无法感知状态变化
真正该放弃的不是 BEM,而是“BEM + 手写 CSS”模式
很多人以为转向 Tailwind 就是扔掉所有 __ 和 --,其实不是。Tailwind 并未替代 BEM 承载的跨技术栈契约、设计系统映射、审计可追溯性等能力。它替代的是“为每个间距/圆角/阴影写一行 CSS”的低效流程。
关键转变在于:把原本写在 Card.css 里的 .card__body { padding: 1.5rem; border-radius: 0.5rem; },直接挪到 JSX 里变成 class="card__body p-6 rounded-lg"。CSS 文件瘦身,HTML 承担视觉表达,BEM 类继续做结构标识。
最容易被忽略的复杂点是:BEM 的 Block 名(如 container)若和 Tailwind 的默认类重名,purge 可能误删——必须加 /^container(__|--)*/ 到 safelist,且不能只写 "container"。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










