CSS in JS

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • CSS in JS

    • Styled Components

    • Emotion

  • Atomic CSS

    • TailwindCss

  • Zero-Runtime CSS

    • Vanilla Extract

CSS in JS

2016 CSS in JS ๋“ฑ์žฅ

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๊ฐ€ ๋ถ„๋ฆฌ๋œ ํƒ“์— ์ƒ์†์— ๋”ฐ๋ฅธ ๊ฒฉ๋ฆฌ๊ฐ€ ์–ด๋ ค์šด ๋ฌธ์ œ

CSS in JS ํŠน์ง•

๐Ÿ“Œ runtime

Javascript runtime์—์„œ ํ•„์š”ํ•œ CSS๋ฅผ ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด ์ ์šฉํ•œ๋‹ค.

  • ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ : <style> ํƒœ๊ทธ์— style์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ

  • ๋ฐฐํฌ ๋ชจ๋“œ : stylesSheet์„ CSSStylesSheet.insertRule ํ†ตํ•ด ๋ฐ”๋กœ CSSOM์— ์ฃผ์ž…ํ•œ๋‹ค.

์žฅ์ 

  • ์ง€์—ญ ์Šค์ฝ”ํ”„ ์Šคํƒ€์ผ

  • ์ฝ”๋กœ์ผ€์ด์…˜ ( ์ ์šฉ๋˜๋Š” ์ปดํฌ๋„Œ์™€ ํ•จ๊ป˜ ๋ฐฐ์น˜ ๋œ๋‹ค.)

  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋ฅผ style์— ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

  • ์Šคํƒ€์ผ์ด ์ˆ˜์‹œ๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ์Šคํฌ๋กค,๋“œ๋ž˜๊ทธ ์•  ๋“œ๋กญ ๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‚ฌ์šฉ์‹œ ์Šคํƒ€์ผ ๊ณ„์‚ฐ ๋น„์šฉ์ด ์ปค์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ณ„๋„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์ปค์ง„๋‹ค.

CSS in JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : ๐Ÿ’…๐Ÿป Styled Components

  • JS ํŒŒ์ผ ์•ˆ์— ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„์„ ์“ฐ๋“ฏ ์Šคํƒ€์ผ์„ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹

import styled from 'styled-components';

const Paragraph = styled.p`
  color: #00F;
`;

export default function Greeting() {
  return (
    <Paragraph>
      Hello, world!
    </Paragraph>
  );
}

๊ณต์‹๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค

  • Automatic critical CSS

    • ํŽ˜์ด์ง€์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”์ ํ•ด ํ•„์š”ํ•œ ์Šคํƒ€์ผ๋งŒ ์‚ฝ์ž…ํ•œ๋‹ค.

  • No class name bugs

    • ์Šคํƒ€์ผ์— ๋Œ€ํ•ด ๊ณ ์œ ํ•œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ƒ์„ฑํ•œ๋‹ค.

  • Easier deletion of CSS

    • ๋ชจ๋“  ์Šคํƒ€์ผ๋ง์ด ํŠน์ • ์ปดํฌ๋„ŒํŠธ์™€ ์—ฐ๊ฒฐ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ญ์ œ ๋˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ๋ชจ๋“  ์Šคํƒ€์ผ๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋œ๋‹ค.

  • Simple Dynamic Styling

    • props๋‚˜ global theme์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ์„ ์‰ฝ๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Painless Maintenance

    • ์ปดํฌ๋„ŒํŠธ์— ์˜ํ–ฅ์„์ฃผ๋Š” ์Šคํƒ€์ผ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํŒŒ์ผ์„ ์ฐพ์ง€ ์•Š์•„๋„ ๋˜์–ด ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.

  • Automatic Vendor Prefixing

    • ์ž๋™์œผ๋กœ ๋ฒค๋” ํ”„๋ฆฌํ”ฝ์Šค๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค.

CSS in JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : ๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽค Emotion

  • Styled-Components์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ CSS-In-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ข…๋ฅ˜ ์ค‘ ํ•˜๋‚˜

  • MUI(Material UI)๊ฐ€ ์Šคํƒ€์ผ๋ง ์—”์ง„์„ Emotion์œผ๋กœ ์ฑ„ํƒํ•˜๋ฉด์„œ ์ด๋ชฉ์ด ์ง‘์ค‘๋˜๊ณ  ์žˆ๋‹ค.

๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽค Emotion ์˜ ์ฐจ๋ณ„์ 

  • css props

    • inline ์Šคํƒ€์ผ๋ง ๊ฐ€๋Šฅ, ๋น„๊ต์  ๋„ค์ด๋ฐ์ด ๊ฐ„๋‹จ

  • SSR

    • SSR์—์„œ ServerStyleSheet ์„ค์ •์ด ํ•„์š”ํ•˜์ง€๋งŒ, Emotion์€ SSR์—์„œ ๋ณ„๋„์˜ ์„ค์ • ์—†์ด ๋™์ž‘ํ•œ๋‹ค.

์ƒˆ๋กœ์šด CSS ํŒจ๋Ÿฌ๋‹ค์ž„, Atomic CSS

2017 TailwindCSS

JS๊ฐ€ ์•„๋‹Œ CSS ์ƒํƒœ๊ณ„์—์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ์ƒˆ๋กœ์šด ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ CSS ํ”„๋ ˆ์ž„์›Œํฌ Utiliy-First๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ๋ฐฉ์‹์˜ TailwindCSS ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰, ๋ถ€ํŠธ์ŠคํŠธ๋žฉ๊ณผ ๊ฐ™์ด ๋ฏธ๋ฆฌ ์„ธํŒ…๋œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ Html ํƒœ๊ทธ ๋‚ด์—์„œ ์Šคํƒ€์ผ๋ง์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฏธ๋ฆฌ ์ •์˜ ๋œ ํด๋ž˜์Šค ๋„ค์ž„์„ ์กฐํ•ฉํ•ด์„œ ์Šคํƒ€์ผ๋ง ํ•˜๋Š” ๋ฐฉ์‹์˜ Atomic CSS ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋”ฐ๋ฅธ๋‹ค.

์žฅ์ 

  • Utility-First์˜ ์žฅ์ 

    • CSS ํŒŒ์ผ์„ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

  • ๋ชจ๋“  ๊ณณ์—์„œ ๋™์ผํ•œ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ์‚ฌ์šฉํ•ด ์ผ๊ด€๋œ ์Šคํƒ€์ผ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๋‹ค.

  • ๋กœ์šฐ ๋ ˆ๋ฒจ์˜ ์Šคํƒ€์ผ์„ ์ œ๊ณตํ•˜๊ณ , ์‰ฝ๊ณ  ์ž์œ ๋กญ๊ฒŒ ์ปค์Šคํ…€์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹จ์ 

  • HTML๊ณผ CSS์˜ ๋ถ„๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์•„ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ , ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง

  • rem ๋‹จ์œ„๊ฐ€ ๊ธฐ๋ณธ์ด๊ธฐ ๋•Œ๋ฌธ์—, px๋‹จ์œ„ ์„œ๋น„์Šค๋ผ๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ๋ณ€๊ฒฝ ํ•ด์•ผ ํ•œ๋‹ค.

  • ๋นŒ๋“œ ํƒ€์ž„์— ๋ชจ๋‘ ์ƒ์„ฑ๋˜๋ฏ€๋กœ ๋™์  ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

CSS in JS ๋Œ€์œ ํ–‰, Zero-Runtime CSS

2020๋…„ ~ 2021๋…„์ฏค๋ถ€ํ„ฐ, React์˜ ์••๋„์ ์ธ ์ ์œ ์œจ๋กœ ์ธํ•ด CSS-In-JS์˜ ๋Œ€์œ ํ–‰์ด ์‹œ์ž‘๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ Runtime CSS in JS์˜ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž Zero-Runtime CSS-In-JS ๋“ฑ์žฅํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

Zero-Runtime CSS-In-JS

  • JS Bundle์—์„œ Style์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์‹คํ–‰๋˜์–ด์•ผ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘

  • Runtime์— ์Šคํƒ€์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ๋” ๋นจ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ 

    • Build Time์— CSS๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๊ธฐ์— webpack ๋“ฑ ๋นŒ๋“œ ์œ„ํ•œ ์„ค์ •์„ ๋”ฐ๋กœ ํ•ด์•ผ ํ•œ๋‹ค.

2020 Vanilla Extract

  • CSS 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๋ฅผ ์ด๋ง๋ผ ํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”— ์ฐธ๊ณ 

Last updated