๐ฎ PurgeCSS ์ฌ์ฉ๋ฒ - CSS ํ๋ ์์ํฌ ์ฝ๋ ์ต์ ํ
CSS ํ๋ ์์ํฌ์ ๋ฌธ์ ์
์น ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ๋ ์๋น์ค ํ์ง๊ณผ ์ฑ๋ฅ๋ ์ค์ํ์ง๋ง, ๋น ์ง์ง ์๋ ๊ฒ์ด ์น๋์์ธ์ด๋ค. ์น๋์์ธ์ ์ฌ์ฉ์์ ์ฒซ์ธ์๊ณผ ๋ง์กฑ๋์ ํฐ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ์ ๊ฒฝ์จ์ผ ํ๋ค. ํ์ง๋ง ์น๋์์ธ์ ์ฒ์๋ถํฐ ๋ง๋๋ ๊ฒ์ ์ฝ์ง ์๋ค. ๋ณต์กํ CSS ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๋ฐ์ํ์ผ๋ก ๋ง๋ค๊ณ ํธํ์ฑ์ ํ์ธํ๋ ๊ณผ์ ์ ๋ง์ ์๊ฐ๊ณผ ๋ ธ๋ ฅ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋์ ๋ง์ ์น ๊ฐ๋ฐ์๋ค์ Bootstrap, Foundation, Bulma, Pure.css, UIKit, Materialise, Tailwind์ ๊ฐ์ CSS ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ๋ค. CSS ํ๋ ์์ํฌ๋ ๋ฏธ๋ฆฌ ์ ์๋ CSS ํด๋์ค์ ๊ตฌ์ฑ ์์๋ฅผ ์ ๊ณตํ์ฌ, ์ผ๊ด๋๊ณ ํ์คํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๊ณ ํ๋ฆฌํฐ์ ์น๋์์ธ์ ๋ง๋ค ์ ์์ผ๋ฉฐ, ์ฌ์ฌ์ฉํ๊ณ ์ ์ง ๊ด๋ฆฌ์๋ ์ฉ์ดํ๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ฌํ CSS ํ๋ ์์ํฌ์๋ ์น๋ช ์ ์ธ ๋จ์ ์ด ์กด์ฌํ๋ค. ์จ๊ฐ ๋์์ธ ์์๋ค์ css ํด๋์ค๋ก ๋ฏธ๋ฆฌ ์ ์ํ์ฌ ํ์ผ๋ก ์ ๊ณตํ๊ธฐ ๋๋ฌธ์, ํ์ฌ ๋ด ์๋น์ค์ ์ฌ์ฉํ์ง๋ ์์ css ์ฝ๋๊ฐ ์์ด๋ ๋ถํ์ํ CSS ์ฝ๋๊ฐ ๋ก๋ฉ๋์ด ์น ํ์ด์ง์ ๋ก๋ฉ ์๋๋ฅผ ์ ํํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋์์ธ๋ ๋์์ธ์ด์ง๋ง ๋ง์ผ ์น ํ์์ง ์๋๊ฐ ๋๋ฆฌ๋ฉด ์๋น์๋ค์ ๋ง์ค์์์ด ๋ค๋ก ๊ฐ๊ธฐ๋ฅผ ํด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์๋น์ค์ ์น๋ช ์ ์ด๊ฒ ๋๋ค. ๊ฑฐ๊ธฐ๋ค CSS ํ์ผ์ ๋น๋๊ธฐ๋ก ๋ก๋ํ๋ฉด ๋ ์ด์์์ด ๊บ ์ ธ SEO์๋ ์ ์๊ฐ ๊น์ด๊ธฐ ๋๋ฌธ์ ์ฐํ์ ์ธ ์ต์ ํ ๋ฐฉ๋ฒ์ ์ ๋ฌดํ๋ค๊ณ ๋ณผ ์ ์๋ค.
๋ฐ๋ผ์ ์ฌ์ฉํ์ง ์์ CSS ํด๋์ค ์ฝ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ์ ์ผํ ๋ฐฉ๋ฒ์ธ๋ฐ, ์ด๋ฌํ ์์ ์ ๊ฐ๋ฐ์๊ฐ ์ผ์ผํ ๋์กฐํ๋ฉฐ ํ ์๋ ์๋ ๋ ธ๋ฆ์ด๋ค.
๊ทธ๋์์ธ์ง Tailwind CSS ํ๋ ์์ํฌ์์๋ ์์ฒด๋ก CSS Tree Shaking ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ, ๋ถํ์ํ CSS ์ฝ๋๋ฅผ ์๋์ผ๋ก ์ ๊ฑฐํ์ฌ ์น ํ์ด์ง์ ๋ก๋ฉ ์๋๋ฅผ ๊ฐ์ ํด์ค๋ค. Tailwind๋ ํ๋ก๋์ (Production) ๋น๋ ์ ์ฌ์ฉํ์ง ์๋ CSS ์ฝ๋๋ฅผ ์๋์ผ๋ก ์ฐพ์ ์ ๊ฑฐํ๋ฏ๋ก ์ต์ข CSS ๋ฒ๋ค์ ํ์ํ ์ฝ๋๋ง ์๋ ์์ ์ฉ๋์ ํ์ผ์ด ๋๊ฒ ๋๋ค.
๊ทธ๋ผ Tailwind๋ฅผ ์ ์ธํ ๋ถํธ์คํธ๋ฉ๊ณผ ๊ฐ์ ๋๋จธ์ง CSS ํ๋ ์์ํฌ๋ ์ด๋ฌํ ์ต์ ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์์ ๊ณ ๋ ค๋์์์ ์ ์ธ ๋์ด์ผ ํ๋ ๊ฒ์ผ๊น?
PurgeCSS
PurgeCSS๋ HTML, JS ๋ฑ์ ํ์ผ์์ ์ฌ์ฉ๋ CSS ์ ํ์์ ์ผ์นํ๋์ง ํ์ธํ๊ณ , CSS ํ์ผ์์ ์ฌ์ฉํ์ง ์๋ ์ ํ์๋ฅผ ์ ๊ฑฐํ์ฌ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํค๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ฌ์ค Tailwind๋ ์์ฒด์ ์ผ๋ก PurgeCSS๋ฅผ ๋ด์ฅํ๊ณ ์์ด CSS ํธ๋ฆฌ ์์ดํน์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค. ๋ถํธ์คํธ๋ฉ ๊ณต์ ํํ์ด์ง์ ๊ฐ๋ด๋ Unused CSS์ ๋ํ ์ต์ ํ๋ก PurgeCSS๋ฅผ ์๋ดํ๊ณ ์๋ ๊ฑธ ๋ณผ ์ ์๋ค.
๋ํ ๋ค์ํ ์น ํ๋ฌ๊ทธ์ธ๊ณผ ํจ๊ป ์ฐ์ผ์ ์์ผ๋, ํ์ฅ์ฑ๋ ์ข๋ค๊ณ ๋ณผ ์ ์๋ค
PurgeCSS CLI ์ฌ์ฉ๋ฒ
์ด ํฌ์คํ ์์๋ ์์ฃผ ๊ธฐ์ด์ ์ธ ์ปค๋งจ๋ ๋ผ์ธ ์ฌ์ฉ๋ฒ๋ง์ ์๊ฐํ๋ค. ๋ง์ผ React๋ Webpack๊ณผ ๊ฐ์ ํ๋ฌ๊ทธ์ธ๊ณผ ํผํฉ ์ฌ์ฉ๋ฒ์ ์๊ณ ์ถ๋ค๋ฉด ์์ ๊ฐ์ด๋ ๋งํฌ์์ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
1. PurgeCSS๋ฅผ ํ๋ก์ ํธ์ ๋ค์ด๋ก๋ ํ๋ค.
# purgecss๋ dev์ฉ์ด๋ devDependencies์ ์ค์น
> npm i --save-dev purgecss
2. CSS ํ๋ ์์ํฌ๋ฅผ ์ ์ฉํ html or js์ css ํ์ผ์ ํ๋ก์ ํธ ํด๋์ ์์น ์ํจ๋ค
- dist : ์ต์ ํ๋ css ํ์ผ์ ๋ด์ ํด๋
- b-boot.css : ๋ถํธ์คํธ๋ฉ ํต์ง ํ์ผ
- index.html : ๋ถํธ์คํธ๋ฉ CSS ์ฝ๋๊ฐ ์ ์ฉ๋ ์นํ์ด์ง ๋ฌธ์
<!-- ๋ถํธ์คํธ๋ฉ ํด๋์ค ์ฝ๋๊ฐ ์ฌ์ฉ๋ html ํ์ผ -->
<!DOCTYPE html>
<html>
<head>
<title>Bootstrap Sample</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="row">
<div class="col-sm-6">
<h2 class="ps-md-6 m-5">Column 1</h2>
<p>Some text..</p>
</div>
<div class="col-sm-6">
<h2>Column 2</h2>
<p>Some text..</p>
</div>
</div>
</div>
</body>
</html>
3. ์๋ CLI ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค.
> npx purgecss --css [๋ถํธ์คํธ๋ฉ ํ์ผ] --content [html or js ํ์ผ] --output [๊ฒฐ๊ณผ๋ฌผ์ ์ ์ฅํ ํด๋]
> npx purgecss --css bootstrap/b-boot.css --content bootstrap/index.html --output bootstrap/dist
Options:
-V, --version ๋ฒ์ ๋ฒํธ๋ฅผ ์ถ๋ ฅํฉ๋๋ค
-con, --content <files...> ์ฝํ
์ธ ํ์ผ์ ๊ธ๋ก๋ธ ํจํด
-css, --css <files...> CSS ํ์ผ์ ๊ธ๋ก๋ธ ํจํด
-c, --config <path> ์ค์ ํ์ผ์ ๊ฒฝ๋ก
-o, --output <path> ์ ๋ฆฌ๋ CSS ํ์ผ์ ์ธ ํ์ผ ๊ฒฝ๋ก ๋๋ ๋๋ ํ ๋ฆฌ
-font, --font-face ์ฌ์ฉํ์ง ์๋ ํฐํธ ํ์ด์ค๋ฅผ ์ ๊ฑฐํ๋ ์ต์
-keyframes, --keyframes ์ฌ์ฉํ์ง ์๋ ํคํ๋ ์์ ์ ๊ฑฐํ๋ ์ต์
-v, --variables ์ฌ์ฉํ์ง ์๋ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ ์ต์
-rejected, --rejected ์ ๊ฑฐ๋ ์ ํ์๋ฅผ ์ถ๋ ฅํ๋ ์ต์
-rejected-css, --rejected-css ์ ๊ฑฐ๋ CSS๋ฅผ ์ถ๋ ฅํ๋ ์ต์
-s, --safelist <list...> ์ ๊ฑฐ๋์ง ์์์ผ ํ ํด๋์ค์ ๋ชฉ๋ก
-b, --blocklist <list...> ์ ๊ฑฐ๋์ด์ผ ํ ์ ํ์์ ๋ชฉ๋ก
-k, --skippedContentGlobs <list...> ์ค์บ๋์ง ์์์ผ ํ ํด๋/ํ์ผ์ ๊ธ๋ก๋ธ ํจํด ๋ชฉ๋ก
-h, --help ๋ช
๋ น์ด์ ๋ํ ๋์๋ง์ ํ์ํฉ๋๋ค
4. CSS ์ต์ ํ๋ ๊ฒฐ๊ณผ๋ฌผ์ด ๋์ค๋ฉด ์๋ณธ ํ์ผ ๋์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ฉด ๋๋ค.