[Emotion.JS๐Ÿ‘ฉโ€๐ŸŽค]

๊ฐœ๋ฐœ์žยท2023๋…„ 1์›” 3์ผ
0
post-thumbnail

๐ŸŽฑย CSS-in-JS

์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ, javascript์—์„œ CSS๋ฅผ ์ž‘์„ฑ ํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํƒ€์ผ.
์Šคํƒ€์ผ์„ ์ „๋‹ฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ ๋งŒ๋“ค๊ธฐ
์ปดํฌ๋„ŒํŠธ์— ์Šคํƒ€์ผ ์ ์šฉํ•˜๊ธฐ
์ดˆ๊ธฐ ์„ธํŒ…์„ ํ•ด์ฃผ๋ฉด className์ด ์ดˆ๊ธฐ ์„ค์ •๊ฐ’์— ๋งž๊ฒŒ ์ž๋™ ๋ถ€์—ฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๐ŸŽฑย ์šฉ๋Ÿ‰&์„ฑ๋Šฅ

https://bundlehobia.com/๋ฅผ ์ฐธ๊ณ ํ•ด ์ตœ์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์ด์ฆˆ๋ฅผ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์šฉ๋Ÿ‰์€ ๋น„์Šทํ•ด๋ณด์ด์ง€๋งŒ @emotion/react์™€ styled-components๋ฅผ ๋†“๊ณ  ๋น„๊ตํ•ด ๋ดค์„ ๋• 1.5๋ฐฐ ์ •๋„ ์ฐจ์ด๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค.

๐ŸŽฑ ์ดˆ๊ธฐ์„ค์ •

๋งŒ์•ฝ styled-component๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด @emotion/styled๋ฅผ ์„ค์น˜ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

$ npm install @emotion/react

$ npm install @emotion/styled

์•„๋ž˜์™€ ๊ฐ™์ด className์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•˜๋ ค๋ฉด @emotion/babel-plugin ์„ ์„ค์น˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

$ npm install @emotion/babel-plugin

๐Ÿ“‚ /.babelrc

labelFormat ์—์„œ ์„ค์ •๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ๋ฉด ์„ธํŒ…๊ฐ’์— ๋”ฐ๋ผ์„œ className์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

{
  "presets": ["next/babel", "@emotion/babel-preset-css-prop"],
  "plugins": [
    [
      "@emotion",
      {
        "autoLabel": "dev-only", //๊ธฐ๋ณธ๊ฐ’
        "labelFormat": "[dirname]-[filename]-[local]"
      }
    ]
  ]
}

๐Ÿ“‚ /tsconfig.json

css props ์„ค์ •

{
  "compilerOptions": {
   ...
    "types": ["@emotion/react/types/css-prop"]
  },
	...
}

๐ŸŽฑ Media Queris ์ž‘์„ฑ๋ฒ•

import { jsx } from '@emotion/react'

const breakPoints = [375, 768, 1024, 1444]

const mq = breakPoints.map(
	bp -> `@media (min-width: ${bp}px)`
)

render (
	<div
		css={{
			color: 'pink'
			[mp[0]]: {
				color: 'blue'
			},
			[mq[1]]: {
				color: 'deepblue'
			}
		}}
	>
		How to use	Media Querues !
	</div>
	<p
		css={css`
		${mq[0]} {
			font-size: 20px;
		}
		${mq[1]} {
			font-size: 26px;
		}
	>
		Emotion CSS !
	</p>
)

๐ŸŽฑ ์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ๋ง ์ ์šฉํ•˜๊ธฐ

Emotion CSS ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

Emotion CSS๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ styled-component์™€ ์ž‘์„ฑ ๋ฒ•์ด ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋ณ€์ˆ˜ ํ•˜๋‚˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ๊ทธ ์•ˆ์— ํ…œํ”Œ๋ฆฟ ๋ฆฌํ„ฐ๋Ÿด์„ ์ด์šฉํ•ด CSS ๋‚ด์šฉ์„ ๋ณ€์ˆ˜์— ๋„ฃ์–ด๋‘ก๋‹ˆ๋‹ค.

์ด์ œ ํ•ด๋‹น ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ๋ถ€๋ถ„์— css={๋ณ€์ˆ˜๋ช…}์„ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

<div css={container}>
	<h1 className="title"> Emotion CSS </h1>
	<p className="desc"> ์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ๋ง ์ ์šฉํ•˜๊ธฐ </p>
</div>
const contiainer = css`
	.title {
	font-size: 30px;
	color: pink;
	.desc {
		fot-size: 18px;
		color: gray
	}
}
`

์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ๋ง

์กฐ๊ฑด์— ๋”ฐ๋ผ css๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉ ์‹œํ‚ค๊ณ  ์‹ถ์„๋•

css๋ฅผ ๋‹ด์€ ๋ณ€์ˆ˜์— props๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค

const normalContainer = css`` // ๊ธฐ์กด ๋ฐฉ์‹
const ConditionalContainer = (props) => css`` //props ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹

๊ด„ํ˜ธ() ์•ˆ์— ์š”์†Œ๋ฅผ ๋‹ด์•„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

<div css={CoditionalContainer({ tp })></div>
const ConditionalContainer = (props) => css`
  padding: 2rem;
  color: ${props.tp === 3
    ? "red"
    : props.nowTime === 2
    ? "blue"
    : props.nowTime === 1
    ? "green"
    : "black"};
`;

๋ฌธ์ œ์ 

Emotion CSS๋Š” CSS-in-์ž‘์„ฑ ๋ฐฉ์‹์œผ๋กœ ์ธ๋ผ์ธ์Šคํƒ€์ผ๋กœ ์ง์ • ์Šคํƒ€์ผ์„ ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<span
  css={css`
    overflow: hidden;
    text-overflow: ellipsis;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    line-height: 1.5;
    word-break: break-all;
    white-space: no-wrap;
  `}
>
  {text}
</span>

์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค๋ฉด ์ง๊ด€์ ๋กœ css ์ ์šฉ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ

๋งŽ์€ ์ค„์˜ ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ ๋  ๊ฒฝ์šฐ ๊ฐ€๋…์„ฑ์„ ํ•ด์นœ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๐ŸŽฑ ๋น„์Šทํ•œ ๋“ฏ ๋‹ค๋ฅธ Emotion ๐Ÿ‘ฉโ€๐ŸŽค VS styled-copoment ๐Ÿ’…

emotion์€ styled-comopnents ์ž‘์„ฑ๋ฒ•๋„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  styled-compents์™€ emotion ๊ฐ„์— ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ์„๊นŒ ์ƒ๊ฐ์ด ๋“ค์–ด ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

  1. TypeScript
  • styled-components์—์„œ๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์•„ @types/styled-components๋ฅผ ์ถ”๊ฐ€๋กœ ์„ค์น˜ ํ•ด์•ผํ•˜์ง€๋งŒ
    emotion์˜ ๊ฒฝ์šฐ ์ž์ฒด์—์„œ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง€์›ํ•ด ๋ณ„๋„๋กœ ์„ค์น˜ ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  1. Server Side Rendering
    • @emotion์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„์ธก ๋ Œ๋”๋ง์€ emotion 10์ด์ƒ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ˜๋ฉด styled-compoents๊ฐ™์€ ๊ฒฝ์šฐ ServerStyleSheet๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. css props
  • props ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ๋ง์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ์‚ฌ์ดํŠธ

css-in-js/README.md at main ยท andreipfeiffer/css-in-js

Introduction

profile
์—‘์Šคํ‹ฐ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€