react ํ๋ก์ ํธ ์ธํ (prettier, stylelint, .vscode, path alias)
๐ ์ค์น ํ๊ฒฝ
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/*"]
}
},
...,
}