Code Convention - Hi-Fi-Club/FE GitHub Wiki

1. ๐Ÿ‡ Import ๊ทœ์น™

  • ์™ธ๋ถ€ ๋ชจ๋“ˆ๊ณผ ๋‚ด๋ถ€ ๋ชจ๋“ˆ์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉ.

  • ์™ธ๋ถ€๋ชจ๋“ˆ์€ ๊ฐ .tsx ํŒŒ์ผ ๋งจ์œ„์—, ๊ทธ ๋ฐ‘์—๋Š” ๋‚ด๋ถ€๋ชจ๋“ˆ

  • ๋‚ด๋ถ€๋ชจ๋“ˆ์˜ ๊ฒฝ์šฐ ์ปดํฌ๋„ŒํŠธ > ๋ฆฌ์ฝ”์ผ atom > ์œ ํ‹ธ ์ˆœ์œผ๋กœ ์ˆœ์„œ๋ฅผ ๊ตฌ๋ถ„ํ•œ๋‹ค.

  • ์˜ˆ์‹œ

    import { useState, useEffect } from "react";
    import styled from 'styled-components';
    import { useSetRecoilState, useRecoilValue } from "recoil";
      โ€‹
    import MilestonesHeader from "./MilestonesHeader";
    import MilestoneCard from "./MilestoneCard";
    import MilestoneInput from "./MilestoneInput";
    โ€‹
    import {
      milestoneAddButtonFlagState,
      milestoneCountState,
      labelAddButtonFlagState,
      navigatorAddButtonFlagState,
    } from "RecoilStore/Atoms";
    โ€‹
    โ€‹
    import API from "util/API";
    import fetchData from "util/fetchData";

    ๊ณต๋ฐฑ์€ ๋ณด๊ธฐ ํŽธํ•˜์‹œ๋ผ๊ณ  ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค! ์‹ค์ œ ๊ฐœ๋ฐœํ•  ๋• ๊ณต๋ฐฑ์—†์ด!

2. ๐Ÿ‘ธ Prettier

  • ์ฝ”๋“œ ํ•œ ์ค„ ์ตœ๋Œ€ ๊ธ€์ž ์ˆ˜ (printWidth): 120
  • ์—ฌ๋ฐฑ (tabWidth): 2์นธ

3. โœ… ESLint

  • ๊ธฐ๋ณธ์ ์œผ๋กœ eslint-config-airbnb-typescript ๋ฅผ ๋”ฐ๋ฅธ๋‹ค
  • ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ๋ฃฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋…ผ์˜ ํ›„ ๋ฐ˜์˜ ๊ฐ€๋Šฅ.
  • ํ”„๋กœ์ ํŠธ ๋ฃจํŠธํด๋”์˜ .eslitrc ์ฐธ๊ณ 

4. ๐Ÿณ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์„ค์ • (tsconfig)

{
  "extends": "./tsconfig.paths.json",
  "compilerOptions": {
    "target": "es5",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noFallthroughCasesInSwitch": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "jsx": "react-jsx"
  },
  "include": ["src", "tsconfig.paths.json"]
}

5. ๐Ÿฃ ๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋ช…๋ช… ๊ทœ์น™

  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํŒŒ์ผ์€ *.tsx ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํŒŒ์ผ์ด ์•„๋‹Œ ๊ฒฝ์šฐ *.ts ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • *.tsx - ์ปดํฌ๋„ŒํŠธ, ํŒŒ์ผ, ํด๋”๋ช… โ†’ PascalCase
  • *.ts - ํŒŒ์ผ, ํด๋”๋ช… โ†’ cammelCase
  • ์ƒ์ˆ˜ โ†’ SNAKE_CASE
    • const MAX_COUNT = 100
  • ํ•จ์ˆ˜ ๋ฐ ๋ณ€์ˆ˜ โ†’ cammelCase
    • const foo = () => {}
    • let bar = 3
  • ์ฐฝ์˜์ ์ธ ๋‹จ์–ด ์“ฐ์ง€ ์•Š๊ธฐ (์ œ์ผ ๋– ์˜ค๋ฅด๊ธฐ ์‰ฝ๊ณ  ๊ธฐ๋ณธ์ ์ธ ๋‹จ์–ด)
  • ๋ณ€์ˆ˜๋Š” ๋ช…์‚ฌํ˜•์œผ๋กœ ์ž‘์„ฑ
  • ํ•จ์ˆ˜๋Š” ๋™์‚ฌํ˜•์œผ๋กœ ์ž‘์„ฑ (doSomething, getValue)
  • ์˜ˆ์‹œ
    • Header/index.tsx
    • components/Slider.tsx
    • util/functions/getMoney.ts
    • util/hooks/useFetch.ts

+. ๐ŸŽธ ๊ธฐํƒ€ ์ฝ”๋”ฉ ๊ทœ์น™

  • htmlํƒœ๊ทธ ์„ ์–ธ ์‹œ ๊ฐ€๋Šฅํ•œ ์‹œ๋ฉ˜ํ‹ฑํ•œ ํƒœ๊ทธ ์‚ฌ์šฉ
    • ํ—ค๋”์—๋Š” <header> ๋ฆฌ์ŠคํŠธ๋Š” <li>
      (๊ฐ•์ œ์•„๋‹˜!)
  • ์ฝ”๋“œ PR์€ ์ง€์ •๋œ ๋ฆฌ๋ทฐ์–ด๊ฐ€ approve ํ•œ ํ›„์— merge ํ•  ์ˆ˜ ์žˆ๋‹ค!
    • PR ์—๋Š” ๋‹ค ํ•„์š”์—†๊ณ  ๋ฆฌ๋ทฐ์–ด๋งŒ ์ง€์ •!
    • ๋ฆฌ๋ทฐ์–ด๊ฐ€ ์ง€์ ํ•œ ๋ถ€๋ถ„ ๊ณ ์นœ ํ›„์— comment๋กœ ์•Œ๋ฆด ๊ฒƒ
  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋Š” ํ•„์ˆ˜! ๊ผญ ํ™•์ธํ•˜๊ธฐ!
    • ํŒ€์›์˜ ๋ฆฌ๋ทฐ์—” ํ• ๋ง์ด ์—†์œผ๋ฉด ๋Œ€๋Œ“๊ธ€์€ ์•ˆ๋‹ฌ๋”๋ผ๋„ ์ด๋ชจํ‹ฐ์ฝ˜ ๋ฐ˜์‘ ์ •๋„๋Š” ํ•ด์ฃผ์ž~๐Ÿ™Œ
  • html ์˜ id ํ˜น์€ className์€ snake__case ๋กœ ํ•œ๋‹ค. (ex: label__description)
  • JSX์˜ ์ตœ์ƒ๋‹จ ํƒœ๊ทธ๋ฅผ StyledComponent ๋กœ ํ‘œํ˜„ํ•˜๊ณ  __Layout์œผ๋กœ ๋งž์ถ˜๋‹ค. (ex: <TitleLayout>)
  • ํ•จ์ˆ˜ํ‘œํ˜„์‹์œผ๋กœ ์จ์„œ ์ฝœ๋ฐฑ์œผ๋กœ ์จ๋จน์ž!
โš ๏ธ **GitHub.com Fallback** โš ๏ธ