๐Ÿ‘ฉโ€๐Ÿ’ป
Megaptera Frontend
  • ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
    • megaptera-front
    • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 2. TypeScript
      • 3. React
      • 4. Testing Library
      • 5. Parcel & ESLint
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 2. JSX
      • 1. JSX
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 3. React๋กœ ์‚ฌ๊ณ ํ•˜๊ธฐ
      • 1. React Component
      • 2. React State
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 4. React Hooks
      • 1. Express
      • 2. Fetch API & CORS
      • 3. React์˜ Hook
      • 4. useRef & Custom Hook
      • 5. usehooks-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 5. ํ…Œ์ŠคํŠธ
      • 1. TDD
      • 2. React Testing Library
      • 3. MSW
      • 4. Playwright
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 6. External Store
      • 1. External Store
      • 2. TSyringe
      • 3. Redux ๋”ฐ๋ผํ•˜๊ธฐ
      • 4. usestore-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 7. React Router
      • 1. Routing
      • 2. Routes
      • 3. Router
      • 4. Navigation
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 8. CSS in JS
      • 1. Design System
      • 2. Style Basics
      • 3. CSS in JS
      • 4. styled-components
      • 5. props์™€ attrs
      • 6. Global Style & Theme
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 9. ์‡ผํ•‘๋ชฐ ๋ชฉ๋ก, ์ƒํ’ˆ ํŽ˜์ด์ง€
      • 1. ๊ฐœ๋ฐœํ•˜๊ธฐ ์ „ ์ค€๋น„
      • 2. ๋ชฉ๋ก ๋ณด๊ธฐ
      • 3. ์ƒํ’ˆ ์ƒ์„ธ ๋ณด๊ธฐ
      • 4. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ณด๊ธฐ
      • 5. ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ ๋‹ด๊ธฐ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 10. ์‚ฌ์šฉ์ž ์ธ์ฆ, ์ธ๊ฐ€
      • 1. ๋กœ๊ทธ์ธ
      • 2. ๋กœ๊ทธ์•„์›ƒ
      • 3. ํšŒ์›๊ฐ€์ž…
      • 4. ์ฃผ๋ฌธ ๋ชฉ๋ก & ์ฃผ๋ฌธ ์ƒ์„ธ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 11. ์ฃผ๋ฌธ, ๊ฒฐ์ œ
      • 1. ๋ฐฐ์†ก ์ •๋ณด ์ž…๋ ฅ
      • 2. ํฌํŠธ์› ๊ฒฐ์ œ ์š”์ฒญ
      • 3. ๋ฐฐ์†ก ๋ฐ ๊ฒฐ์ œ ์ •๋ณด ์ „๋‹ฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 12. ์–ด๋“œ๋ฏผ
      • 1. ๊ด€๋ฆฌ์ž ์›น ์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ ์‹œ์ž‘
      • 2. ๋กœ๊ทธ์ธ, ์‚ฌ์šฉ์ž ๋ชฉ๋ก
      • 3. ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ
      • 4. ์ฃผ๋ฌธ ๊ด€๋ฆฌ
      • 5. ์ƒํ’ˆ ๊ด€๋ฆฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
Powered by GitBook
On this page
  • 1. Reset CSS
  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
  • 2. GlobalStyle
  • ์ƒ๋Œ€ ๋‹จ์œ„ em, rem
  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
  • 3. box-sizing ์†์„ฑ
  • 4. word-break ์†์„ฑ
  • 5. Theme
  • Theme
  • ๐Ÿ“Œ ๋…ธํ•˜์šฐ์™€ ํŒ
  • ์‚ฌ์šฉ ๋ฐฉ๋ฒ•
  • TypeScript์˜ ๋‘ ๊ฐ€์ง€ ํŒŒ์ผ ์œ ํ˜•
  • d.ts ํŒŒ์ผ
  • styled.d.ts ํŒŒ์ผ
  • 6. ThemeProvider
  • App ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ
  • window.matchMedia ์—๋Ÿฌ ํ•ด๊ฒฐ
  • ์ฐธ๊ณ  ๋ ˆํผ๋Ÿฐ์Šค
  1. ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
  2. 8. CSS in JS

6. Global Style & Theme

Previous5. props์™€ attrsNextํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ

Last updated 2 years ago

1. Reset CSS

Reset CSS๋Š” ๋ชจ๋“  CSS๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ• ๊ธฐ๋ณธ์ ์œผ๋กœ ์ ์šฉ๋˜์–ด ์žˆ๋Š” CSS๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์Œ styled-reset๋Š” styled-components ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ Reset CSS๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๊ฒƒ

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

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

npm i styled-reset

App ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ

import {Reset} from 'styled-reset';

export default function App() {
    return (
        <>
            <Reset/>
            <Greeting/>
        </>
    );
}

2. GlobalStyle

์ „์—ญ ์Šคํƒ€์ผ ์ง€์ • box model, font-size, word-break ๋“ฑ์„ ์ฃผ๋กœ ์ด์šฉ

์ƒ๋Œ€ ๋‹จ์œ„ em, rem

์™ธ๋ถ€ ์š”์ธ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ์œ ๋™์ ์ธ ๊ฐ’์„ ์ง€๋‹ˆ๋Š” ๋‹จ์œ„ em, rem์€ ํ…์ŠคํŠธ ํฌ๊ธฐ๋ฅผ ์กฐ์ •ํ•  ๋•Œ ์‚ฌ์šฉ font-size ์†์„ฑ ๊ฐ’์— ๋น„๋ก€ํ•ด ๊ฐ’์„ ๊ฒฐ์ •

  • em : ๋ถ€๋ชจ ์š”์†Œ์˜ ๊ธ€๊ผด ํฌ๊ธฐ

    • โš ๏ธ ์—ฌ๋ฐฑ ํฌ๊ธฐ๋ฅผ ์ •ํ•  ๋•Œ๋Š” ์ž๊ธฐ ์ž์‹ ์˜ ๊ธ€์ž ํฌ๊ธฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•จ

  • rem(root em) : ๋ฃจํŠธ ์š”์†Œ์˜ ๊ธ€๊ผด ํฌ๊ธฐ

    • ๋ฃจํŠธ ์š”์†Œ(html ์š”์†Œ)์˜ ๊ธฐ๋ณธ ๊ธ€๊ผด ํฌ๊ธฐ : 16px

๐Ÿ’ก ์ƒ๋Œ€ ๋‹จ์œ„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด์— font-size: 62.5%๋ฅผ ์„ค์ • ์‚ฌ์šฉ์ž๊ฐ€ ์„ค์ •ํ•œ ํฐํŠธ ์‚ฌ์ด์ฆˆ์— ๋”ฐ๋ผ๊ฐ body์˜ ํฐํŠธ ์‚ฌ์ด์ฆˆ๋Š” ๋””์ž์ธ์— ๋”ฐ๋ผ ์„ค์ •์ด ๋‹ฌ๋ผ์ง

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

ํ‰์†Œ ์ƒ๋Œ€ ๋‹จ์œ„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์–ด๋ ค์›Œํ–ˆ๋Š”๋ฐ ์ด๋Ÿฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋‹ˆ! ๊ทธ ์™ธ์—๋„ box-sizing ์†์„ฑ ๋•Œ๋ฌธ์— ์–ด๋ ค์›€์„ ๊ฒช์€ ์ ์ด ์žˆ๋Š”๋ฐ GlobalStyle์—์„œ ํ•„์š”ํ•œ ๊ฒƒ๋“ค์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์žกํžˆ๋„๋ก ์„ค์ •ํ•ด์ค˜์„œ ์œ ์šฉํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

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

GlobalStyle.ts ํŒŒ์ผ ์ƒ์„ฑ

src์— styles ํด๋” ์ƒ์„ฑ ํ›„ GlobalStyle.ts ํŒŒ์ผ ์ƒ์„ฑ

// src/styles/GlobalStyle.ts

import {createGlobalStyle} from 'styled-components';

const GlobalStyle = createGlobalStyle`
	html {
		box-sizing: border-box;
	}
	
	*,
	*::before,
	*::after {
		box-sizing: inherit;
	}
	
	html {
		font-size: 62.5%;
	}
	
	body {
		font-size: 1.6rem;
	}
	
	:lang(ko) {
		h1, h2, h3 {
			word-break: keep-all;
		}
	}
`;

export default GlobalStyle;
  • box-sizing: inherit ๋ถ€๋ชจ ์†์„ฑ ๋”ฐ๋ผ๊ฐ€๊ธฐ

  • font-size: 62.5% ๊ธฐ๋ณธ์ ์œผ๋กœ 1rem = 10px

  • :lang(ko) ํ•œ๊ตญ์–ด์—๋งŒ ์ ์šฉ

App ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ

import {Reset} from 'styled-reset';

import GlobalStyle from './styles/GlobalStyle';

export default function App() {
    return (
        <>
          <Reset/>
          <GlobalStyle/>
          <Greeting/>
        </>
    );
}

3. box-sizing ์†์„ฑ

์š”์†Œ์˜ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ • ๐Ÿšจ ๊ธฐ๋ณธ๊ฐ’์ด content-box ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋งŽ์Œ

  • content-box : Content ์˜์—ญ์„ ๊ธฐ์ค€์œผ๋กœ box์˜ size๋ฅผ ์ ์šฉ, โš ๏ธ๊ธฐ๋ณธ๊ฐ’

    • ์•ˆํŒŽ ์—ฌ๋ฐฑ๊ณผ ํ…Œ๋‘๋ฆฌ๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Œ

  • border-box : Border ์˜์—ญ์„ ๊ธฐ์ค€์œผ๋กœ box์˜ size๋ฅผ ์ ์šฉ

    • ์‚ฌ๋žŒ์ด ์ธ์‹ํ•˜๋Š” ๋ฐ•์Šค ํฌ๊ธฐ๋Š” ๋Œ€๊ฐœ border๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•จ

    • content์™€ padding์„ ํฌํ•จํ•œ ๋ฐ•์Šค ํฌ๊ธฐ

4. word-break ์†์„ฑ

ํ…์ŠคํŠธ๊ฐ€ ์ฝ˜ํ…์ธ  ๋ฐ•์Šค ์˜์—ญ ๋ฐ–์œผ๋กœ ๋„˜์ณค์„ ๋•Œ, ์–ด๋–ป๊ฒŒ ์ค„์„ ๋ฐ”๊ฟ€์ง€ ์„ค์ •

  • keep-all(์–ด์ ˆ ๊ธฐ์ค€)

  • break-all(์Œ์ ˆ ๊ธฐ์ค€)

5. Theme

Theme

๋””์ž์ธ ์‹œ์Šคํ…œ์˜ ๊ทผ๊ฐ„์„ ๋งˆ๋ จํ•˜๋Š”๋ฐ ํ™œ์šฉ ์ž˜ ์ •์˜ํ•˜๋ฉด ๋‹คํฌ ๋ชจ๋“œ ๋“ฑ์— ๋Œ€์‘ํ•˜๊ธฐ ์‰ฌ์›€

๋ˆˆ์— ๋ณด์ด๋Š” ๋‹จํŽธ์ ์ธ ์ •๋ณด๋ฅผ ๋„˜์–ด์„œ, ์˜๋ฏธ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ

  • Ex. ํฐ์ƒ‰์ด ์•„๋‹ˆ๋ผ, Primary Color

  • Ex. ํŒŒ๋ž€์ƒ‰์ด ์•„๋‹ˆ๋ผ, ํ…Œ๋‘๋ฆฌ์ƒ‰

๐Ÿ“Œ ๋…ธํ•˜์šฐ์™€ ํŒ

  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŽ์ด ๋‚˜๋ˆ ๋ณผ ๊ฒƒ

  • ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„, ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋“ค ๋งŒ์ด๋ผ๋„ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

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

  1. ๊ธฐ๋ณธ Theme ์ •์˜ : styles ํด๋”์— defaultTheme.ts ํŒŒ์ผ ์ƒ์„ฑ

  2. ๋‹คํฌ ๋ชจ๋“œ ํŒŒ์ผ ์ƒ์„ฑ darkTheme.ts, ๊ธฐ๋ณธ ํ…Œ๋งˆ์™€ ๋™์ผํ•œ ํƒ€์ž…์„ ์ง€์ •

  3. ํƒ€์ž…์„ ์ •์˜ํ•˜๊ณ  defaultTheme์„ ๋งž์ถ”๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•˜๋‹ˆ, ๋ฐ˜๋Œ€๋กœ defaultTheme์—์„œ ํƒ€์ž…์„ ์ถ”์ถœ

    • type Theme = typeof defaultTheme;

    • styles/Theme.ts ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌ

  4. App ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ : <ThemeProvider theme={defaultTheme}>

  5. props.theme ์‚ฌ์šฉ ๊ฐ€๋Šฅ : GlobalStyle.ts์—์„œ ์„ค์ •

  6. ํƒ€์ž… ํŒŒ์ผ ๋ณ€๊ฒฝ

declare module 'styled-components' {
	export interface DefaultTheme extends Theme {}
}
  1. ๋‹ค๋ฅธ theme์„ ์ถ”๊ฐ€ํ•  ๋•Œ Theme ํƒ€์ž…์„ ์‚ฌ์šฉ ํ•ญ์ƒ defaultTheme์— ๋จผ์ € ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€/์‚ญ์ œํ•˜๊ณ , ๋‚˜๋จธ์ง€๋ฅผ ์—ฌ๊ธฐ์— ๋งž์ถ”๋ฉด ๋จ

TypeScript์˜ ๋‘ ๊ฐ€์ง€ ํŒŒ์ผ ์œ ํ˜•

  1. .ts ํŒŒ์ผ ํƒ€์ž… ๋ฐ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜๋Š” ๊ตฌํ˜„ ํŒŒ์ผ .js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ํŒŒ์ผ์ด๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์œ„์น˜

  2. .d.ts ํŒŒ์ผ ํƒ€์ž… ์ •๋ณด๋งŒ ํฌํ•จํ•˜๋Š” ์„ ์–ธ ํŒŒ์ผ .js ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํƒ€์ž… ์ฒดํฌ์—๋งŒ ์‚ฌ์šฉ๋จ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋ฐ›์„ ๋•Œ @types/ ๊ฐ€ ๋ถ™์€ ๊ฒƒ์ด d.ts ํŒŒ์ผ์„ ๋ชจ์•„๋‘” ๊ฒƒ

d.ts ํŒŒ์ผ

d.ts๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์˜ ํƒ€์ž… ์ถ”๋ก ์„ ๋•๋Š” ํŒŒ์ผ

styled.d.ts ํŒŒ์ผ

ํƒ€์ž… ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ styles ํด๋”์— styled.d.ts ํŒŒ์ผ ์ƒ์„ฑ

import 'styled-components';

declare module 'styled-components' {
    export interface DefaultTheme extends Theme {
        colors: { 
            background: string; 
            text: string; 
            primary: string; 
            secondary: string; 
        }
    }
}

๋˜๋Š”

import 'styled-components';
import type Theme from './Theme';

declare module 'styled-components' {
    export interface DefaultTheme extends Theme {}
}

6. ThemeProvider

styled-components์˜ <ThemeProvider> ๋ž˜ํผ ์ปดํฌ๋„ŒํŠธ๋Š” ์ปจํ…์ŠคํŠธ API๋ฅผ ํ†ตํ•ด ์ž๊ธฐ ์ž์‹  ํ•˜์œ„์˜ ๋ชจ๋“  React ์ปดํฌ๋„ŒํŠธ์— ํ…Œ๋งˆ๋ฅผ ์ œ๊ณต ๋ Œ๋” ํŠธ๋ฆฌ์—์„œ ๋ชจ๋“  ์Šคํƒ€์ผ ์ปดํฌ๋„ŒํŠธ๋Š” ์—ฌ๋Ÿฌ ๋ ˆ๋ฒจ์˜ ๊นŠ์ด์ธ ๊ฒฝ์šฐ์—๋„ ์ œ๊ณต๋œ ํ…Œ๋งˆ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ

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

Context API๋ฅผ ํ•™์Šตํ•  ๋•Œ, ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— Redux, React Router, styled-components ๋“ฑ์ด ์žˆ๋‹ค๊ณ  ๋ฐฐ์› ๋‹ค. ์ด ์ค‘ styled-components๋Š” ์™œ ํฌํ•จ๋˜๋Š”๊ฑธ๊นŒ ๊ถ๊ธˆํ–ˆ์—ˆ๋Š”๋ฐ ์ด๋ฒˆ ์‹œ๊ฐ„์— ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ThemeProvider๋ผ๋Š” ๊ฒƒ๋„ ์ฒ˜์Œ ๋“ค์–ด๋ดค๋Š”๋ฐ ํ…Œ๋งˆ๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌํ•  ๋•Œ ํŽธ๋ฆฌํ•  ๊ฒƒ ๊ฐ™๋‹ค. ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ์˜ ํŒŒ์ผ ์œ ํ˜• ์ค‘ d.ts ํŒŒ์ผ์€ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์ž์ฃผ ๋ดค๋Š”๋ฐ ๋‚˜์˜ ์–ธ์–ด๋กœ ์„ค๋ช…ํ•˜๋ ค๋ฉด ๋งค๋„๋Ÿฝ์ง€ ์•Š์•˜์—ˆ๋‹ค. ์ด๋ฒˆ์— ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ณต์‹ ๋ฌธ์„œ์™€ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ ๋งŒ๋“  ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ฒŒ ๋๋‹ค.

App ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

import {useDarkMode} from 'usehooks-ts';

import {Reset} from 'styled-reset';
import GlobalStyle from './styles/GlobalStyle';

import {ThemeProvider} from 'styled-components';
import defaultTheme from './styles/defaultTheme';
import darkTheme from './styles/darkTheme';

import Greeting from './component/Greeting';
import Switch from './component/Switch';

export default function App() {
    const {isDarkMode, toggle} = useDarkMode();
    
    const theme = isDarkMode ? darkTheme : defaultTheme;
    
    return (
        <ThemeProvider theme={theme}>
            <Reset/>
            <GlobalStyle/>
            <Greeting/>
            <Switch/>
            <Button onClick={toggle} active={isDarkMode}>
                Toggle DarkMode
            </Button>
        </ThemeProvider>
    );

window.matchMedia ์—๋Ÿฌ ํ•ด๊ฒฐ

๐Ÿšจ Jest ํ…Œ์ŠคํŠธ์—์„œ window.matchMedia ๋ฌธ์ œ ๋ฐœ์ƒ - darkMode ๋•Œ๋ฌธ์— ๋ฐœ์ƒ src/setupTests.ts ํŒŒ์ผ์— ๊ณต์‹ ๋ฌธ์„œ์— ๋‚˜์˜จ ์ฝ”๋“œ๋ฅผ ๋„ฃ์œผ๋ฉด ํ•ด๊ฒฐ

Object.defineProperty(window, 'matchMedia', {
    writable: true, 
    value: jest.fn().mockImplementation((query) => ({
      matches: false,
      media: query,
      onchange: null,
      addListener: jest.fn(), // deprecated
      removeListener: jest.fn(), // deprecated
      addEventListener: jest.fn(),
      removeEventListener: jest.fn(),
      dispatchEvent: jest.fn(),
    })),
});
  • jest.config.js ํŒŒ์ผ์— '<rootDir>/src/setupTests.ts',๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ

์ฐธ๊ณ  ๋ ˆํผ๋Ÿฐ์Šค

ํƒ€์ž… ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ํŒŒ์ผ ์ž‘์„ฑ

Reset CSS
styled-reset
createGlobalStyle
The 62.5% Font Size Trick
CSS box model
box-sizing
word-break
keep-all-villain
Theming
Create a declarations file
๐Ÿ”— ์‹ค์Šต ๋งํฌ
styled.d.ts
Type Declarations - .d.ts files
Creating .d.ts Files from .js files
Mocking methods which are not implemented in JSDOM
visualstudio - theme color
bootstrap - customize color