Post

Emotion ์‚ฌ์šฉํ•˜๊ธฐ

๐Ÿ“Œ์‹œ์ž‘ํ•˜๋ฉฐ

CSS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ emotion์„ ์‚ฌ์šฉํ•ด๋ณด๊ณ  ์ •๋ฆฌํ•˜๋Š” ๊ธ€!

โœ…emotion

emotion์€ CSS in JS ๋ฐฉ์‹์œผ๋กœ ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค! CSS in JS ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ Styled Component๋ฅผ ์‚ฌ์šฉํ•ด๋ดค๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ดํ•˜๋Š” ๊ฒƒ ์ž์ฒด๋Š” ์–ด๋ ต์ง€ ์•Š์•˜๋‹ค. ๐Ÿ‘€ (์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹๋„ ๊ฑฐ์˜ ๋น„์Šทํ•˜๊ณ โ€ฆ.)

emotion์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ์ด ์ค‘ react๋ฅผ ์ด์šฉํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

1
npm install @emotion/react @emotion/styled

์ด๋•Œ styled API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„๋•Œ๋งŒ @emotion/styled๋ฅผ ์„ค์น˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด์ œ ์ง„ํ–‰ํ•ด๋ณด์ž!

โžก๏ธTS ์‚ฌ์šฉ

๋จผ์ € TSConfigย compilerOptions์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด๋‡ฝ์„ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

1
2
3
4
{
  "jsx": "react-jsx",
  "jsxImportSource": "@emotion/react"
}

โžก๏ธCSS Type

CSS ํƒ€์ž…์„ ์„ค์ •ํ•  ๋• csstype ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•ด type์„ ์ •์˜ํ•ด์ค€๋‹ค.

1
npm install csstype

โžก๏ธBabel Plugin

Babel์€ ์ตœ์‹  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํŠธ๋žœ์ŠคํŒŒ์ผ๋Ÿฌ๋‹ค. ๐Ÿ˜Ž

๋งŒ์•ฝ ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ Babel์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

1
npm install -D @emotion/babel-plugin

โœ…CSS ์ž‘์„ฑํ•˜๊ธฐ

emotion์—์„œ ์ œ๊ณตํ•˜๋Š” css ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์Šคํƒ€์ผ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.

โžก๏ธ๊ฐ์ฒด๋ฆฌํ„ฐ๋Ÿด

๋จผ์ € ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด(๊ฐ์ฒด ์ •์˜ ๊ตฌ๋ฌธ) ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ž‘์„ฑํ•  ๋•Œ ๋‘๊ฐœ์˜ ๊ด„ํ˜ธ `` ์•ˆ์— ๋„ฃ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•˜์ž.

1
2
3
4
5
6
7
8
9
import { css } from "@emotion/react"

const Practice = () => (
  <div
    css=
  >
    ๋งˆ์šฐ์Šค๋ฅผ ํ˜ธ๋ฒ„ํ•˜์„ธ์š”!
  </div>
)

โžก๏ธํ…œํ”Œ๋ฆฟ๋ฆฌํ„ฐ๋Ÿด

๋ฐฑํ‹ฑ์„ ์‚ฌ์šฉํ•ด ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹๋„ ์กด์žฌํ•œ๋‹ค. ์œ„์—์„œ ๊ฐ์ฒด๋ฆฌํ„ฐ๋Ÿด์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” backgroundColor๊ณผ ๊ฐ™์ด Camel Case๋กœ ์ž‘์„ฑํ–ˆ์œผ๋‚˜, ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์˜ ๊ฒฝ์šฐ background-color์ฒ˜๋Ÿผ ์ผ๋ฐ˜ css ์ž‘์„ฑ ๋ฐฉ์‹๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•จ์— ์ฃผ์˜ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import { css } from "@emotion/react"

const Practice = () => (
  <div
    css={css`
      background-color: red;
      &:hover {
        color: lightgreen;
      }
    `}
  >
    ๋งˆ์šฐ์Šค๋ฅผ ํ˜ธ๋ฒ„ํ•˜์„ธ์š”!
  </div>
)

โžก๏ธ๋ณ€์ˆ˜ ์‚ฌ์šฉํ•˜๊ธฐ

๋ณ€์ˆ˜๋กœ css๋‚ด์šฉ์„ ์„ ์–ธํ•˜์—ฌ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค!

1
2
3
4
5
6
7
8
9
10
11
12
import { css } from "@emotion/react"

const buttonStyle = css`
  color: red;
  &:hover {
    color: lightgreen;
  }
`

const Practice = () => (
  <button className={buttonStyle}>๋งˆ์šฐ์Šค๋ฅผ ํ˜ธ๋ฒ„ํ•˜์„ธ์š”!</button>
)

โœ…Styled API ์‚ฌ์šฉํ•˜๊ธฐ

Styled API๋ฅผ ์‚ฌ์šฉํ•ด ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ element๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค! ๊ธฐ์กด์— ์‚ฌ์šฉํ•ด๋ณด์•˜๋˜ Styled Component ์ž‘์„ฑ๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์ด๋‹ค.

1
2
3
4
5
6
7
8
9
10
import styled from "@emotion/styled"

const Button = styled.button`
  color: red;
  &:hover {
    color: lightgreen;
  }
`

const Practice = () => <Button>๋งˆ์šฐ์Šค๋ฅผ ํ˜ธ๋ฒ„ํ•˜์„ธ์š”!</Button>

โœ…Emotion VS Styled-Components

๊ทผ๋ฐ ์ด์ฏค ๋˜๋‹ˆโ€ฆ ๋‘ ๊ฐ€์ง€์˜ CSS in JS๊ฐ€ ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค.

๋จผ์ €, emotion ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋„ ์ž์‹ ๋“ค์˜ styled API๊ฐ€ Styled Components์™€ glamorous์—์„œ ๋งŽ์€ ์˜๊ฐ์„ ๋ฐ›์•˜๋‹ค๊ณ  ์“ฐ์—ฌ์žˆ๋‹ค. ๐Ÿค”

๊นƒํ—ˆ๋ธŒ โญ์„ ์ฐธ๊ณ ํ•ด๋ณด๋ฉด styled components๊ฐ€ 40.2k, emotion์ด 17.3k๋กœ styled components๊ฐ€ ํ›จ์”ฌ ๋†’์ง€๋งŒ, ์ตœ๊ทผ ๋‹ค์šด๋กœ๋“œ ์ˆ˜๋ฅผ ๋ณด๋ฉด @emotion/react > styled components > @emotion/styled์˜ ์–‘์ƒ์„ ๋ณด์ธ๋‹ค. ๐Ÿค”

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์ด์ฆˆ๋Š” styled components๊ฐ€ @emotion/react์™€ @emotion/styled ๋ณด๋‹ค ํฐ ํŽธ์ด๋‹ค.

๋งŒ์•ฝ @emotion/react๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋” ๊ฐ€๋ฒผ์›Œ์ง„๋‹ค.๐Ÿ˜Œ

์—ฌ๋Ÿฌ ๊ธ€ ๋“ค์„ ์ฐพ์•„๋ณด์•˜๋Š”๋ฐ, ์–ด๋–ค ๊ธ€์€ emotion์ด ์„ฑ๋Šฅ์ƒ ์ด์ ์ด ์žˆ๋‹ค๊ณ ๋Š” ํ•˜์ง€๋งŒ styled components๋„ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์ด๋ฃจ๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์‚ฌ์ด์ฆˆ๊ฐ€ ์ž‘๊ณ , css props์™€ styled API๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ์ ์—์„œ emotion์˜ ์†์„ ๋“ค์–ด์ฃผ๊ณ  ์‹ถ๋‹ค.

๐Ÿ—‚๏ธ์ฐธ๊ณ  ์‚ฌ์ดํŠธ

This post is licensed under CC BY 4.0 by the author.