๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
WEB/REACT

[React] styled-components

by mingzoo 2021. 2. 3.

๐Ÿ“–๋ฆฌ์•กํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ๐Ÿ“–์„ ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ 14์žฅ์—์„œ ๋‰ด์Šค๋ทฐ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๋ถ€๋ถ„์—์„œ ์ฒ˜์Œ์œผ๋กœ styled-components์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ด ์–ธ๊ธ‰๋˜์—ˆ๋‹ค. ์ด ๋•๋ถ„์— ํŽ˜์ด์ง€๋Š” ์ด์˜๊ฒŒ ์™„์„ฑ๋˜์—ˆ์ง€๋งŒ ์™œ css, sass(scss)๋ฅผ ์ด์šฉํ•˜์ง€์•Š๊ณ  styled-components๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ์ผ๊นŒ? ์ด๋Ÿฐ ๊ถ๊ธˆ์ฆ์„ ์–ป๊ฒŒ ๋˜์–ด ๋‚˜๋Š” ๋‹ค์‹œ ๊ตฌ๊ธ€๋ง์„ ์‹œ์ž‘ํ–ˆ๋‹ค.

 

๊ตฌ๊ธ€์— "styled-components"๋ฅผ ์ณ๋ณด์•˜๋”๋‹ˆ ์ด ์›น์‚ฌ์ดํŠธ๊ฐ€ ๋–ด๋‹ค. ์Šคํƒ€์ผ๋“œ ์ปดํฌ๋„ŒํŠธ์˜ ๊ณต์‹ ์›น์‚ฌ์ดํŠธ์ธ๊ฐ€ ๋ณด๋‹ค.

์ด ์‚ฌ์ดํŠธ์— ๋”ฑ ์ฒ˜์Œ์— ๋“ค์–ด๊ฐ€์ž๋งˆ์ž ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ์“ฐ์—ฌ์ ธ์žˆ๋‹ค.

 

Visual primitives for the component age? ์ผ๋‹จ ๋ญ ๋น„์ฃผ์–ผ์ ์œผ๋กœ ๋„์™€์ค€๋‹ค๋Š” ์†Œ๋ฆฌ๊ฐ™๋‹ค

Use the best bits of ES6 and CSS to style your apps without stress? ์ด ๋ง์€ styled-component๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋”ฑ ์„ค๋ช…์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด, ์ผ๋‹จ! ๋ฆฌ๋‹ค๊ธฐ ๋‰ด์Šค๋ทฐ์–ด ์˜ˆ์ œ์— ๋“ค์–ด์žˆ๋Š” styled-component์ฝ”๋“œ๋ฅผ ๋จผ์ € ๋ณด๋ฉด์„œ ์–˜๊ธฐํ•ด์•ผ๊ฒ ๋‹ค.

 

const NewsListBlock = styled.div`
    box-sizing: border-box;
    padding-bottom: 3rem;
    width: 768px;
    margin: 0 auto;
    margin-top: 2rem;
    @media screen and (max-width: 768px){
        width: 100%;
        padding-left:1rem;
        padding-right: 1rem;
    }
`;

 

์ด ์ฝ”๋“œ๋Š” ๋‰ด์Šค๋ฆฌ์ŠคํŠธ์—์„œ ํ•˜๋‚˜ํ•˜๋‚˜๋งˆ๋‹ค ๋ธ”๋Ÿญ์— ๋Œ€ํ•ด ์„ค์ •ํ•ด์ฃผ๊ณ  ์žˆ๋Š” ์ฝ”๋“œ์ด๋‹ค.

๋ณด๋ฉด ์ผ๋‹จ const NewsListBlock = ์ด๊ฑด ๋ญ ์•ž์„ ๊ตฌ๋ฅด๊ณ  ๋’ค๋ฅผ ๊ตฌ๋ฅด๋ฉด์„œ ๋ด๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์ด๋‹ค.

์—ฌ๊ธฐ์„œ  = styled.div` ์ด๋ถ€๋ถ„์— style. ๋’ค์— ์žˆ๋Š” div ์ด๊ฑฐ๋Š” htmlํƒœ๊ทธ ๋ฌธ๋ฒ•์ด๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ``; ์ด ๋ถ€๋ถ„ ์•ˆ์—๋Š” ์ด ๋ถ€๋ถ„์„ ๊พธ๋ฉฐ์ฃผ๊ณ  ์„ค์ •ํ•ด์ฃผ๋Š” css๋ฌธ๋ฒ•์œผ๋กœ ๊ฐ€๋“์ฐจ์žˆ๋‹ค.

 

์ž ๊ทธ๋Ÿฌ๋ฉด Use the best bits of ES6 and CSS to style your apps without stress ์œ„์— ์ด๋ ‡๊ฒŒ ์จ์ ธ์žˆ๋˜ ์„ค๋ช…์ด ๋ญ”๊ฐ€ ์ดํ•ด๊ฐ€ ๋˜๋Š”๊ฐ€?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, css ๋ฌธ๋ฒ•์„ ๋‹ค ํฌํ•จํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์„œ ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์ผ๋‹จ ์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ๊ฐ„๋‹จํžˆ ์ดํ•ดํ•ด๋ณด๊ณ  ๊ณต์‹ ์‚ฌ์ดํŠธ์˜ Documentation๋ถ€๋ถ„์— ๋“ค์–ด๊ฐ€๋ดค๋”๋‹ˆ Motivation์ด๋ผ๊ณ  ์จ์ ธ์žˆ๋Š” ๋ถ€๋ถ„์„ ํด๋ฆญํ–ˆ๋”๋‹ˆ ๋‚ด๊ฐ€ ์ฐพ๋˜ ์™œ ๊ตณ์ด๊ตณ์ด ์‚ฌ๋žŒ๋“ค์ด styled-components๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์ƒ์„ธํ•˜๊ฒŒ ์ ํ˜€์žˆ์—ˆ๋‹ค.

 

  • Automatic critical CSS : ์ผ๋‹จ ์ด๊ฑด ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์„ ์ค„์—ฌ์ค€๋‹ค๋Š” ์–˜๊ธฐ๋‹ค. ๋ณดํ†ต ํ•ด๋‹น jsํŒŒ์ผ์— ๋“ค์–ด๊ฐˆ css์ฝ”๋“œ๋“ค์„ ๋”ฐ๋กœ cssํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ์ ๋Š”๋ฐ, styled-components๋Š” ๊ทธ๋Ÿด ํ•„์š” ์—†์ด ํ•œ ํŽ˜์ด์ง€ ์•ˆ์— ์ปดํฌ๋„ŒํŠธ๋ณ„๋กœ ๋”ฐ๋กœ๋”ฐ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์คฌ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
  • No class name bugs : ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๊ทธ ์ฆ‰์‹œ ์Šคํƒ€์ผ์„ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฒƒ๋“ค๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค๋Š” ์ 
  • Easier deletion of CSS : ์ด๊ฒƒ๋„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ์Šคํƒ€์ผ์„ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ณด๊ธฐ๋„ ํŽธํ•˜๊ณ  ์ง€์šฐ๊ธฐ๋„ ํŽธํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ๋„ ํŽธํ•˜๋‹ค๋Š” ๊ฒƒ
  • Simple dynamic styling : JS์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ทธ๋Ÿฐ dynamic property๋“ค์„ ์•ˆ์— global theme๊ณผ global variable์„ ์‚ฌ์šฉํ•ด css๋กœ ์„ค์ •ํ•ด์ค˜์„œ ๋‹ค๋ฅด๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ 
  • Painless maintenance : ์œ„์—์„œ ๋งํ–ˆ๋˜ ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ cssํŒŒ์ผ, jsํŒŒ์ผ ์ด๋ ‡๊ฒŒ ๋”ฐ๋กœ๋”ฐ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ง€๋ณด์ˆ˜ํ•˜๋Š”๋ฐ๋„ ๊ฐ„ํŽธํ•ด์ง„๋‹ค.
  • Automatic vendor prefixing : ์•„๋‹ˆ๋ฉด ๊ณตํ†ต์ ์œผ๋กœ ์“ฐ์ด๋Š” css์ฝ”๋“œ๋“ค์„ ๋”ฐ๋กœ cssํŒŒ์ผ์— ์จ๋‘๊ณ , ๊ทธ๊ฒƒ์„ styled-components๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ปดํฌ๋„ŒํŠธ ๋ณ„๋กœ ์‘์šฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ๋” ์“ธ ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•˜๋‚˜ํ•˜๋‚˜๋ณด๋‹ˆ ์•„ ์™œ ๊ฐœ๋ฐœ์ž๋“ค์ด styled-components๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ํ™•์‹คํžˆ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

styled-components ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐฉ๋ฒ•

$ npm install --save styled-components

$ yarn add styled-components
//๋‘˜ ์ค‘ ์•„๋ฌด๊ฑฐ๋‚˜ ์จ๋„ ์ƒ๊ด€์—†๋‹ค.
//๊ผญ ์„ค์น˜ํ•˜๊ณ  package.json์— ์ž˜ ์„ค์น˜๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž

 

 


๋‹ค ์ •๋ฆฌํ•ด๋†“๊ณ ๋ณด๋‹ˆ ๋ฒจ๋กœํผํŠธ๋‹˜์ด css, scss, styled-components๋ฅผ ์ข…๋ฅ˜๋ณ„๋กœ ์ •๋ฆฌํ•ด๋†“์€ ํฌ์ŠคํŠธ๋ฅผ ๋ฐœ๊ฒฌํ•˜์˜€๋‹ค.

velog.io/@velopert/react-component-styling

 

๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ๋ง ๋ฐฉ์‹ CSS, Sass, CSS Module, styled-components

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

velog.io

์ด ํฌ์ŠคํŠธ๋Š” ๊ฐ๊ฐ์˜ ์˜ˆ์ œ๋„ ํฌํ•จ๋˜์–ด์žˆ์œผ๋‹ˆ ์•„์ง ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ„๋“ค์ด ์ฝ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

728x90