4. styled-components

1. styled-components

styled-components @swc/plugin-styled-components

์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ(styled-component)๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ

๐Ÿ™‹๐Ÿปโ€โ™€๏ธ๏ธ ์ฃผ์˜ ์‚ฌํ•ญ

์œ ๋ช…ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ๋Œ€๋ถ€๋ถ„ โ€˜์™œโ€™ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ํ˜น์€ ํ’ˆ๊ณ  ์žˆ๋Š” ์ฒ ํ•™ ๋“ฑ์ด ์ž˜ ์ •๋ฆฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ณต์‹๋ฌธ์„œ๋ฅผ ๊ผญ ์‚ดํŽด๋ณด๋Š” ์Šต๊ด€์„ ๋“ค์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก ์ฐธ๊ณ  ๋ ˆํผ๋Ÿฐ์Šค styled-components basics

๐Ÿ“Œ IDE ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•  ๊ฒƒ - ์Šคํƒ€์ผ ์ฝ”๋“œ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ธ์‹ํ•ด์„œ ์•„๋ฌด๋Ÿฐ ๊ตฌ๋ถ„์ด ์•ˆ ๋˜๋Š”๋ฐ, ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์น˜ํ•˜๋ฉด CSS์ž„์„ ์ธ์‹ ๐Ÿ“Œ Babel Plugin ์„ SWC์—์„œ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํฌํŒ…ํ•œ ๊ฒƒ๋„ ํ•จ๊ป˜ ์„ค์น˜ํ•  ๊ฒƒ(SSR ์ง€์› ๋“ฑ์„ ์œ„ํ•œ ๊ณต์‹ ๊ถŒ์žฅ์‚ฌํ•ญ)

์žฅ์ 

  1. ์ž๋™ ์ค‘์š” CSS ํŽ˜์ด์ง€์— ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ถ”์ ํ•˜๊ณ  ํ•ด๋‹น ์Šคํƒ€์ผ๋งŒ ์ž๋™ ์ ์šฉ, ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œ

  2. ํด๋ž˜์Šค ์ด๋ฆ„ ๋ฒ„๊ทธ ์—†์Œ ๊ณ ์œ ํ•œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘๋ณต, ๊ฒน์นจ ๋˜๋Š” ๋งž์ถค๋ฒ• ์˜ค๋ฅ˜ ๋ฐฉ์ง€

  3. ์†์‰ฌ์šด CSS ์‚ญ์ œ ์Šคํƒ€์ผ์ด ํŠน์ • ์ปดํฌ๋„ŒํŠธ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ๋ชจ๋“  ์Šคํƒ€์ผ๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋จ

  4. ๊ฐ„๋‹จํ•œ ๋™์  ์Šคํƒ€์ผ๋ง ํด๋ž˜์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š” ์—†์ด, props ๋˜๋Š” global theme์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์Šคํƒ€์ผ์„ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ 

  5. ์œ ์ง€ ๋ณด์ˆ˜ ์šฉ์ด ์ปดํฌ๋„ŒํŠธ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์Šคํƒ€์ผ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ํŒŒ์ผ์„ ๋’ค์งˆ ํ•„์š”๊ฐ€ ์—†์Œ

  6. ์ž๋™ ๋ฒค๋” ํ”„๋ฆฌํ”ฝ์Šค CSS๋ฅผ ํ˜„์žฌ ํ‘œ์ค€์— ๋งž๊ฒŒ ์ž‘์„ฑํ•˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜๋ฆฌ

2. ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

ํŒจํ‚ค์ง€ ์„ค์น˜

npm i styled-components

npm i -D @types/styled-components @swc/plugin-styled-components

.swcrc ํŒŒ์ผ ์ž‘์„ฑ

{
    "jsc": {
        "experimental": {
            "plugins": [
                [
                    "@swc/plugin-styled-components",
                    {
                        "displayName": true,
                        "ssr": true
                    }
                ]
            ]
        }
    }
}

๊ฐ„๋‹จํ•œ Styled Component ๋งŒ๋“ค๊ธฐ

import styled from 'styled-components';

const Paragraph = styled.p`
    color: #00F;
    
    strong {
        font-size: 2em;
    }
`;

export default function Greeting() {
    return (
        <Paragraph>
            Hello, world
            <strong>!</strong>
        </Paragraph>
    );
}
  • ๋ธŒ๋ผ์šฐ์ €์—์„œ๋Š” class๋กœ ๋ณ€ํ™˜, ์ธ๋ผ์ธ ์Šคํƒ€์ผ์ด ์•„๋‹ˆ๋ผ CSS

  • ๐Ÿ’ก styled ๊ฐ€ class๋ฅผ ์ถ”๊ฐ€ํ•ด์คŒ <p class="sc-bgqQcB fSBjJp">Hello!</p> sc๋Š” styled-components ๋ฅผ ์˜๋ฏธ

  • ์ค‘์ฒฉ(nested) ์„ ์ง€์› ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ ํ•˜์œ„ ํƒœ๊ทธ์—๋งŒ ์ ์šฉ๋˜๋Š” ๊ฒƒ

์ƒ์† ๋ฐ›์•„ ์ถ”๊ฐ€๋กœ ์Šคํƒ€์ผ ์ž…ํžˆ๊ธฐ

์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์†๋ฐ›์•„ ์ค‘๋ณต์„ ์ค„์ด๊ณ  ์ถ”๊ฐ€๋กœ ์Šคํƒ€์ผ๋ง

import styled from 'styled-components';

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

const BigParagraph = styled(Paragraph)`
    font-size: 2rem;
	
    strong {
        font-size: 1em;
    }
`;

export default function Greeting() {
    return (
        <BigParagraph>
            Hello, world!
        </BigParagraph>
    );
}
  • ์ƒ์†๋ฐ›์€ ๊ฐ’์„ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Œ

๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ์— ์Šคํƒ€์ผ ์ž…ํžˆ๊ธฐ

๐Ÿ”— ์‹ค์Šต ๋งํฌ

โš ๏ธ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๊ฐ€ Class๋ฅผ ์žก์•„์ค˜์•ผ ํ•œ๋‹ค๋Š” ์ ์— ์ฃผ์˜ styled ๊ฐ€ class๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, className์„ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•จ className์€ ์›๋ž˜ ์กด์žฌํ•˜๋Š” ์†์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์— React.HTMLAttributes<HTMLElement> ํƒ€์ž…์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋จ

import styled from 'styled-components';

function HelloWorld({className}: React.HTMLAttributes<HTMLElement>) {
    return (
        <p className={className}>
            Hello, world!
        </p>
    );
}

const Greeting = styled(HelloWorld)`
    color: #00F;
 `;

export default Greeting;

โœ๏ธ ์กฐ๊ฐ๊ธ€

styled๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ๋ชจ๋ฅด๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ๋ธŒ๋ผ์šฐ์ €์—์„œ class๋กœ ๋ณ€ํ™˜๋˜๋„๋ก class๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค๋Š” ๊ฒƒ์„ ์ฒ˜์Œ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋Ÿฐ ์ด์œ ๋กœ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ์— ์Šคํƒ€์ผ์„ ์ฃผ๋ ค๋ฉด className์„ ๋„˜๊ฒจ์ฃผ๋„๋ก ํ•ด์•ผํ•œ๋‹ค. ์ฒ˜์Œ ๊ฐ•์˜๋ฅผ ๋“ค์„ ๋•Œ๋Š” ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๋๋Š”๋ฐ ๋ช‡ ๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ๋“ค์œผ๋‹ˆ ๊นจ๋‹ซ๋Š” ์ˆœ๊ฐ„์ด ์™”๋‹ค.

Last updated