</>
⌕
Senior #architecture#bem#css-modules#tailwind#css-in-js

So sánh BEM, CSS Modules, Tailwind và CSS-in-JS: chọn thế nào?

⚡ Trả lời nhanh

BEM là quy ước đặt tên, không có scope thật. CSS Modules scope class lúc build, zero runtime. Tailwind dùng utility class, nhất quán và bundle nhỏ nhưng markup dài. CSS-in-JS runtime cho style động theo props nhưng tốn runtime và khó với RSC; bản zero-runtime giảm nhược điểm này.

CáchScopeRuntimeĐiểm mạnhĐiểm yếu
BEMQuy ước tênKhôngĐơn giản, không cần toolTên dài, dễ vi phạm
CSS ModulesHash class lúc buildKhôngCô lập, CSS thuầnStyle động phải dùng biến CSS
TailwindUtility classKhôngDesign token nhất quán, purge nhỏHTML dài, học tập ban đầu
CSS-in-JS runtimeTheo componentCóStyle theo props, co-locationChi phí runtime, SSR/RSC phức tạp
/* BEM */
.card__title--highlight { color: tomato; }
<!-- Tailwind -->
<button class="rounded bg-blue-600 px-4 py-2 text-white hover:bg-blue-700">Lưu</button>
  • Style động theo state với bất kỳ cách nào không runtime: dùng CSS variables hoặc data-*/aria-* attribute selector.
  • Lựa chọn dựa vào đội ngũ và hệ thống thiết kế: design system riêng thường chọn Modules + tokens; app sản phẩm nhanh thường chọn Tailwind.
🃏 Ôn bằng flashcard