[๐Ÿ”ฅ์†ก์ด์™€ ๐Ÿฅ•ํ™] ํ”„๋ก ํŠธ ์ดˆ๊ธฐ์„ธํŒ…

XCC629ยท2022๋…„ 7์›” 20์ผ
0
post-thumbnail

์ดˆ๊ธฐ์„ธํŒ… ๊ธฐ๋กํ•˜๊ณ  ๊ณต์œ ํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฑฐ ๊ฐ™์•„์„œ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ฝ๊ณ  ๊ถ๊ธˆํ•˜์‹  ์  ์žˆ์œผ์‹œ๋ฉด ์–ผ๋งˆ๋“ ์ง€ ์งˆ๋ฌธ์ฃผ์‹ญ์‡ผ!


๐Ÿงš create-next-app

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ…œํ”Œ๋ฆฟ์„ ์ง€์›ํ•ด์ฃผ๊ธธ๋ž˜ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์„ค์น˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

npx create-next-app@latest --ts

typescript config ํŒŒ์ผ๋„ ์•Œ์•„์„œ ํ•ด์ฃผ๊ธธ๋ž˜ ํ–ˆ์Šต๋‹ˆ๋‹ค.

touch tsconfig.json

cra์™€ ๋‹ค๋ฅด๊ฒŒ ์•„๋ž˜์˜ ์Šคํฌ๋ฆฝํŠธ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ช…๋ น์–ด ์น˜๋ฉด eslint๋‚˜ ๋“ฑ๋“ฑ๋“ฑ... ๋ญ”๊ฐ€ ์ž๋™์œผ๋กœ ํ•ด์ฃผ๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.

npm run dev


๐Ÿงš eslint ์„ค์ •

์•Œ์•„์„œ .eslintrc.json๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ๊ฐ•ํ•œ ๊ทœ์น™์„ ์ ์šฉํ•ด์ฃผ๋Š” ๊ฑธ๋กœ ์ถ”์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

"extends":"next/core-web-vitals"

๊ทธ๋Ÿฐ๋ฐ ์•ฝ๊ฐ„ ๋ถ€์‹คํ•˜๋‹ค๊ณ  ๋Š๊ปด์ ธ์„œ npx eslint --init์œผ๋กœ airbnb ๊ทœ์น™๊ณผ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์—ฌ ๋ณด๊ฐ•ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๊ทœ์น™์ด ๋„ˆ๋ฌด ์—„๊ฒฉํ•ด์„œ ๋ช‡๊ฐ€์ง€๋Š” ๋ฃฐ๋กœ ์ œ๊ฑฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.

"rules": {
    "import/prefer-default-export": "off",
    "react/jsx-filename-extension": [
      1,
      { "extensions": [".js", ".jsx", ".ts", ".tsx"] }
    ],
    "react/jsx-props-no-spreading": "off",
    "import/extensions": 0,
    "implicit-arrow-linebreak": 0,
    "import/no-unresolved": 0,
    "react/function-component-definition": "off"
  }

๐Ÿงš prettier ์„ค์ •

์›๋ž˜ ํ”„๋กœ์ ํŠธ ๋•Œ ํ•˜๋˜ ๊ทœ์น™ ๊ทธ๋Œ€๋กœ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. eslint๋ž‘ ์ถฉ๋Œ ์•ˆ๋‚ด๊ฒŒ ํ•ด์ฃผ๋Š” ํŒจํ‚ค์ง€ ๋ช‡๊ฐœ๋ฅผ ์ถ”๊ฐ€ ์„ค์น˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค!

๐Ÿงš stylelint ์„ค์ •

์‚ฌ์‹ค ์ €ํฌ๋Š” styled-components๋ฅผ ์“ฐ๊ธฐ์— ํฐ ์“ธ๋ชจ๋Š” ์—†์ง€๋งŒ readmeํŒŒ์ผ ํฌ๋ฉง์„ ๊น”๋”ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š”๊ฒŒ ๋งˆ์Œ์— ๋“ค์–ด์„œ ์„ค์น˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

{
  "extends": ["stylelint-config-standard", "stylelint-config-prettier"]
}


๐Ÿ”ง ๊ตฌ์กฐ ์„ค๊ณ„

์„ธํŒ…์„ ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด์„œ ์ „์ ์œผ๋กœ Next.js + Typescript + Styled-components ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•˜๊ธฐ ์ด ํฌ์ŠคํŒ…์„ ๋”ฐ๋ผํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  1. components ์•ˆ์—๋Š” ๋ฏธ๋ฆฌ ์•„ํ† ๋ฏน ๋””์ž์ธ ํŒจํ„ด ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  2. hook ์ปค์Šคํ…€ ํ›… ์“ฐ๋Š” ๊ณณ ์ž…๋‹ˆ๋‹ค.

  3. pages ์•ˆ์˜ api๋Š” ๊ธฐ๋ณธ ์„ค์ •์— ์žˆ๋˜ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ํŠน์ดํ•˜๊ฒŒ ์—ฌ๊ธฐ ์•ˆ์—์„œ api๋ฅผ ๋ชจ์•„๋‘๋Š” ๊ฒƒ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.(์ž์„ธํžˆ ๋ชจ๋ฆ„..)
    _app.tsx์™€ _document.tsx๋Š” styled-Components๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•„์ˆ˜์ ์ธ ์„ค์ •์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

    • _app.tsx๋Š” ์ปค์Šคํ…€ app์œผ๋กœ ์›๋ž˜ cra์˜ app.tsx ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค...
    • _document.tsx๋Š” styled-components๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ssr์ธ nextjs์—์„œ๋Š” ์ดˆ๊ธฐ ํ™”๋ฉด์— ์Šคํƒ€์ผ์ด ์•ˆ๋จนํ˜€์„œ ๋จนํžˆ๋„๋ก ์„ธํŒ…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค........

  4. public์€ ์›๋ž˜์˜ ๊ทธ ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค.

  5. shared๋Š” interpace๋‚˜ ์œ ํ‹ธ ๊ฐ™์€ ๊ฑธ ๋ชจ์•„๋‘๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

  6. styles๋Š” ์Šคํƒ€์ผ ๊ด€๋ จ๋œ ๊ฒƒ๋“ค์„ ๋ชจ์•„๋’€์Šต๋‹ˆ๋‹ค. ๊ธ€๋กœ๋ฒŒ ์Šคํƒ€์ผ๊ณผ ํ…Œ๋งˆ ์ ์šฉ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค.

      color: {
       veryPeri: '#6667AB',
       veryPeri500: 'rgba(102, 103, 171, 0.5)',
       veryPeri300: 'rgba(102, 103, 171, 0.3)',
       lightViolet: '#AAB6FE',
       black: '#000000',
       black600: 'rgba(0, 0, 0, 0.6)',
       gray: '#989898',
       gray500: 'rgba(152, 152, 152, 0.5)',
       gray300: '#DCDCDC',
       gray100: '#F4F4F4',
       gray50: 'rgba(244, 244, 244, 0.5)',
       red: '#FF8A80',
     },
     boxShadow: {
       onButton: {
         default: '0px 3px 2px rgba(21, 16, 83, 0.6',
         push: 'inset 0px 3px 2px rgba(21, 16, 83, 0.6)',
       },
       offButton: {
         default: '0px 3px 2px rgba(186, 181, 201, 0.98)',
         push: 'inset 0px 3px 2px rgba(186, 181, 201, 0.98)',
       },
       modal: '0px 2px 5px 2px rgba(0, 0, 0, 0.25)',
     },

    ํฌ๊ฒŒ ์ปฌ๋Ÿฌ/๋ฐ•์Šค ์‰๋„์šฐ๋กœ ๋‚˜๋ˆด์Šต๋‹ˆ๋‹ค. onButton์€ ํ™œ์„ฑํ™”๋ฒ„ํŠผ, offButton์€ ๋น„ํ™œ์„ฑํ™”๋ฒ„ํŠผ์„ ๋งํ•˜๊ณ  ๋ชจ๋‹ฌ์€ ๋ชจ๋‹ฌ์ž…๋‹ˆ๋‹ค.



๐Ÿ’… styled-components

์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡๊ฐ€์ง€ ์„ค์ •์„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
1. _app.tsx, _document.tsx
2. .babelrc

with-styled-components-babel ์ด ๋ ˆํฌ๋ฅผ ์ฐธ์กฐํ•˜์˜€์Šต๋‹ˆ๋‹ค.


๊ทธ์™ธ ํŒŒ์ผ

next-env.d.ts
ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํƒ€์ž…์„ค์ •ํ•˜์—ฌ์„œ ์ž๋™์™„์„ฑ๋˜๊ฒŒ ํ•˜๋Š” ํŒŒ์ผ์ธ๋ฐ, ์‚ฌ์šฉํ• ๋•Œ ์‚ฌ์šฉ๋ฒ•์„ ์ฝ์–ด๋ณด๊ณ  ์จ์•ผํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

next.config.js
config ์„ค์ • ์ถ”๊ฐ€ ํ•˜๋Š” ๊ณณ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹œํ‚ค๊ธฐ๋Š” ๋Œ€๋กœ ์ถ”๊ฐ€ํ•ด์„œ ์„ค์ •์€ ์ฝ์–ด๋ด์•ผํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ svg์ชฝ ์ถ”๊ฐ€๋˜์–ด์žˆ๋Š” ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค?

profile
ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

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