본문 바로가기
Develop

tailwindCSS safelist와 동적클래스 classname

by hongreat 2024. 12. 8.
728x90

TailwindCSS를 사용할 때 클래스를 동적으로 적용해야 하는 상황이 종종 발생합니다.

하지만 동적 클래스를 잘못 작성하거나 TailwindCSS의 빌드 과정과 호환되지 않는 방식으로 구성하면 스타일이 적용되지 않을 수 있습니다.

 

목차

 

 

 

 

동적 클래스 지정

 

속성에 따라 버튼 색상을 동적으로 변경하려는 방식으로 클래스를 동적으로 사용하려면, 단순한 리터럴 대입으로는 변경되지 않습니다.

이 방식은 Tailwind(의 빌드 과정에서) 클래스가 제대로 적용되지 않습니다.

interface ButtonProps {
  label: string;
  onClick: () => void;
  color?: string; // 색상 조절을 위한 선택적 prop
}
const Button: React.FC<ButtonProps> = ({ label, onClick, color = "blue" }) => {
  return (
    <button
      className={`bg-${color}-500 text-white px-4 py-2 rounded hover:bg-${color}-700 mx-1`}
      onClick={onClick}
    >
      {label}
    </button>
  );
};

 

 

 

해결 방법

 

 

Safelist 적용

 

tailwind.config.js 파일에서 safelist를 사용해 미리 클래스 목록을 지정하면 문제를 해결할 수 있습니다. Safelist는 TailwindCSS가 인식하지 못하는 클래스를 강제로 포함하도록 지시합니다.

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: ["./src/**/*.{js,jsx,ts,tsx}"],
  theme: {
    extend: {},
  },
  plugins: [],
  safelist: [
    "bg-blue-500",
    "hover:bg-blue-700",
    "bg-red-500",
    "hover:bg-red-700",
    "bg-green-500",
    "hover:bg-green-700",
  ],
};

 

 

TailwindCSS는 Safelist를 최후의 수단으로 사용하는 것이 권장됩니다.(from 문서)
Safelist는 정적 분석으로 클래스 이름을 추출할 수 없는 경우에만 사용해야 합니다.

 

 

clsx 라이브러리로 동적 클래스 적용

 


Safelist를 피하고 더 우아한 방식으로 동적 클래스를 적용하려면, clsx와 같은 라이브러리를 사용하는 것을 추천합니다. 이 라이브러리는 조건부로 TailwindCSS 클래스를 간결하게 관리할 수 있도록 도와줍니다.

 

 

clsx 설치

yarn add clsx

 

 

clsx를 활용한 동적 클래스

import clsx from "clsx";
const Button: React.FC<ButtonProps> = ({ label, onClick, color = "blue" }) => {
  const buttonClass = clsx(
    "text-white px-4 py-2 rounded mx-1",
    `bg-${color}-500`,
    `hover:bg-${color}-700`
  );
  return (
    <button className={buttonClass} onClick={onClick}>
      {label}
    </button>
  );
};

clsx를 사용하면 클래스 로직이 더욱 간결해지며, 조건부 클래스를 명확하게 관리할 수 있습니다.

 

 

classnames와 clsx 비교

동적 클래스를 관리하기 위해 classnamesclsx는 모두 사용할 수 있습니다. 두 라이브러리는 유사한 API를 제공하지만, clsx가 더 최신이며, 번들 크기가 작아 성능에 유리합니다. 새로운 프로젝트에서는 clsx를 사용하는 것을 권장합니다.

 

 

TypeScript 패키지 매니저(npm => yarn)

 

 

TypeScript 버전 호환 문제로 인해 일부 환경에서는 설치나 실행 시 오류가 발생할 수 있습니다. 이를 해결하기 위해 TypeScript 버전을 조정하거나 패키지 매니저를 변경할 수 있습니다.

 

 

TypeScript 버전 다운그레이드

npm install typescript@4.9.5 --save-dev

 

 

 

npm audit fix
npm audit fix --force

 

 

 

 

패키지 매니저 변경(npm -> yarn)

저는 npm에서 문제가 계속 발생해서.. yarn으로 변경했습니다.

 

 

그렇게 해서 적용된 clsx와 TailwindCSS를 활용한 버튼 컴포넌트..

import clsx from "clsx";
const Button = ({ label, onClick, color = "blue" }) => {
  const buttonClass = clsx(
    "text-white px-4 py-2 rounded mx-1",
    `bg-${color}-500`,
    `hover:bg-${color}-700`
  );
  return (
    <button className={buttonClass} onClick={onClick}>
      {label}
    </button>
  );
};

레퍼런스 링크

 

 

 

tailwind 문서

 

 

 

'Develop' 카테고리의 다른 글

React component life cycle  (1) 2024.12.15
React Hook  (0) 2024.12.15
React18 설치 및 시작 방법 및 레퍼런스링크  (1) 2024.12.05
shell 을 배우자  (0) 2024.11.20
데이터베이스 정규화 이해하기  (1) 2024.11.17