개발자
류준열

mini tailwind 만들어보기

미니 tailwind를 만들어보자!

tailwind 동작방식

tailwind의 동작방식을 생각해보면 다음과 같다.

  1. 개발자가 약속된 class를 입력한다.
  2. 빌드하면 약속된 css가 만들어진다.

작업

완성본은 이 커밋에 있다. https://github.com/ryu9663/tailwind-self/commit/c351a1b8703a9515f52ee3d9c5706a5560854d09

간소화된 Palette

다음과 같이 간소화된 Palette를 만든다.

// pallete.ts

export const colors = {
  primary: "#2563eb",
  primaryDark: "#1d4ed8",
  gray100: "#f3f4f6",
  gray500: "#6b7280",
  gray900: "#111827",
  white: "#ffffff",
  black: "#000000",
};

export const spacing = {
  0: "0px",
  1: "4px",
  2: "8px",
  3: "12px",
  4: "16px",
  6: "24px",
  8: "32px",
};

export const fontSize = {
  sm: "0.875rem",
  base: "1rem",
  lg: "1.125rem",
  xl: "1.25rem",
  "2xl": "1.5rem",
};

generate css 스크립트

이제 약속된 css를 만드는 스크립트를 만들꺼다.

파일을 만들기 위해 nodeJS의 writeFileSync를 이용한다.

그리고 아래와 같이 css를 만들면 된다.

import { writeFileSync } from "fs";
import { colors, spacing, fontSize } from "../src/styles/pallete";

let css = "";

for (const [key, value] of Object.entries(spacing)) {
  css += `.m-${key}{margin:${value}}\n`;
  css += `.mt-${key}{margin-top:${value}}\n`;
  ...
}

for (const [name, value] of Object.entries(colors)) {
  css += `.bg-${name}{background-color:${value}}\n`;
  css += `.text-${name}{color:${value}}\n`;
}

for (const [name, value] of Object.entries(fontSize)) {
  css += `.text-${name}{font-size:${value}}\n`;
}

css += `
.flex{display:flex}
...
.justify-start{justify-content:flex-start}
.justify-center{justify-content:center}
...
`;

writeFileSync("mini-tailwind.css", css);

build

tsconfig등 ts 세팅은 생략한다.

package.json은 다음과 같이 적었다.

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build:css": "tsc scripts/generate-css.ts --outDir dist && node dist/scripts/generate-css.js"
  },
  "devDependencies": {
    "@types/node": "^24.10.1",
    "ts-node": "^10.9.2",
    "typescript": "^5.9.3"
  }

npm run build:css를 입력하면 generate-css.ts를 dist파일에 js로 컴파일하고 컴파일된 js를 스크립트 실행시킨다.

그럼 다음과 같은 css가 만들어진다.

실제 테스트

아래와 같이 index.html을 만들고 빌드된 css mini-tailwind.css를 연결, 약속된 class text-primaryDark 를 입력했다.

<!DOCTYPE html>
<html lang="en">
  <head>
    <link href="./mini-tailwind.css" rel="stylesheet" />

    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <div class="text-primaryDark">하이하이</div>
  </body>
</html>

html을 키면 다음과 같이 tailwind가 적용된것을 확인할수있다.


  1. 개발자가 미리 약속된 class 이름만 써준다.
  2. 빌드 시점에 CSS를 만들어 준다.

아이디어만 놓고 보면 정말 단순한데, 이 단순함을 구현해서 전 세계적으로 인기 있는 라이브러리를 만들다니