Emotion

Table of Contents

๐ŸคทTL;DR

  • CSS-in-JS๋Š” ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์šด CSS์˜ ๋ฌธ์ œ๋ฅผ ๋ณด์™„ํ•œ๋‹ค.
  • emotion๊ณผ styled-components๋Š” ์‚ฌ์šฉ์ƒ์˜ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์œผ๋‹ˆ ๊ณจ๋ผ์„œ ์‚ฌ์šฉํ•˜์ž.
  • ์ ์ ˆํ•œ IDE Extension์„ ์ž˜ ํ™œ์šฉํ•˜์ž.
  • CSS-in-JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์ •๋‹ต์ด ์•„๋‹˜์„ ์ธ์ง€ํ•˜์ž.

๐ŸŽจCSS-in-JS

CSS-in-JS๋Š” HTML Element์˜ ์Šคํƒ€์ผ์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ํ†ตํ•ด์„œ ์ง€์ •ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. .css ํŒŒ์ผ์ด ํ•˜๋˜ ์ผ์„ .js ํŒŒ์ผ์—๊ฒŒ ์‹œํ‚ค๋Š” ๊ฒƒ์ด์ฃ . CSS๋Š” CSS์ด๊ณ , JS๋Š” JS์ž…๋‹ˆ๋‹ค. ์™œ ๊ตณ์ด ๋‘˜์„ ํ•ฉ์ณ์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด ์•Œ ์ˆ˜ ์—†๋Š” ๋ฐœ์ƒ์„ ์ดํ•ดํ•˜๋ ค๋ฉด ์šฐ์„  ๊ธฐ์กด css์˜ ๋‹จ์ ์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Untitled

Untitled

์ œ๊ฐ€ ํ•™์Šต ์Šคํ”„๋ฆฐํŠธ๋•Œ ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ ํŒŒ์ผ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ์„ location-bar๋ผ๋Š” ํด๋ž˜์Šค๋ช…์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ์žˆ์ฃ . ๋‹จ์ˆœํžˆ ์ด ๋ถ€๋ถ„๋งŒ ๋ด์„œ๋Š” ํฌ๊ฒŒ ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์ด์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • location-bar ๋ผ๋Š” ํด๋ž˜์Šค๋ช…์€ ์ถ”์ƒ์ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์‚ฌ์šฉ์ž์˜ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ location-bar๋Š” ์žฅ๊ธฐ์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ํŽ˜์ด์ง€์—์„œ, ๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CSS๋Š” ๊ทธ ์ ์šฉ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ƒ๋‹นํžˆ ์ œํ•œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ํด๋ž˜์Šค๋ช…์„ ๋” ๊ธธ๊ณ  ๋ณต์žกํ•˜๊ฒŒ ์ •ํ•  ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค.
  • css ํŒŒ์ผ์€ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋‹น์žฅ ์ € ํŒŒ์ผ์€ ์–ด๋–ค ์ƒํ’ˆ์˜ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ๋งŒ์ด ๋ชจ์—ฌ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํ’ˆ ์ •๋ณด์™€ ์‚ฌ์šฉ์ž ์œ„์น˜๋Š” ํฌ๊ฒŒ ์—ฐ๊ด€์ด ์—†์–ด๋ณด์ž„์—๋„ ๊ฐ™์€ ํŽ˜์ด์ง€์— ์žˆ๋‹ค๋Š” ์ด์œ ๋กœ ๊ฐ™์€ ํŒŒ์ผ์— ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด 400์ค„ ๊ฐ€๋Ÿ‰ ๋˜๋Š” ํŒŒ์ผ์—์„œ ์ € ๋ถ€๋ถ„์„ ์ฐพ์•„์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—…ํ•  ๋‹น์‹œ์—๋Š” ๋‹น์—ฐํ•œ ๋ถˆํŽธํ•จ์ด๋ผ ์ƒ๊ฐํ•˜๊ณ  ๊ฐ๋‚ดํ•ด ์™”์ง€๋งŒ, ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์กŒ์„ ๋•Œ๋ฅผ ์ƒ์ƒํ•ด ๋ณด๋‹ˆ ๋จธ๋ฆฌ๊ฐ€ ์‹œํฐํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด CSS-in-JS์ž…๋‹ˆ๋‹ค.

๐Ÿ˜†emotion/styled

React์—์„œ ์‚ฌ์šฉํ•˜๋Š” CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” styled-components์™€ emotion ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‚ฌ์‹ค ์‚ฌ์šฉํ•˜๋Š” ์ž…์žฅ์—์„œ ์ฐจ์ด๊ฐ€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ณด๋ฉด emotion๋งŒ์ด css props๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ฐจ์ด์ ์„ ์ด์•ผ๊ธฐํ•˜์ง€๋งŒ, ์ง€๊ธˆ ์‹œ์ ์—์„œ๋Š” ์–‘์ชฝ ๋‹ค ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ์—ญ์‹œ emotion์ด ์•ž์„ ๋‹ค๋Š” ๋ถ„์„์ด ์žˆ์ง€๋งŒ styled-components ์—ญ์‹œ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๊ณ , ์• ์ดˆ์— ๊ทธ๋ ‡๊ฒŒ ํฐ ํญ์œผ๋กœ ์ฐจ์ด๊ฐ€ ๋‚˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์†์— ์žกํžˆ๋Š” ๊ฒƒ ์•„๋ฌด๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ €๋Š” emotion์ด ๋” ์†์— ์ต๋‹ค๋Š” ์ด์œ ๋กœ emotion์„ ๊ณจ๋ž์Šต๋‹ˆ๋‹ค. styled๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํ‚ค๋ณด๋“œ๋กœ ์ž˜ ์•ˆ ์ณ ์ง€๋”๋ผ๊ตฌ์š”.

npm i @emotion/styled @emotion/babel-plugin

@emotion/babel-plugin์€ babel์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์„ค์น˜ ํ›„ configํŒŒ์ผ์˜ plugins์— @emotion์„ ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ชจ๋“  ์ค€๋น„๊ฐ€ ๋๋‚ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.

export default function TestRecoil() {
  const [count, setCount] = useRecoilState(counterState);
  return (
    <div>
      <div>
        <button
          type="button"
          onClick={() => {
            setCount(count - 1);
          }}
        >
          -
        </button>
        <div>{count}</div>
        <button
          type="button"
          onClick={() => {
            setCount(count + 1);
          }}
        >
          +
        </button>
      </div>
      <button
        type="button"
        onClick={() => {
          setCount(0);
        }}
      >
        ์ดˆ๊ธฐํ™”
      </button>
    </div>
  );
}

Untitled

์•„์ฃผ ์ฐธ์„ ์ˆ˜ ์—†๊ฒŒ ๋ชป์ƒ๊ธด ์ปดํฌ๋„ŒํŠธ๊ตฐ์š”. ์ด์ œ ์ด ์ปดํฌ๋„ŒํŠธ์— ์Šคํƒ€์ผ์„ ์ง€์ •ํ•ด ์ฃผ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น tsxํŒŒ์ผ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์Šคํƒ€์ผ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š” ์  ์ฃผ์˜ํ•˜์„ธ์š”. ์™œ๋ƒ๋ฉด ์ด ๋…€์„๋“ค์ด ์ปดํฌ๋„ŒํŠธ์˜ ์ด๋ฆ„์œผ๋กœ์„œ ์ทจ๊ธ‰๋  ์˜ˆ์ •์ด๊ฑฐ๋“ ์š”!

import styled from '@emotion/styled';
...
const WrapperDiv = styled.div`
  display: flex;
  width: 100%;
  flex-direction: column;
  background-color: #ff0000;
`;

const ButtonContainer = styled.div`
  display: flex;
  flex-direction: row;
  width: 30%;
  background-color: #00ff00;
`;

const ResetButton = styled.button`
  width: 50%;
`;

์ด์ œ ๊ธฐ์กด div์™€ button ํƒœ๊ทธ๋“ค์„ ๋ฐ”๊ฟ”์ค„ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

return (
  <WrapperDiv>
    <ButtonContainer>
      <button
        type="button"
        onClick={() => {
          setCount(count - 1);
        }}
      >
        -
      </button>
      <div>{count}</div>
      <button
        type="button"
        onClick={() => {
          setCount(count + 1);
        }}
      >
        +
      </button>
    </ButtonContainer>
    <ResetButton
      type="button"
      onClick={() => {
        setCount(0);
      }}
    >
      ์ดˆ๊ธฐํ™”
    </ResetButton>
  </WrapperDiv>
);

Untitled

์งœ์ž”! ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ชป์ƒ๊ธด ๊ฑด ๋˜‘๊ฐ™์ง€๋งŒ ์–ด์จŒ๋“  ์ œ ์˜๋„๋Œ€๋กœ ๋ชป์ƒ๊ฒผ๋„ค์š”.

๐Ÿ“‹emotion์˜ ํŠน์ง•

๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•˜์œผ๋‹ˆ, ์•Œ์•„๋‘์–ด์•ผ ํ•  ์ ์„ ์ •๋ฆฌํ•ด๋ด…์‹œ๋‹ค.

Untitled

  • styled component์˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (CamelCase) ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ๊ทœ์น™์ด ์›์ธ์ธ๋ฐ, ์Šคํƒ€์ผ์ด ์ง€์ •๋œ ํƒœ๊ทธ ๊ฐ๊ฐ์ด ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋กœ์„œ ์ทจ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์นด๋ฉœ ์ผ€์ด์Šค๋กœ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ถ€๋ถ„์ด ์ผ๊ด€์„ฑ ์žˆ๊ธฐ๋„ ํ•˜๊ตฌ์š”.
  • ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณ„๋„์˜ style ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ .ts ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ฐ๊ฐ์˜ ์Šคํƒ€์ผ์„ exportํ•˜๊ณ  importํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. css ํŒŒ์ผ๊ณผ์˜ ์ฐจ์ด๋Š” ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ ์ •์˜๋ฅผ IDE๊ฐ€ ๋ฐ”๋กœ ์ฐพ์•„์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. VS Code ๊ธฐ์ค€, Ctrl + ํด๋ฆญ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค!
  • scss ๋ฌธ๋ฒ•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. scss์˜ nesting ๋ฌธ๋ฒ•์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. backquote ์•ˆ์—์„œ๋Š” ์™„์ „ scss์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค!
  • class / id ์„ ํƒ์ž๋ฅผ ์ง€์–‘ํ•ฉ์‹œ๋‹ค! ๊ธฐ๋ณธ์ ์œผ๋กœ scss์˜ ๋ชจ๋“  ์„ ํƒ์ž๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, ํด๋ž˜์Šค ๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ถ”์ฒœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์• ์ดˆ์— ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„ ์ž์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ์„ ํƒ์ž๋กœ์„œ์˜ ์—ญํ• ์„ ํ•˜๋‹ˆ๊นŒ์š”. ์–ด๋Š ์บ ํผ๋ถ„์—๊ฒŒ ๋“ค์—ˆ๋˜ ๋‚ด์šฉ์ธ๋ฐ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

โ“ ์•„๋‹ˆ ๊ทธ๋Ÿผ .selected ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋˜ ํด๋ž˜์Šค์˜ ์—ญํ• ์€ ๋ˆ„๊ฐ€ ํ•˜๋‚˜์š”? emotion์€ ๋†€๋ž๊ฒŒ๋„ CSS props๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ React Component์—์„œ ์‚ฌ์šฉํ•˜๋Š” Props๋ฅผ ๊ทธ๋Œ€๋กœ CSS์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

์ œ๋ชฉ ์—†์Œ-1.png

์œ„์™€ ๊ฐ™์ด props๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์œ ๋™์ ์ธ ์Šคํƒ€์ผ ์ง€์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊น”๋”ํ•˜์ฃ ? ์Šคํƒ€์ผ์˜ props interface์— ์„ ์–ธ๋˜์—ˆ๋Š”๋ฐ ์‹ค์ œ ์‚ฌ์šฉ์—์„œ props ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋นจ๊ฐ„ ์ค„์„ ๊ทธ์–ด ์ฃผ๊ธฐ๋„ ํ•œ๋‹ต๋‹ˆ๋‹ค.

๐Ÿ”จํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ํ™•์žฅ

VS Code์—๋Š” emotion๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ํ™•์žฅ๋“ค์ด ์žˆ๋Š”๋ฐ์š”, ์งค๋ง‰ํ•˜๊ฒŒ ๋ช‡ ๊ฐ€์ง€ ์†Œ๊ฐœํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

Auto Rename Tag

Untitled

ํ™•์žฅ1.gif

tsx, jsx๋ฅผ ํฌํ•จํ•œ ํŒŒ์ผ์—์„œ HTML ํƒœ๊ทธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์—ด๋ฆฐ ํƒœ๊ทธ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ๋ฅผ ๋™์‹œ์— ์ˆ˜์ •ํ•ด ์ฃผ๋Š” ํ™•์žฅ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ div๊ฐ™์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ์šฉ๋˜๋Š” ํƒœ๊ทธ๋ฅผ ์ •ํ™•ํžˆ ์ง์„ ์ฐพ์•„์„œ ์ž๋™์œผ๋กœ ๊ณ ์ณ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ€์ผ ์ ์šฉ์ด ๋งค์šฐ ํŽธํ•ด์ง‘๋‹ˆ๋‹ค.

Highlight Matching Tag

Untitled

Untitled

์—ฌ๋Š” ํƒœ๊ทธ์™€ ๋‹ซ๋Š” ํƒœ๊ทธ๊ฐ€ ๋ˆˆ์— ๋„๋„๋ก ๋ฐ‘์ค„๋กœ ๊ฐ•์กฐํ•ด ์ค๋‹ˆ๋‹ค. Auto Rename Tag์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹์Šต๋‹ˆ๋‹ค.

vscode-styled-components

Untitled

Untitled

Untitled

styled.tag๋ฅผ ํ†ตํ•ด ์Šคํƒ€์ผ์„ ์ง€์ •ํ•˜๋ฉด css ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋‹จ์ˆœ ๋ฌธ์ž์—ด๋กœ ์ธ์‹๋˜์–ด ์ž๋™์™„์„ฑ์ด ์ง€์›๋˜์ง€ ์•Š๋Š”๋ฐ์š”, ์ด ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„์ด css ํ”„๋กœํผํ‹ฐ๋กœ ์ธ์‹๋˜์–ด css ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋“ฏ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌด์ง€ ์ข‹์ฃ ?

Color Highlight

Untitled

Untitled

IDE ์ฐจ์›์—์„œ ์ƒ‰์ƒ์˜ hex code์— ๋Œ€ํ•œ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ง€์›ํ•ด ์ค๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ง€์›ํ•ด์ฃผ๊ธด ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋” ํฌ๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ์ ์ด ๋งˆ์Œ์— ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋กค์„ ์ญ‰ ๋‚ด๋ฆฌ๋‹ค๊ฐ€ ๋ฐœ๊ฒฌํ•˜๊ธฐ๊ฐ€ ์‰ฝ๊ฑฐ๋“ ์š”.

๐Ÿค”์“ฐ์‹œ๊ฒŒ์š”?

CSS-in-JS์˜ ๊ฐœ๋…๊ณผ ๊ทธ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ CSS-in-JS๋Š” ๊ณผ์—ฐ ์ •๋‹ต์ผ๊นŒ์š”? ์–ผ๋งˆ ์ „์— ์Šฌ๋ž™์—์„œ ์ด์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ๊ธ€์„ ๋ดค์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ CSS-in-JS์™€ ํ—ค์–ด์ง€๋Š” ์ด์œ  ๋ผ๋Š” ์ œ๋ชฉ์˜ ๊ธ€์ธ๋ฐ์š”, Emotion์˜ ๋ฉ”์ธ ๊ธฐ์—ฌ์ž ์ค‘ ํ•œ ๋ช…์ด ์ด๋Ÿฐ ๊ธ€์„ ์ผ๋‹ค๋Š” ์ ์—์„œ ๊ณ ๋ฏผํ•ด ๋ณผ ๊ฐ€์น˜๋Š” ์ถฉ๋ถ„ํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ์˜ ๋‹จ์ ๊ณผ React์™€์˜ ๋ช‡ ๊ฐ€์ง€ ์—ญ์‹œ๋„ˆ์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์ œ ์ˆ˜์ค€์—์„œ๋Š” ๋ฌธ์ œ ์ƒํ™ฉ์„ ์ฒด๊ฐํ•˜๊ธฐ๋„, ์ดํ•ดํ•˜๊ธฐ๋„ ์–ด๋ ค์šด ๋‚ด์šฉ์ด์ง€๋งŒ ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ทธ๋Ÿฌํ•˜๋“ฏ CSS-in-JS๋„ ๊ทธ ์žฅ๋‹จ์ ์„ ์ธ์ง€ํ•˜๋ฉด ์ƒํ™ฉ์— ๋”ฐ๋ผ ์–ด๋Š ์„ ํƒ์ด ์ตœ์„ ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ ๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

(๋ฒˆ์—ญ) ์šฐ๋ฆฌ๊ฐ€ CSS-in-JS์™€ ํ—ค์–ด์ง€๋Š” ์ด์œ 

๐Ÿ“–Refs.

https://github.com/jsjoeio/styled-components-vs-emotion
styled-components ๊ณผ emotion, ๋„๋Œ€์ฒด ์ฐจ์ด๊ฐ€ ๋ญ”๊ฐ€?
[๋ฒˆ์—ญ] CSS-in-JS์— ๊ด€ํ•ด ์•Œ์•„์•ผ ํ•  ๋ชจ๋“  ๊ฒƒ
does not exist on type ‘jsx.intrinsicelements’ ๋ฌธ์ œ ํ•ด๊ฒฐ
(๋ฒˆ์—ญ) ์šฐ๋ฆฌ๊ฐ€ CSS-in-JS์™€ ํ—ค์–ด์ง€๋Š” ์ด์œ 
ํŽ˜์–ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๊ฐ„๋™์•ˆ ์ œ๊ฐ€ ๊ฒ€์ƒ‰ ํ•œ ๋ฒˆ ์—†์ด emotion์„ ๋Šฅ์ˆ™ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธ๊ฐ„ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๋˜์–ด์ฃผ์‹  J154 ์ด์ •์šฑ ์บ ํผ๋‹˜๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๐Ÿ™‡