[DevTools] Tailwind CSS ์ ํธ๋ฆฌํฐ ํด๋์ค ์๋ ์ ๋ ฌ ํ๋ฌ๊ทธ์ธ
prettier-plugin-tailwindcss ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ฉด TailwindCSS์ ์ ํธ๋ฆฌํฐ ํด๋์ค ์ ๋ ฌ ๊ท์น์ ๋ฐ๋ผ ํด๋์ค๋ฅผ ์๋ ์ ๋ ฌํด์ค๋ค. ์ด์ ๊น์ง Tailwind Formatter ๊ฐ์ IDE ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด์ ์ ๋ ฌ์ด ํ์ํ ๋๋ง๋ค ๋ถ๊ฐ๊ธฐ๋ฅ์ ์คํ(โ
โง
H
)ํ๋๋ฐ ๊ทธ๋ด ํ์๊ฐ ์์ด์ก๋ค.
prettier-plugin-tailwindcss ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๊ณ ํ์ผ ์ ์ฅ์ ์๋ ํฌ๋งคํ ๋๋๋ก IDE๋ฅผ ์ค์ ํ๋ฉด, ์ ํธ๋ฆฌํฐ ํด๋์ค๋ ํจ๊ป ์ ๋ ฌ๋ผ์ ํธํ๋ค.
์ฐธ๊ณ ๋ก ํด๋์ค ์๋ ์ ๋ ฌ ์ธ์๋ ์๋ชป ์ ๋ ฅํ ํด๋์ค ์ค๋ฅ ํ์, ์ถ์ฝ(shorthand) ์ฌ์ฉ ๊ฐ์ , ์์(arbitrary) ๊ฐ ์ฌ์ฉ ๊ธ์ง ๊ฐ์ ๊ท์น์ด ์ ์ฉ๋ eslint-plugin-tailwindcss ESLint ํ๋ฌ๊ทธ์ธ๋ ์๋ค.
์ค์ ๋ฐฉ๋ฒ
โถ prettier-plugin-tailwindcss
ํ๋ฌ๊ทธ์ธ ์ค์น
yarn add -D prettier prettier-plugin-tailwindcss
โท .prettierrc
์ค์ ํ์ผ์ plugins
์์ฑ ์ถ๊ฐ
{
// ...
plugins: ['prettier-plugin-tailwindcss'],
};
์ฌ์ฉ ๋ฐฉ๋ฒ
๐ก ํ์ผ ์ ์ฅ์ Prettier ํฌ๋งคํ ๋๋๋ก IDE ์ค์ ์ ํ๋ค๋ฉด ์ ํธ๋ฆฌํฐ ํด๋์ค๋ ํจ๊ป ์ ๋ ฌ๋๋ค.
์ค์ ์ ์๋ฃํ๊ณ ์๋ฆฌ๋จผํธ๋ฅผ ๋ณด๋ฉด ํด๋์ค ์ด๋ฆ์ ์ฌ๋ฐฐ์น ํ๋ผ๋ ๊ฒฝ๊ณ ๊ฐ ๋์จ๋ค.
์์ ํ๋ฉด recommended class order ์์๋๋ก ์ ํธ๋ฆฌํฐ ํด๋์ค๊ฐ ์ ๋ ฌ๋๋ค.
<!-- ์ ๋ ฌ ์ -->
<Header className="flex gap-8 items-center fixed top-0 z-10 w-full">
<!-- ์ ๋ ฌ ํ -->
<Header className="fixed top-0 z-10 flex w-full items-center gap-8">
ํ์ฌ ํ๋ก์ ํธ์ ์๋ ๋ชจ๋ ํ์ผ์ ํฌ๋งทํ ์ ํ๋ ค๋ฉด ํฐ๋ฏธ๋์ ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ค
# ํ์ฌ ํด๋ ์์น๋ถํฐ ๋ชจ๋ ํ์ผ์ ๋ํด ํฌ๋งคํ
๋๋์ง "๊ฒ์ฌ"(์์ ํ์ง ์์)
npx prettier --check .
# ํ์ฌ ํด๋ ์์น๋ถํฐ ๋ชจ๋ ํ์ผ์ ๋ํด "ํฌ๋งคํ
"
npx prettier --write .
# ๋ชจ๋ ์์น์ ์๋ js, ts, jsx, tsx ํ์ฅ์์ ๋ํด ๋ํด "ํฌ๋งคํ
"
npx prettier --write "**/*.{js,ts,jsx,tsx}"
package.json์ ์คํฌ๋ฆฝํธ ๋ช ๋ น์ด๋ฅผ ๋ง๋ค์ด๋๊ณ ์ฌ์ฉํ ์ ์๋ค.
"scripts": {
// ํ๋ก์ ํธ์ Prettier ํจํค์ง๊ฐ ์ค์น๋์ด ์์ผ๋ฏ๋ก npx๋ฅผ ๋ถ์ด์ง ์์๋ค
"format": "prettier --write '**/*.{js,jsx,ts,tsx}'"
},
Husky ์ค์
Goot Hook์ ์ฌ์ฉํ๋ฉด ์ปค๋ฐ, ํธ์ ๋ฑ์ git ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ ๋ฏธ๋ฆฌ ์ง์ ํ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋๋ก ํ ์ ์๋ค. ์ปค๋ฐํ์ ๋ ํน์ ๋์์ ์ํ(์ปค๋ฐ ์ ์ ์ํ)ํ๋ pre-commit hook์ ๋ง์ด ์ฌ์ฉํ๋ค. Git Hook ์ ์ด๋ ๋ณดํต Husky ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์์ ํ ํ์ผ์ ๋ํด์๋ง Hook์ ์คํํ๊ธฐ ์ํด Lint Staged๋ฅผ ์ฌ์ฉํ๋ค.
์๋๋ pre-commit hook์ ์ด์ฉํด ์์ ํ์ผ์ ์ปค๋ฐํ์ ๋ Prettier ํฌ๋งคํ
์ ์ํํ๋ ๋ฐฉ๋ฒ์ด๋ค. ํ๋ก์ ํธ์์ "eslint-config|plugin-prettier"
ํ๋ฌ๊ทธ์ธ์ ํตํด Prettier ์ฝ๋ ์คํ์ผ ๊ท์น ์ค๋ฅ๋ฅผ ESLint์์ ํ์ํ๊ณ ์์ ํ๋๋ก ์ค์ ํ๋ค๋ฉด prettier --write
๋์ eslint --fix
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ค.
โถ ํจํค์ง ์ค์น
yarn add -D husky lint-staged # husky, lint-staged ํจํค์ง ์ค์น
โท husky ์ด๊ธฐ ์ธํ
npx husky install # ๋ช
๋ น์ด ์คํ ํ ๋ฃจํธ ํด๋์ .husky ํด๋ ์์ฑ๋จ
โธ package.json ํ์ผ์ prepare
์คํฌ๋ฆฝํธ ์ถ๊ฐ
npm pkg set scripts.prepare="husky install"
์ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด package.json ํ์ผ์ prepare
์คํฌ๋ฆฝํธ ๋ช
๋ น์ด๊ฐ ์ถ๊ฐ๋๋ค. prepare
์คํฌ๋ฆฝํธ๋ ํจํค์ง๋ฅผ ์ค์นํ๊ฑฐ๋ ์
๋ฐ์ดํธํ ๋ ์๋์ผ๋ก ์คํ๋๋ค. ์ฆ, ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ํด๋ก ํ๊ณ ํจํค์ง๋ฅผ ์ค์นํ ๋ prepare
์คํฌ๋ฆฝํธ๋ ์คํ๋ผ์ husky๊ฐ ์ค์น๋๋ค.
// package.json
"scripts": {
"prepare": "husky install"
},
โน .husky/pre-commit ํ์ผ์ npx lint-staged
๋ช
๋ น์ด ์ถ๊ฐ (yarn lint-staged
๋ ๊ฐ๋ฅ)
npx add .husky/pre-commit "npx lint-staged"
์ ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด .husky/pre-commit ํ์ผ ์ ์ผ ๋ง์ง๋ง์ npx lint-staged
๋ช
๋ น์ด๊ฐ ์ถ๊ฐ๋๋ค. ํด๋น ํ์ผ์ ์ํ๋ ๋ช
๋ น์ด๋ฅผ ์ง์ ์ถ๊ฐํด๋ ๋๋ค.
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npx lint-staged
โบ package.json ํ์ผ์ lint-staged
์์ฑ ๋ฐ ๋ช
๋ น์ด ์ถ๊ฐ. eslint์ --cache
์ต์
์ ์ด๋ฏธ ๋ฆฐํธ๋ฅผ ์๋ฃํ ํ์ผ์ ๊ฒฐ๊ณผ๋ฅผ .eslintcache
์บ์ ํ์ผ์ ์ ์ฅํ๊ณ , ์ดํ ๋ฆฐํธ ์์
๋ ์ด ์บ์๋ฅผ ์ฌ์ฉํด์ ๋ณ๊ฒฝ๋์ง ์์ ํ์ผ์ ๋น ๋ฅด๊ฒ ๊ฑด๋๋ธ ์ ์๋ค. ๋ง์ ํ์ผ์ด ์๋ ํฐ ํ๋ก์ ํธ์์ ์ ์ฉํ ์ต์
.
"lint-staged": {
"*.{js,jsx,ts,tsx}": [
"eslint --cache --fix"
// "eslint-config|plugin-prettier" ํ๋ฌ๊ทธ์ธ์ ์์ด๋ค๋ฉด ์๋ ๋ช
๋ น์ด ์ถ๊ฐ
// prettier --write
]
},
์์ฒ๋ผ ์ค์ ํ๋ค๋ฉด ์ปค๋ฐํ ๋๋ง๋ค ์์ ํ ํ์ผ์ ๋ํด lint-staged
๋ฐฐ์ด์ ๋ฑ๋กํ ๋ช
๋ น์ด๊ฐ ์คํ๋๋ค. ๋ง์ฝ ์ปค๋ฐํ ๋๋ง๋ค ๋ชจ๋ ํ์ผ์ ๋ํด ํน์ ์ก์
์ ์ํํ๊ณ ์ถ๋ค๋ฉด pre-commit ํ์ผ์ ์ํ๋ ๋ช
๋ น์ด๋ฅผ ์ง์ ์ถ๊ฐํ๋ค.
# format๋ package.json.scripts์ ๋ฑ๋กํ ์คํฌ๋ฆฝํธ
# ์ปค๋ฐํ๋ฉด ๋ชจ๋ ํ์ผ์ ๋์์ผ๋ก ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ค
npx add .husky/pre-commit "yarn format"
์ ํธ๋ฆฌํฐ ํด๋์ค ์ ๋ ฌ ๊ท์น
โถ base layer → components layer → utilities layer ์์๋๋ก ์ ๋ ฌ
<!-- `container` is a component so it comes first -->
<div class="container mx-auto px-6">
<!-- ... -->
</div>
โท ๋ค๋ฅธ ํด๋์ค๋ฅผ ๋ฎ์ด์ฐ๋ ํด๋์ค๋ ๋ค์ ์์น (CSS ์ฐ์ ์์์ ๋์ผ)
<!-- pt-2๊ฐ p-4๋ฅผ ๋ฎ์ด์ฐ๋ฏ๋ก pt-2๊ฐ ๋ค๋ก ์ค๋๋ก ์ ๋ ฌ๋จ -->
- <div class="pt-2 p-4">
+ <div class="p-4 pt-2">
<!-- ... -->
</div>
โธ layout์ ์ํฅ์ ๋ฏธ์น๋ ํด๋์ค๋ ์์ ์์น, decorative ํด๋์ค๋ ๋ค์ ์์น
- <div class="text-gray-700 shadow-md p-3 border-gray-300 ml-4 h-24 flex border-2">
+ <div class="ml-4 flex h-24 border-2 border-gray-300 p-3 text-gray-700 shadow-md">
<!-- ... -->
</div>
โน hover:
, focus:
๊ฐ์ ์์ฌ ํด๋์ค๋ ๊ทธ๋ฃนํ๋ ํ plain ์ ํธ๋ฆฌํฐ ํด๋์ค ๋ค์ ์์น
- <div class="hover:opacity-75 opacity-50 hover:scale-150 scale-125">
+ <div class="scale-125 opacity-50 hover:scale-150 hover:opacity-75">
<!-- ... -->
</div>
โบ md:
, lg:
๊ฐ์ ๋ฐ์ํ modifiers๋ ๊ทธ๋ฃนํ๋ ํ ๋ค์ ์์น(smallest → largest ์์)
- <div class="lg:grid-cols-4 grid sm:grid-cols-3 grid-cols-2">
+ <div class="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4">
<!-- ... -->
</div>
โป Tailwind์์ ์ ๊ณตํ์ง ์๋ ์ปค์คํ ํด๋์ค๋ ํญ์ ์์ชฝ์ ์์น
- <div class="p-3 shadow-xl select2-dropdown">
+ <div class="select2-dropdown p-3 shadow-xl">
<!-- ... -->
</div>
๋ ํผ๋ฐ์ค
- Install · Prettier
- Automatic Class Sorting with Prettier - Tailwind CSS
- husky: git hook์ ํตํ ํ ์คํธ ๋ฐ ๋ฆฐํธ ์๋ํ
- husky, lint-staged๋ฅผ ์ฌ์ฉํ์( sub : ESLint ์๋ํํ๊ธฐ )
- How to Set Up ESLint with TypeScript
๊ธ ์์ ์ฌํญ์ ๋ ธ์ ํ์ด์ง์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋ฐ์๋ฉ๋๋ค. ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS] API ์์ฒญ / ๋น๋๊ธฐ ์์ ์ทจ์ํ๊ธฐ - Abort Controller (0) | 2024.05.14 |
---|---|
[Next.js] Next/Image base64 placeholder ๋ง๋ค๊ธฐ (๋ธ๋ฌ ์ฒ๋ฆฌ๋ ํ๋ ์ด์คํ๋) (0) | 2024.05.14 |
[JS] ์ ๋ก๋ ์งํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ onUploadProgress (0) | 2024.05.13 |
[Next.js] Next/Image์ sizes ์์ฑ ํบ์๋ณด๊ธฐ (0) | 2024.05.13 |
[JS] ์ธ๋ผ์ธ ์คํ์ผ ์ ์ - cssText (0) | 2024.05.13 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[JS] API ์์ฒญ / ๋น๋๊ธฐ ์์ ์ทจ์ํ๊ธฐ - Abort Controller
[JS] API ์์ฒญ / ๋น๋๊ธฐ ์์ ์ทจ์ํ๊ธฐ - Abort Controller
2024.05.14 -
[Next.js] Next/Image base64 placeholder ๋ง๋ค๊ธฐ (๋ธ๋ฌ ์ฒ๋ฆฌ๋ ํ๋ ์ด์คํ๋)
[Next.js] Next/Image base64 placeholder ๋ง๋ค๊ธฐ (๋ธ๋ฌ ์ฒ๋ฆฌ๋ ํ๋ ์ด์คํ๋)
2024.05.14 -
[JS] ์ ๋ก๋ ์งํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ onUploadProgress
[JS] ์ ๋ก๋ ์งํ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ onUploadProgress
2024.05.13 -
[Next.js] Next/Image์ sizes ์์ฑ ํบ์๋ณด๊ธฐ
[Next.js] Next/Image์ sizes ์์ฑ ํบ์๋ณด๊ธฐ
2024.05.13