className과 props를 연결하고 이와 관련한 타입을 수동으로 추가하고 관리하는 작업을 단순화하며, 스키마를 통해 코드의 일관성을 유지할 수 있도록 도움을 주는 도구
cva는 내부적으로 clsx를 사용하며, cx 함수를 제공하여 clsx와 유사한 기능을 제공한다.
하지만 "cva"는 "classValue" 타입을 제공하지 않아서 현재 두 개의 패키지를 동시에 사용해야 하는 상황이다.
Install
yarnaddclass-variance-authority
Reference
constcomponentVariant=cva(base, options);
base → 컴포넌트에 적용되는 기본적인 스타일 클래스 문자열
string, string[], 또는 clsx 값으로 표현될 수 있다.
options(optional)
variants→ 컴포넌트에 적용되는 다양한 상태나 스타일의 변형을 정의
compoundVaraints → variants에 정의된 값들의 조합(AND 연산)을 기반으로 새로운 varaints를 추가하는 기능
defaultvariants → variants에 정의한 값들의 기본값을 설정
cva에서 제공하는 VariantProps를 사용하면 정의한 variants를 타입으로 추출하여 사용 가능하다.
cva를 사용해 생성된 props들은 undefined, null 타입 값도 추가되어지는데, 이는 해당 varaint를 완전히 무효화 시키기 위한 의도적인 기능 이라고 한다. #Issue
++ 지금은 실험 단계이지만 다음 버전에서는 null 대신 명시적으로 unset을 사용할 예정이라 한다.. #check
Usage
cva를 사용하여 기존 코드를 리팩토링 해보고 비교해보자.
Before
After (CVA 활용)
props와 class를 연결하기 위해 추가되는 코드와 타입 선언이 깔끔하고 간결해졌다.
Tailwind-merge
클래스를 조합하고 중복을 피하여 스타일 충돌 이슈를 방지하고, 효율적으로 스타일을 정의하고 관리할 수 있도록 도와주는 도구
Install
Reference
twMerge → 여러 클래스들을 병합하는 유틸 함수, 중복된 클래스 충돌을 해결하고, 가장 마지막에 전달된 클래스를 유지한다.
twJoin → twMerge()와 달리 충돌을 해결하지 않는다. clsx와 비슷한 기능을 제공하고 사용법도 비슷하다. But 객체 인자는 지원하지 않음