CSS in JS
Last updated
Last updated
CSS in JS
Styled Components
Emotion
Atomic CSS
TailwindCss
Zero-Runtime CSS
Vanilla Extract
2016
๋ฑ์ฅJavascript๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ์์์ ์คํ์ผ์ ์ง์ ํ๋ ์คํ์ผ๋ง ๊ธฐ์
CSS์ Global Scope์ Specificity ๋ฌธ์ ๋ CSS์ ๊ตฌ์กฐ์ ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์๋ค.
๐ค ๊ทธ๋ ๋ค๋ฉด JS๋ฅผ ํตํด CSS๋ฅผ ๋ง๋ค๊ฒ ๋๋ฉด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ง ์์๊น? ํ๋ ์๊ฐ์ผ๋ก CSS in JS
๊ฐ ํ์ํ๊ฒ ๋๋ค.
ํ์ด์ค๋ถ ๊ฐ๋ฐ์ Vjeux๋ ๋ค์๊ณผ ๊ฐ์ CSS์ 7๊ฐ์ง ๋ฌธ์ ์ ์ ์ ์ํ๋ฉด์, ์ด๋ฌํ ์ด์๋ค์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ผ๋ก CSS-In-JS๋ฅผ ์๊ฐํ๋ค.
Global Namespace : ๋ชจ๋ ์คํ์ผ์ด Global์ ์ ์ธ๋์ด ์ค๋ณต๋์ง class ์ด๋ฆ์ ์ ์ฉํด์ผ ํ๋ ๋ฌธ์
Dependencies : CSS ๊ฐ์ ์์กด๊ด๊ณ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ํ๋ ๋ฌธ์
Dead Code Elimination : ๊ธฐ๋ฅ,์ถ๊ฐ,์ญ์ ๊ณผ์ ์์ ๋ถํ์ํ CSS๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ด๋ ค์ด ๋ฌธ์
Minification : ํด๋์ค ์ด๋ฆ์ ์ต์ํ ๋ฌธ์
Sharing Constants : JS ์ฝ๋์ ์ํ ๊ฐ์ ๊ณต์ ํ ์ ์๋ ๋ฌธ์
Non-deterministic Resolution : CSS ๋ก๋ ์์์ ๋ฐ๋ผ ์คํ์ผ ์ฐ์ ์์๊ฐ ๋ฌ๋ผ์ง๋ ๋ฌธ์
Isolation : CSS์ JS๊ฐ ๋ถ๋ฆฌ๋ ํ์ ์์์ ๋ฐ๋ฅธ ๊ฒฉ๋ฆฌ๊ฐ ์ด๋ ค์ด ๋ฌธ์
Javascript runtime์์ ํ์ํ CSS๋ฅผ ๋์ ์ผ๋ก ๋ง๋ค์ด ์ ์ฉํ๋ค.
๊ฐ๋ฐ์ ๋ชจ๋ : <style>
ํ๊ทธ์ style์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ
๋ฐฐํฌ ๋ชจ๋ : stylesSheet์ CSSStylesSheet.insertRule ํตํด ๋ฐ๋ก CSSOM
์ ์ฃผ์
ํ๋ค.
์ง์ญ ์ค์ฝํ ์คํ์ผ
์ฝ๋ก์ผ์ด์ ( ์ ์ฉ๋๋ ์ปดํฌ๋์ ํจ๊ป ๋ฐฐ์น ๋๋ค.)
์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์๋ฅผ style์ ์ฌ์ฉ ํ ์ ์๋ค.
์คํ์ผ์ด ์์๋ก ๋ณ๊ฒฝ๋๋ ์คํฌ๋กค,๋๋๊ทธ ์ ๋๋กญ ๊ณผ ๊ฐ์ ๋ณต์กํ ์ ๋๋ฉ์ด์ ์ฌ์ฉ์ ์คํ์ผ ๊ณ์ฐ ๋น์ฉ์ด ์ปค์ง๊ธฐ ๋๋ฌธ์ ๋ฐํ์์ ์ค๋ฒํค๋๊ฐ ๋ฐ์ ํ ์ ์๋ค.
๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ธฐ ๋๋ฌธ์ ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์ปค์ง๋ค.
JS ํ์ผ ์์ ์ปดํฌ๋ํธ ์ด๋ฆ์ ์ฐ๋ฏ ์คํ์ผ์ ์ ์ธํ๋ ๋ฐฉ์
Automatic critical CSS
ํ์ด์ง์ ์ปดํฌ๋ํธ๋ฅผ ์ถ์ ํด ํ์ํ ์คํ์ผ๋ง ์ฝ์ ํ๋ค.
No class name bugs
์คํ์ผ์ ๋ํด ๊ณ ์ ํ ํด๋์ค ์ด๋ฆ์ ์์ฑํ๋ค.
Easier deletion of CSS
๋ชจ๋ ์คํ์ผ๋ง์ด ํน์ ์ปดํฌ๋ํธ์ ์ฐ๊ฒฐ๋๋ค. ๋ฐ๋ผ์ ์ปดํฌ๋ํธ๊ฐ ์ญ์ ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ์ ๋ชจ๋ ์คํ์ผ๋ ํจ๊ป ์ญ์ ๋๋ค.
Simple Dynamic Styling
props๋ global theme์ ๊ธฐ๋ฐํ์ฌ ์ฌ๋ฌ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ์ฝ๊ณ ์ง๊ด์ ์ผ๋ก ์ ์ฉํ ์ ์๋ค.
Painless Maintenance
์ปดํฌ๋ํธ์ ์ํฅ์์ฃผ๋ ์คํ์ผ์ ์ฐพ๊ธฐ ์ํด ๋ค๋ฅธ ํ์ผ์ ์ฐพ์ง ์์๋ ๋์ด ์ ์ง ๊ด๋ฆฌ๊ฐ ์ฝ์ต๋๋ค.
Automatic Vendor Prefixing
์๋์ผ๋ก ๋ฒค๋ ํ๋ฆฌํฝ์ค๋ฅผ ๋ถ์ฌ์ค๋ค.
Styled-Components์ ๋ง์ฐฌ๊ฐ์ง๋ก CSS-In-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ข ๋ฅ ์ค ํ๋
MUI(Material UI)๊ฐ ์คํ์ผ๋ง ์์ง์ Emotion์ผ๋ก ์ฑํํ๋ฉด์ ์ด๋ชฉ์ด ์ง์ค๋๊ณ ์๋ค.
css props
inline ์คํ์ผ๋ง ๊ฐ๋ฅ, ๋น๊ต์ ๋ค์ด๋ฐ์ด ๊ฐ๋จ
SSR
SSR์์ ServerStyleSheet ์ค์ ์ด ํ์ํ์ง๋ง, Emotion์ SSR์์ ๋ณ๋์ ์ค์ ์์ด ๋์ํ๋ค.
2017
TailwindCSSJS๊ฐ ์๋ CSS ์ํ๊ณ์์ ์ด๋ฅผ ํด๊ฒฐํ๊ณ ์ ํ๋ ์๋ก์ด ํจ๋ฌ๋ค์์ผ๋ก CSS ํ๋ ์์ํฌ Utiliy-First
๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ฐฉ์์ TailwindCSS ๋ฑ์ฅํ๊ฒ ๋๋ค.
์ฆ, ๋ถํธ์คํธ๋ฉ๊ณผ ๊ฐ์ด ๋ฏธ๋ฆฌ ์ธํ
๋ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ํ์ฉํ๋ ๋ฐฉ์์ผ๋ก Html ํ๊ทธ ๋ด์์ ์คํ์ผ๋ง์ ํ ์ ์๋ค. ๋ฏธ๋ฆฌ ์ ์ ๋ ํด๋์ค ๋ค์์ ์กฐํฉํด์ ์คํ์ผ๋ง ํ๋ ๋ฐฉ์์ Atomic CSS ํจ๋ฌ๋ค์
์ ๋ฐ๋ฅธ๋ค.
Utility-First์ ์ฅ์
CSS ํ์ผ์ ๋ณ๋๋ก ๊ด๋ฆฌํด์ผ ํ ํ์๊ฐ ์๋ค.
๋ชจ๋ ๊ณณ์์ ๋์ผํ ์ ํธ๋ฆฌํฐ ํด๋์ค ์ฌ์ฉํด ์ผ๊ด๋ ์คํ์ผ์ ๊ตฌํํ๊ธฐ ์ฝ๋ค.
๋ก์ฐ ๋ ๋ฒจ์ ์คํ์ผ์ ์ ๊ณตํ๊ณ , ์ฝ๊ณ ์์ ๋กญ๊ฒ ์ปค์คํ ์ด ๊ฐ๋ฅํ๋ค.
HTML๊ณผ CSS์ ๋ถ๋ฆฌ๊ฐ ๋์ง ์์ ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ , ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง
rem ๋จ์๊ฐ ๊ธฐ๋ณธ์ด๊ธฐ ๋๋ฌธ์, px๋จ์ ์๋น์ค๋ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ ๋ณ๊ฒฝ ํด์ผ ํ๋ค.
๋น๋ ํ์์ ๋ชจ๋ ์์ฑ๋๋ฏ๋ก ๋์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ด ์์กด์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น๊ฐ ํ์ํ๋ค.
2020๋
~ 2021๋
์ฏค๋ถํฐ, React์ ์๋์ ์ธ ์ ์ ์จ๋ก ์ธํด CSS-In-JS์ ๋์ ํ์ด ์์๋์๋ค. ๊ทธ๋์ Runtime CSS in JS์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ณ ์ Zero-Runtime CSS-In-JS
๋ฑ์ฅํ๊ฒ ๋์๋ค.
JS Bundle์์ Style์ฝ๋๋ฅผ ๋ชจ๋ ์คํ๋์ด์ผ ํ์ด์ง๊ฐ ๋ก๋๋๋ ๋ฐฉ์์ผ๋ก ๋์
Runtime์ ์คํ์ผ์ ์์ฑํ์ง ์์ผ๋ฉด์ ๋ ๋นจ๋ฆฌ ํ์ด์ง๋ฅผ ๋ก๋ ํ ์ ์๋ค๋ ์ฅ์
Build Time์ CSS๋ฅผ ์์ฑํด์ผ ํ๊ธฐ์ webpack ๋ฑ ๋น๋ ์ํ ์ค์ ์ ๋ฐ๋ก ํด์ผ ํ๋ค.
2020
Vanilla ExtractCSS Modules-in-TypeScript
๋น๋ํ์์ tsํ์ผ์ cssํ์ผ๋ก ๋ง๋ ๋ค.
type-safeํ๊ฒ theme๋ฅผ ๋ค๋ฃฐ ์ ์๋ค.
ํ๋ก ํธ์๋ ํ๋ ์์ํฌ์ ๊ตฌ์ ๋ฐ์ง ์๋ค.
Tailwind ์ฒ๋ผ Atomic CSS๋ฅผ ๊ตฌ์ฑํ ์๋ ์๋ค.
Sttitches ์ฒ๋ผ variant ๊ธฐ๋ฐ ์คํ์ผ๋ง์ ๊ตฌ์ฑํ ์ ์๋ค.
Vanilla Extract๋ ๊ธฐ๋ฅ์ ์ผ๋ก ๋์ ํ์ฅ์ฑ์ ๊ฐ์ง๊ณ ์๋ค. Tailwind CSS๋ฅผ ๋ชจ๋ฐฉํ Sprinkles, Sttiches์ ๋ชจ๋ฐฉํ Recipes , Linaria๋ฅผ ๋ชจ๋ฐฉํ dynamic์ ์ ๊ณตํ๋ค. Vanilla Extract์ ์กฐ๊ธ ๋ถ์กฑํ๋ ์ฌ์ฉ์ฑ์ ์ฑ์์ค ๊ฑฐ์ ๋ชจ๋ CSS in JS๋ฅผ ์ด๋ง๋ผ ํ๋ค๊ณ ๋ณผ ์ ์๋ค.