TailwindCSS ์ธํ (1) - ESlint Plugin
๐์์ํ๋ฉฐ
Next.js์์ TailwindCSS ์ด์ฉํด ์คํ์ผ๋ง์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ๊ณ , ํ์ํ ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ค. ํ์ง๋ง ์์๋๋ก ์๋ํ์ง ์๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ์์๋ค. TailwindCSS๋ ์ข ์ข ์ฌ์ฉํ ๊ฒ ๊ฐ์ผ๋ ์ด๋ฒ ๊ธฐํ์ ์ด๋ค ์ค๋ฅ๊ฐ ์๋์ง ์ ๋ฆฌํ๊ณ , ๋๋ฆ์ ์ธํ ๊ณผ์ ์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํ๋ค.
์ด ๊ธ์ ์๋์ ๊ฐ์ด ์ด์ด์ง๋๋ค.
โ ํน์ ํด๋ ํ์ ํ์ผ์์ TailwindCSS ์๋ ์ํ ๋
next13์์ app ํด๋๋ฅผ ์ฌ์ฉํด component ํด๋๋ฅผ ๋ง๋ค์์ผ๋ component ํด๋์์ ์๋ฌด๋ฆฌ tailwind ํด๋์ค๋ฅผ ์์ฑํด๋ ์ ๋๋ก ์๋ํ์ง ์์๋ค.
1
2
3
4
5
โโโ app/
โ โโโ page.tsx
โ
โโโ component/
โโโ header.tsx
์๊ณ ๋ณด๋ tailwind.config.ts
ํ์ผ์ ์ ํ ๊ฒฝ๋ก๊ฐ component
๊ฐ ์๋๋ผ components
์ฌ์ ๋ฐ์ํ ๋ฌธ์ ์๋ค. ๋ ์ค ํ๋์ ์ด๋ฆ์ ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค. ๋๋ components
๋ก ํด๋ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ค.
1
2
3
4
5
6
7
8
9
10
import type { Config } from "tailwindcss"
const config: Config = {
content: [
"./src/pages/**/*.{js,ts,jsx,tsx,mdx}",
"./src/components/**/*.{js,ts,jsx,tsx,mdx}",
"./src/app/**/*.{js,ts,jsx,tsx,mdx}",
],
//์๋ต
}
โ eslint๊ฐ ์ ๋๋ก ์๋ํ๋์ง ํ์ธํ๊ธฐ
next.js๋ฅผ ์ค์นํ ๋ ์๋์ผ๋ก package.json์ ์ ํ ์๋ "lint": "next lint"
๋ฅผ ํ์ฉํด ํ์ธํ๋ฉด ๋๋ค. ์์ฑํ tailwind๊ฐ order ๊ท์น์ ๋ง์ง ์๊ฑฐ๋, ์ ์ ์๋ className์ธ ๊ฒฝ์ฐ warning์ด ๋ฐ์ํจ์ ํ์ธํ ์ ์๋ค.
1
npm run lint
ํน์ VS code์ ์ถ๋ ฅ > eslint
๋ฅผ ํ์ธํด ์ ๋๋ก ์๋ํ๊ณ ์๋์ง ํ์ธํ๋ฉด ๋๋ค.
โ Failed to load config โprettierโ to extend from
๊ทธ๋ฐ๋ฐ ์์์ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด npm run lint
๋ฅผ ์๋ํ์ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
1
Failed to load config "prettier" to extend from.
ํด๋น ์ค๋ฅ๋ ํ์ํ eslint-prettier ํ๋ฌ๊ทธ์ธ์ด ๋น ์ ธ์์ด์ ๋ฐ์ํ ๊ฒ์ด์๋ค. ์ถ๊ฐ์ ์ผ๋ก ํ์ํ ๋ด์ฉ์ ์ค์นํ์.
1
yarn add --dev prettier eslint-config-prettier eslint-plugin-prettier
โ eslint-plugin-tailwindcss
์คํผ์
๋ก ์ ๊ณตํ๋ prettier-plugin-tailwindcss
๋ณด๋ค ๋ ๋ง์ ๊ท์น์ ์ ๊ณตํ๋ ์ ์ฉํ plugin์ด๋ค. class ์ ๋ ฌ, ๋ณํฉ, ์์ ๊ฐ ์ฌ์ฉ ๊ธ์ง, ๋์ผ ์์ฑ ๋ฎ์ด์ฐ๊ธฐ ๊ธ์ง ๋ฑ์ ์ ๊ณตํ๋ค.
1
yarn add --dev eslint-plugin-tailwindcss
์ค์น ํด ์ค๋ค์, eslintrc.json
์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด extends์ rules๋ฅผ ์ถ๊ฐํด์ค๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"extends": [
"next/core-web-vitals",
"prettier",
"plugin:tailwindcss/recommended" ๐
],
"rules": { ๐
"tailwindcss/classnames-order": "warn",
"tailwindcss/enforces-negative-arbitrary-values": "warn",
"tailwindcss/enforces-shorthand": "warn",
"tailwindcss/no-custom-classname": "warn",
"tailwindcss/no-arbitrary-value:": "warn",
"tailwindcss/no-contradicting-classname": "warn"
}
}
โ ์ ์ฅํ๋ฉด eslint ๊ท์น ์ ์ฉ๋๊ฒ ํ๊ธฐ
์์ ์ค๋ฅ๋ฅผ ํด๊ฒฐํ๊ณ ๋ค์ npm run lint
๋ฅผ ํด๋ณด๋ฉด ๋ฌธ์ ๊ฐ ์๋ className์ ์ ์ก์๋์ผ๋, ์ ์ฅํ ๋ eslint plugin์ด ์๋์ผ๋ก ์ ๋ ฌ๋์ง ์์๋๋ฐ, ์ด ๋ฌธ์ ๋ VS code์ settings.json
์ ์๋์ ๊ฐ์ด ์ ์ด ํด๊ฒฐํ๋ค.
1
2
3
4
5
{
"editor.codeActionsOnSave": {
"source.fixAll": true
}
}
โ tailwindCSS
๐ฉ๋ง๋ฌด๋ฆฌ
๊ธฐ๋ณธ ์ธํ ์ ์ด๋ ๊ฒ ๋ง๋ฌด๋ํฌ๋ค. ์ด์ tailwind ์ปค์คํ ์ ์์ํด๋ณด์