개발자
류준열
mini tailwind 만들어보기
미니 tailwind를 만들어보자!
tailwind 동작방식
tailwind의 동작방식을 생각해보면 다음과 같다.
- 개발자가 약속된 class를 입력한다.
- 빌드하면 약속된 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가 적용된것을 확인할수있다.

- 개발자가 미리 약속된 class 이름만 써준다.
- 빌드 시점에 CSS를 만들어 준다.
아이디어만 놓고 보면 정말 단순한데, 이 단순함을 구현해서 전 세계적으로 인기 있는 라이브러리를 만들다니