[๐Ÿ’Ž React] SCSS, css module, styled-components

h-a-n-aยท2023๋…„ 3์›” 23์ผ
1

๐Ÿ’ŽReact

๋ชฉ๋ก ๋ณด๊ธฐ
8/14

๋ฆฌ์•กํŠธ ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ App์— ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์—ฌ๋Ÿฌ ๊ฐœ ๋‹ด๊ณ  ์žˆ๋‹ค๋ณด๋ฉด, App.css์— ์ ์šฉ๋œ ์Šคํƒ€์ผ๋“ค์ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์—๋„ ์ ์šฉ๋˜์–ด ์Šคํƒ€์ผ์ด ์˜ค์—ผ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์ „์ฒด ์ปดํฌ๋„ŒํŠธ์— ๊ณตํ†ต์ ์œผ๋กœ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ css, ํŠน์ • ์ปดํฌ๋„ŒํŠธ์—๋งŒ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•œ css๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์˜ค๋Š˜์€ ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ณ„๋กœ css ๊ด€๋ฆฌํ•ด์ฃผ๊ธฐ ์œ„ํ•ด sass/css module/styled components๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์•Œ์•„๋ณด์ž.

scss(sass)

ํด๋”๊นŠ์ด๊ฐ€ ๋ณต์žกํ•ด์งˆ ๊ฒƒ ๊ฐ™์•„ vite.config.js์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•ด์คฌ๋‹ค.

export default defineConfig({
	resolve: {
        alias: {
            '@': path.resolve(__dirname, './src')
        },
    },
  })

๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉํ•  ํŒŒ์ผ๋“ค
src/styles/button.scss
src/components/index.js
src/components/Button.jsx
App.jsx


๋จผ์ € button.scss์—์„œ ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•œ ํ›„ Button.jsx์—์„œ ```jsx import @/styles/button.scss (from '์–ด์ฉŒ๊ตฌ' ํ˜•ํƒœ ์•„๋‹˜)

function Button({ size, color }) {
return (

    <div>
        <button
            className={`button
          ${size} ${color}
        `}
        >
            ๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค
        </button>
    </div>
)

}
export default Button

์ด๋ฒˆ์— ๋ฐฐ์šด ๊ฒƒ ์ค‘ ์žฌ๋ฐŒ์—ˆ๋˜ ๊ฑด, index.js ์˜€๋‹ค. ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๋‹ค๋ฅธ ํด๋”์—์„œ index.js๋ฅผ import ํ•ด์˜ฌ ๋•Œ ๊ตณ์ด ์ด๊ฒƒ์˜ ์ด๋ฆ„์„ ์ฝ• ์ง‘์–ด ๋ช…์‹œํ•ด์˜ค์ง€ ์•Š์•„๋„ ์ด ๋…€์„๋ถ€ํ„ฐ ์ฐพ์•„์˜จ๋‹ค๋Š” ํŠน์„ฑ์ด ์žˆ์–ด์„œ import ํ•  ๋•Œ ์ฝ”๋“œ๊ฐ€ ์ข€ ๋” ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด,components/index.js ํŒŒ์ผ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ๊ณ ,
```jsx
import Button from './Button'

export { Button }

๊ทธ๋Ÿผ ์ด์ œ App.jsx ์—์„œ Button.jsx๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ๋Š”

import { Button } from '@/components'

์ด๋ ‡๊ฒŒ๋งŒ ์ ์–ด์ฃผ๋ฉด ๋๋‚˜๋Š” ๊ฒƒ์ด๋‹ค.
@/components/Button.jsx ๊นŒ์ง€ ์ ์„ ๊ฒŒ ์•„๋‹ˆ๋ผ /components๊นŒ์ง€๋งŒ ์จ๋„ index.js๋ฅผ ๋ฐ”๋กœ ์ฐพ์•„๋ฒ„๋ฆฌ๋Š” ํŠน์„ฑ์ƒ(๋ˆ„๊ตฌ์˜ ํŠน์„ฑ์ธ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๋งŒ, ์•„๋ฌดํŠผ index ์ด๋ฆ„๋ถ€ํ„ฐ ์ฐพ๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํŒŒ์ผ ์ด๋ฆ„์„ ์ผ๋ถ€๋Ÿฌ index๋ผ๊ณ  ์ง“๋Š”๊ฑฐ๋ผ๊ณ ...!) ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์กŒ๋‹ค.

module.css

App.css ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ App.js์—์„œ importํ•ด์„œ ์“ด๋‹ค๊ณ  ํ•ด๋„ App.css์— ์ ์€ ํด๋ž˜์Šค๋ช…๋“ค์€ ๋‹ค๋ฅธ .js ์—๊นŒ์ง€ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค.(์˜ค์—ผ)
๊ทธ๋Ÿด ๋• ๊ทธ๋ƒฅ CSS ํŒŒ์ผ์—์„œ๋„ ๋‹ค๋ฅธ JS ํŒŒ์ผ์— ๊ฐ„์„ญํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“ˆํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š”๋ฐ ์ปดํฌ๋„ŒํŠธ๋ช….module.css ์ด๋ ‡๊ฒŒ css ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค!(scss ์•ˆ๋จ)
๊ทธ๋Ÿฌ๋ฉด ๊ทธ ์Šคํƒ€์ผ๋“ค์€ ์˜ค๋กœ์ง€ ๊ทธ ์ปดํฌ๋„ŒํŠธ์—๋งŒ ์ ์šฉ์ด ๋œ๋‹ค.
๋˜ํ•œ, ํด๋ž˜์Šค๋ช…๋งˆ๋‹ค ๊ณ ์œ ๊ฐ’์„ ๋ถ€์—ฌํ•ด์„œ ํด๋ž˜์Šค๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•œ๋‹ค.

์‚ฌ์šฉํ•  ํŒŒ์ผ:
src/styles/module.css
src/components/Button.jsx


css๋ชจ๋“ˆ์€ scss ๋ฌธ๋ฒ•์€ ๋ชป ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์Šฌํ”ˆ ๋‹จ์ ์ด ์žˆ๋‹ค. styles ํด๋”์—์„œ button.module.css๋ฅผ ์ž‘์„ฑํ•œํ›„ Button.jsx์— import ํ•ด์™”๋‹ค. ๋ถˆ๋Ÿฌ์˜จ ํ›„์—๋Š” `๋ถˆ๋Ÿฌ์˜จ์ด๋ฆ„.ํด๋ž˜์Šค๋„ค์ž„`์˜ ํ˜•ํƒœ๋กœ className์— ์ ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
import style from '../styles/button.module.css'

function Button() {
    return (
        <div>
            <button
                className={`${style.button}
              ${style.large} ${style.secondary}  
            `}
            >
                ๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค
            </button>
        </div>
    )
}
export default Button

styled-components

์Šคํƒ€์ผ์ด ์ ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ชจ๋“ˆ!
์ปดํฌ๋„ŒํŠธ๋ณ„๋กœ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด์ œ stylesํด๋”๊ฐ€ ์•„๋‹ˆ๋ผ ์ปดํฌ๋„ŒํŠธ๋ณ„ ํด๋”๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.
์‚ฌ์šฉํ•  ํŒŒ์ผ:

src/components/Button/index.jsx
src/components/Button/style.js

yarn add styled-components๋กœ ์„ค์น˜ํ•ด์ฃผ๊ณ , ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•  ๋ฐฑํ‹ฑ ์•ˆ์ชฝ์€ ์ž๋™์™„์„ฑ์ด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํŽธ์˜์ƒ vscode-styled-components ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ๋„ ์„ค์น˜ํ–ˆ๋‹ค.
style.js ๋‚ด์šฉ

import styled from 'styled-components'
//์•„๋ž˜ ํƒœ๊ทธ๋ช…์—” div๋‚˜ button ๊ฐ™์€ html ํƒœ๊ทธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.
const (๋ณ€์ˆ˜๋ช…) = styled.(ํƒœ๊ทธ๋ช…)`

index.jsx ๋‚ด์šฉ

import * as S from './style'
// style.js์—์„œ ์ž‘์„ฑํ•œ ์Šคํƒ€์ผ ๋‚ด๋ถ€ ๋ณ€์ˆ˜๋“ค์„ `S`๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๋œป
function Button(){
  return (
    <S.Button>
      <p>๋ฒ„ํŠผ</p>
      </S.Button>
    // S.Button ์ด๋ผ๊ณ  ํ•จ์œผ๋กœ์จ,
    // ์ผ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹Œ ์Šคํƒ€์ผ์ด ์ ์šฉ๋œ Button ์ด๋ผ๋Š” ๊ฑธ ์•Œ๊ฒŒ ํ•ด์คŒ
  )
}

์Šคํƒ€์ผ๋“œ ์ปดํฌ๋„ŒํŠธ๋Š” props๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

profile
ํ•˜๋ฃจํ•˜๋ฃจ๊ฐ€ ์—ฐ์Šต์ด๋‹ˆ ๋‚ด์ผ์€ ๋” ๊ฐ•ํ•ด์งˆ ๊ฒ๋‹ˆ๋‹ค

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