"매 class 가 file-locally scoped". CSS Modules 매 build-time transform 으로 매 class name 을 unique hash 로 rewriting — 매 global namespace pollution 의 elimination + component-level encapsulation 의 enable. 매 2026 현재 Vite/Webpack/Next.js 매 native support, 매 CSS-in-JS runtime cost 의 alternative 로 주류.
매 핵심
매 작동 원리
Button.module.css 매 import 시 매 bundler 가 매 class 를 Button_primary__a3fG2 로 rename.
매 import 결과 매 object — { primary: 'Button_primary__a3fG2' }.
매 component 매 styles.primary 로 reference — 매 collision-free.
매 vs alternatives
vs global CSS: 매 scoping 자동, 매 BEM 매 manual convention 의 replacement.
vs CSS-in-JS: 매 zero runtime, 매 build-time only — 매 bundle size + perf 우위.
vs Tailwind: 매 component-local custom design 매 적합, Tailwind 매 utility-first.
매 응용
Component library (Button, Input) 매 encapsulated styling.
Next.js 매 default-supported pattern — *.module.css 매 convention.
Design system 매 token + component 매 layered structure.
언제: component encapsulation 매 필요, runtime cost 의 회피, TypeScript-friendly typing.
언제 X: 매 dynamic theming 매 heavy (variant explosion), 매 design token 매 runtime mutation 매 필요 — vanilla-extract / CSS variables.
❌ 안티패턴
:global 매 남용: 매 scoping benefit 의 nullification.
String concatenation 매 raw: 매 clsx 의 사용 — 매 readability + falsy handling.
styles['kebab-case'] access 매 unnecessarily: 매 localsConvention: 'camelCaseOnly' 매 설정.
Module 1개 매 100+ classes: 매 split — 매 component-per-module.
🧪 검증 / 중복
Verified (Next.js docs 2026, Vite CSS Modules guide).