본문 바로가기
Develop

tailwindCSS safelist와 동적클래스 classname

by hongreat 2024. 12. 8.

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