React

react ํ”„๋กœ์ ํŠธ ์„ธํŒ…(prettier, stylelint, .vscode, path alias)

presentKey 2024. 8. 6. 19:31

๐Ÿ“Œ ์„ค์น˜ ํ™˜๊ฒฝ

pnpm + vite + react + typescript + vscode

 

 

๐ŸŽจ prettier

prettier๋Š” ๋‚˜ ๋˜๋Š” ํŒ€์›๋“ค์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ์ผ๊ด€๋œ ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.

 

vscode setting์—์„œ ๊ฐœ์ธ ์„ค์ •์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ํŒ€์›๋“ค์˜ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ๋งž์ถ”๋ ค๋ฉด ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํด๋”์—  .prettierrc.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์›ํ•˜๋Š” ์„ค์ •์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

(ํ”„๋กœ์ ํŠธ prettierrc.json์ด vscode ์„ธํŒ…๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’๋‹ค.)

{
  "singleQuote": true,
  "jsxSingleQuote": true,
  "semi": true,
  "printWidth": 80
}

๐Ÿงท prettier ์˜ต์…˜: https://prettier.io/docs/en/options

 

 

๐ŸŽจ stylelint + scss + .vscode(extensions.json, settings.json)

1. ์„ค์น˜ ๋ฐ ์„ธํŒ…

stylelint๋Š” css ์ž‘์„ฑ ๊ทœ์น™์„ ์ •ํ•ด ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์ผ๊ด€๋œ ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.

pnpm add -D stylelint stylelint-config-standard-scss
pnpm add -D stylelint-config-recess-order

- stylelint-config-standard-scss: scss๋ฅผ ์œ„ํ•œ stylelint ํ‘œ์ค€ ๊ตฌ์„ฑ

- stylelint-config-recess-order: css ์†์„ฑ์„ ์ •๋ ฌํ•˜๋Š” ๊ตฌ์„ฑ

 

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํด๋”์— .stylelintrc.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ทœ์น™ ๋“ฑ๋“ฑ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

{
  "extends": [
    "stylelint-config-standard-scss",
    "stylelint-config-recess-order"
  ],
  "ignoreFiles": ["src/index.scss"],
  "rules": {
    "at-rule-no-unknown": null,
    "scss/at-rule-no-unknown": true,
    "selector-class-pattern": "^([a-z][a-z0-9]*)(-[a-z0-9]+)*$",
    "selector-pseudo-class-no-unknown": [
      true,
      {
        "ignorePseudoClasses": ["global"]
      }
    ],
    "keyframes-name-pattern": "^([a-z][a-z0-9]*)(-[a-z0-9]+)*$",
    "max-nesting-depth": 3,
    "no-descending-specificity": null
  }
}

๐Ÿงท stylelint rule: https://stylelint.io/user-guide/rules

 

2. ์‹คํ–‰

package.json ํŒŒ์ผ์— stylelint script๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

"pnpm stylelint" ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๊ทœ์น™์— ์–ด๊ธ‹๋‚˜๋Š” css ์ฝ”๋“œ๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งค๋ฒˆ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๋‹ค.

  "scripts": {
    ...,
    "stylelint": "stylelint '**/*.{css,scss}' --fix"
  },

 

3. extenstion

๋ช…๋ น์–ด ํ•„์š” ์—†์ด ์ฝ”๋“œ ์ž‘์„ฑ ์ค‘์— ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” "stylelint" extenstion์ด ์žˆ๋‹ค.

(scripts - stylelint๋Š” ์ œ๊ฑฐํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.)

 

extenstion ์„ค์น˜ ํ›„, vscode ์„ค์ •(settings.json)์— ๋‹ค์Œ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

{
  "css.validate": false,
  "less.validate": false,
  "scss.validate": false,
  "stylelint.validate": ["css", "scss"],
  "editor.codeActionsOnSave": {
    "source.fixAll.stylelint": "explicit"
  }
}

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ๋ฐ”๋กœ๋ฐ”๋กœ vscode์—์„œ ๋ฌธ์ œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  stylelint ๊ทœ์น™ ์ค‘ autofixed ํ‘œ์‹œ๊ฐ€ ์žˆ๋Š” ๊ทœ์น™์€ ์ €์žฅ ์‹œ, ์ž๋™์œผ๋กœ ์ˆ˜์ •๋œ๋‹ค.

 

- ํ”„๋กœ์ ํŠธ ์„ค์ • ๊ณต์œ 

์œ„์™€ ๊ฐ™์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…์„ ํŒ€์›๋“ค๊ณผ ๊ณต์œ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ํด๋”์— .vscode ํด๋”๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.


ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•  extension์ด ์žˆ๋Š” ๊ฒฝ์šฐ "์ž‘์—… ์˜์—ญ์— ์ถ”๊ฐ€ ๊ถŒ์žฅ ์‚ฌํ•ญ"์„ ํด๋ฆญํ•˜๋ฉด extensions.json ํŒŒ์ผ์— ์ถ”๊ฐ€๋œ๋‹ค. ์ด๋Ÿฌ๋ฉด ํ•ด๋‹น extension์ด ์—†๋Š” ํŒ€์›์€ vscode ์•Œ๋ฆผ์œผ๋กœ ์„ค์น˜ ๊ถŒ๊ณ ๋ฅผ ๋ฐ›๊ฒŒ๋œ๋‹ค.

vscode setting์€ settings.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ํ•„์š”ํ•œ ์˜ต์…˜๋“ค์„ ๋„ฃ์–ด์ฃผ๋ฉด ํ”„๋กœ์ ํŠธ ํŒ€์› ๊ฐ„ ์„ค์ •์ด ๊ณต์œ ๋œ๋‹ค. 

 

 

๐ŸŽจ path alias ์„ค์ •

path alias๋Š” ๊ฒฝ๋กœ์— ๋ณ„์นญ์„ ๋ถ™์ด๋Š” ๊ฒƒ์œผ๋กœ, "../../../compoents/Box" ์™€ ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ "@components/Box" ํ‘œํ˜„์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

 

vite.config.ts ํŒŒ์ผ์„ ์—ด์–ด ๋‹ค์Œ ์†์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import { resolve } from 'path';

// https://vitejs.dev/config/
export default defineConfig({
  ...,
  resolve: {
    alias: [{ find: '@', replacement: resolve(__dirname, 'src') }],
  },
});

 

"path"๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ @types/node๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

pnpm add -D @types/node

 

์ถ”๊ฐ€๋กœ tsconfig.json๋„ ์„ค์ •ํ•ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, ํ˜„์žฌ vite์œผ๋กœ react ์„ค์น˜ ์‹œ tsconfig.app.json, tsconfig.json, tsconfig.node.json ์„ธ ๊ฐœ์˜ ํŒŒ์ผ์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ ์ค‘ tsconfig.app.json์— ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

{
  "compilerOptions": {
    ...,
    "paths": {
      "@/*": ["./src/*"]
    }
  },
  ...,
}