React ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
1. Vite๋ฅผ ํตํ React ์ฑ ์ค์
๊ณผ๊ฑฐ์๋ CRA(Create-React-App)์ ์ฌ์ฉํด React์ฑ์ ์์ฑํ์ผ๋, ํ์ฌ๋ Deprecated ๋์๋ค. React ๊ณต์ ํํ์ด์ง์์ CRA ๋์ CNA(Create-Next-App)์ ์ถ์ฒํ์ง๋ง, ์์ง Next.js ์ค์ต๋จ๊ณ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ Vite๋ก React ์ฑ์ ์ค์ ํ ์์ ์ด๋ค.
1-1. Vite๋ก ํ๋ก์ ํธ๋ฅผ ์ค์ ํ๋ ๋ช ๋ น์ด
npm create vite@latest react-tutorial -- --template react
1-2. Node ๋ฒ์ ๊ด๋ฆฌ ๋ฐ nvm ์ค์น
1. nvm ์ค์น ๋ช ๋ น์ด
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
2. nvm ๋ช ๋ น์ด ์ฌ์ฉ์ ์ํ ํ๊ฒฝ ์ค์
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
- Mac: `~/.zshrc`์ ์ค์ ์ถ๊ฐ ํ `source ~/.zshrc`
- Windows: `~/.bashrc`์ ์ค์ ์ถ๊ฐ ํ `source ~/.bashrc`
3. nvm์ ํตํ Node ์ค์ ๋ฐ npm ์ฌ์ฉ
์์ฃผ ์ฌ์ฉํ๋ ๋ช ๋ น์ด:
- `nvm list`: ์ค์น๋ Node ๋ฒ์ ํ์ธ
- `nvm install 18`: Node 18 ๋ฒ์ ์ค์น
- `nvm install --lts 18`: 18 ๋ฒ์ ์ค ๊ฐ์ฅ ์ต์ ์ LTS ๋ฒ์ node ์ค์น
- `nvm use 18`: Node 18 ๋ฒ์ ์ ํ
- `nvm install`: ํ์ฌ ์์นํ ํ๋ก์ ํธ์ `.nvmrc`ํ์ผ ๋ด ๋ช ์๋์ด์๋ node ๋ฒ์ ์๋ ์ค์น
- `nvm use`: ํ์ฌ ์์นํ ํ๋ก์ ํธ์ `.nvmrc`ํ์ผ ๋ด ๋ช ์๋์ด ์๋ node ๋ฒ์ ์๋ ์ ํ
Deeper Shell Integration: `.nvmrc` ๊ธฐ์ค์ `install`/`use` ์๋ ์ฌ์ฉ ์ํ ์ ์คํฌ๋ฆฝํธ ๋ฑ๋ก
- Windows `~/.bashrc`
cdnvm() {
command cd "$@" || return $?
nvm_path="$(nvm_find_up .nvmrc | command tr -d '\n')"
# If there are no .nvmrc file, use the default nvm version
if [[ ! $nvm_path = *[^[:space:]]* ]]; then
declare default_version
default_version="$(nvm version default)"
# If there is no default version, set it to `node`
# This will use the latest version on your machine
if [ $default_version = 'N/A' ]; then
nvm alias default node
default_version=$(nvm version default)
fi
# If the current version is not the default version, set it to use the default version
if [ "$(nvm current)" != "${default_version}" ]; then
nvm use default
fi
elif [[ -s "${nvm_path}/.nvmrc" && -r "${nvm_path}/.nvmrc" ]]; then
declare nvm_version
nvm_version=$(<"${nvm_path}"/.nvmrc)
declare locally_resolved_nvm_version
# `nvm ls` will check all locally-available versions
# If there are multiple matching versions, take the latest one
# Remove the `->` and `*` characters and spaces
# `locally_resolved_nvm_version` will be `N/A` if no local versions are found
locally_resolved_nvm_version=$(nvm ls --no-colors "${nvm_version}" | command tail -1 | command tr -d '\->*' | command tr -d '[:space:]')
# If it is not already installed, install it
# `nvm install` will implicitly use the newly-installed version
if [ "${locally_resolved_nvm_version}" = 'N/A' ]; then
nvm install "${nvm_version}";
elif [ "$(nvm current)" != "${locally_resolved_nvm_version}" ]; then
nvm use "${nvm_version}";
fi
fi
}
alias cd='cdnvm'
cdnvm "$PWD" || exit
- Mac `~/.zshrc`
# place this after nvm initialization!
autoload -U add-zsh-hook
load-nvmrc() {
local nvmrc_path
nvmrc_path="$(nvm_find_nvmrc)"
if [ -n "$nvmrc_path" ]; then
local nvmrc_node_version
nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
if [ "$nvmrc_node_version" = "N/A" ]; then
nvm install
elif [ "$nvmrc_node_version" != "$(nvm version)" ]; then
nvm use
fi
elif [ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ] && [ "$(nvm version)" != "$(nvm version default)" ]; then
echo "Reverting to nvm default version"
nvm use default
fi
}
add-zsh-hook chpwd load-nvmrc
load-nvmrc
Vite-React ํ๋ก์ ํธ ๋ด ํ์ผ ์ค๋ช : Vite ํตํ React ์ด๊ธฐ ์ฑ ์์ ๋ฐ ESLint ํ์ธ
์คํฌ๋ฆฐ์ท์์ ์ญ์์ผ๋ก ํ์ผ ์ค๋ช
์ฒ์ Vite-React ํ๋ก์ ํธ๋ฅผ ์์ํ๋ฉด ์กด์ฌํ๋ ์ค์ ํ์ผ๋ค
- `vite.config.js`: ๊ฐ๋ฐ์ฉ ๋ฐํ์ ์ค์ + ์ด์์ฉ ๋ฒ๋ค๋ง ์ค์
- `package.json`: ๊ฐ๋ฐ์ฉ + ์ด์์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ + ์คํฌ๋ฆฝํธ
- Semantic Version: ๋ฉ์ด์ .๋ง์ด๋.ํจ์น + ^ ํน์ ~ ๋ฒ์
- `package-lock.json`: ๋ํ๋์ ํธ๋ฆฌ(๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ์์)
- `index.html`: React์์ ๋ ๋ํ๊ธฐ ์ํ ์์ HTML
- `root`: React ๋ ๋๋ง ๋๋ ๊ธฐ์ค HTML(ํฌ๋กฌ์ผ๋ก ๋ณด๊ธฐ)
- `main.js` / `.jsx`: Reac ๋ ๋๋งํ๋ JS
- `.nvmrc`: nvm์์ ์๋ ์ฌ์ฉ/์ค์นํ๊ธฐ ์ํ node ๋ฒ์ ๋ช ์
- `.npmrc`: ํ๋ก์ ํธ์์ npm ์ ์ฌ์ฉํด์ผํ๋ node ๋ฒ์ ๊ฐ์
- `.gitignore: Git ์ฌ์ฉ ์ ๊ด๋ฆฌํ์ง ์์ ํ์ผ๋ค์ ์์ธ ๊ท์น
- `eslintrc.cjs`: ์ปดํ์ผ ์ค์ = ๋ฌธ๋ฒ ์ค๋ฅ ๊ท์น
์๋ ์งํํ Formatter & Linter & IntelliSense ์ค์ ํ์ผ๋ค
- `jsconfig.json`: VSCode ๋ด IntelliSense ์ธ์ ์ค์
- `.pretterrc`: Formatter ์ค ํ๋์ธ Prettier ์ค์
2. ESLint ์ค์ (Linter)
ESLint: ๋ฌธ๋ฒ ์ค๋ฅ๋ฅผ ์ง์ ํด์ฃผ๋ Linter ์ ์ฉ (Vite๋ฅผ ํตํด React ์์ ์ ESLint๋ ๊ธฐ๋ณธ์ผ๋ก ์ค์น ๋์ด์๋ค.)
- ์ด์ : JS๋ ์ปดํ์ผ ๊ณผ์ ์ด ์๋ ์ธํฐํ๋ฆฌํฐ ์ธ์ด์ด๊ธฐ์ ๋ฐํ์ ์๋ฌ๊ฐ ์์ฃผ ๋ฐ์ํด ์ฌ์ ์๋ฌ ํ์ธ์ด ํ์
- ๋น์ฅ์ ๊ฐ๋ฐ ์๋๊ฐ ๋๋ ค์ง๋ ๊ฒ ์ฒ๋ผ ๋๊ปด์ง๊ฒ ์ง๋ง, ๋ฌธ๋ฒ์ ์๋ชป์จ์ ์๊ฐ์ ๋ ๋ฆฌ๋ ์ํฉ์ด ํ๋คํ๋ค.
- ์ฝ๋ฉ ์คํ์ผ์ ๊ด๋ จ๋ ํน์ Lint ์ค๋ฅ๋ฅผ ์ ๊ฒฝ์ฐ๊ธฐ ์ซ๋ค๋ฉด ์์ธ ๊ท์น ๋ฑ๋ก์ด ๊ฐ๋ฅํ๋ค.
ESLint 8 ๋ฒ์ ์ค์ ํ์ผ ์ธ `.eslintrc.cjs` ์ด๊ธฐ ์ค์ ์ฝ๋
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
"eslint:recommended",
"plugin:react/recommended",
"plugin:react/jsx-runtime",
"plugin:react-hooks/recommended",
],
ignorePatterns: ["dist", ".eslintrc.cjs"],
parserOptions: { ecmaVersion: "latest", sourceType: "module" },
settings: { react: { version: "18.3" } },
plugins: ["react-refresh"],
rules: {
"react/jsx-no-target-blank": "off",
"react-refresh/only-export-components": [
"warn",
{ allowConstantExport: true },
],
},
};
- plugins: ์ถ๊ฐํ ์์๋ Rules ๋ฆฌ์คํธ๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ํ๋ ๊ฒ๋ค์ ์ ํํ์ฌ ์ ์ฉ ๊ฐ๋ฅ
- extends: ์ค์ ๋ก Rules ๋ค์ ์ถ๊ฐํด์ฃผ๊ธฐ ๋๋ฌธ์, ์ํ๋ ๊ฒ๋ค์ ๊ณ ๋ฅผ ์ ์๊ณ ์ ํ์ง ์์ด ๊ทธ๋๋ก ์ ์ฉ
- plugins์์ ์ ๊ณตํ๋ Rules ์งํฉ์ ๊ทธ๋๋ก ๋ฃ์ ์ ์๋ค.
- rules: plugins์์ ์ ๊ณตํ๋ Rules ์ค ์ํ๋ ๊ฒ๋ค์ ์ ํํ์ฌ ์ ์ฉ ๊ฐ๋ฅ
- ์ผ๋ฐ์ ์ธ ๊ท์น์ extends๋ฅผ ํ์ฉํ๊ณ , ์์ธ ๊ท์น๋ง rules ์ด์ฉ
โ ๏ธVSCode ํ์ฅ ํ๋ก๊ทธ๋จ ์ค ESLint๋ฅผ ๊ผญ ์ค์นํด์ผํจ
3. Prettier ์ค์ (Formatter)
Prettier: ์ฝ๋ฉ ์ ์ผ๊ด๋ ํฌ๋งท์ ๊ฐ๊ฒํด์ฃผ๋ Formatter ์ ์ฉ
- ์ด์ : ํ ํ๋ก์ ํธ ์งํ ์ ๊ฐ์ ๋ก์ปฌ์์ ๊ณต๋ ์ฝ๋๋ฅผ ๊ฐ๋ฐํ ํ ๋ฐ ๊ฐ์ ๋ก์ปฌ์ ํฌ๋งทํ ์ ์ํ ์ค์ผ ๋ฐฉ์ง
- ESLint์ Prettier ๊ฐ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ค์ ์ด ํ์.
Prettier ์ค์น ๋ช ๋ น์ด
npm install -D -E prettier
- `--save-dev` or `-D`: `devDependencies` ๋ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ ๋ฐ ๋ฐฐํฌ๊ฐ ์๋ ๊ฐ๋ฐ์์๋ง ์ฌ์ฉ
- `--save-exact` or `-E`: ์ ํํ SemVer ๋ฒ์ ์ฌ์ฉ ์ (`^5.1.3`์ด ์๋ `5.1.3`)
npm install -D eslint-config-prettier
- `eslint-config-prettier`: ESLint์ Prettier๊ฐ ์ถฉ๋ํ์ง ์๊ฒํ๋ ESLint ํ๋ฌ๊ทธ์ธ
- `prettier-plugin-tailwindcss`: ์ถํ Tailwind ์ฌ์ฉ ์ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ช ์์๋ก ๋์ดํ๋ ํ๋ฌ๊ทธ์ธ
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:react/jsx-runtime',
'plugin:react-hooks/recommended',
// This disables the formatting rules in ESLint that Prettier is going to be responsible for handling.
// Make sure it's always the last config, so it gets the chance to override other configs.
โ'eslint-config-prettier',โ
],
ignorePatterns: ['dist', '.eslintrc.cjs'],
parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
settings: { react: { version: '18.3' } },
plugins: ['react-refresh'],
rules: {
'react/jsx-no-target-blank': 'off',
'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
},
}
- 8 ๋ฒ์ ์ค์ ํ์ผ `.eslintrc.cjs` ์์์์ ์์ ์ค์นํ `eslint-config-prettier` ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ
{
"name": "react-tutorial",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"lint": "eslint .",
โ"format": "prettier --write ./src",โ
"preview": "vite preview"
},
...
}
- `package.json` ๋ด `"format": "prettier --write ./src",` ์ถ๊ฐ ํ `npm run format` ์คํ
Prettier ์ค์ ํ์ผ ์ธ `.prettierrc` ์ด๊ธฐ ์ฝ๋
{
"printWidth": 100,
"tabWidth": 2,
"trailingComma": "all",
"singleQuote": true,
"jsxSingleQuote": true,
"semi": false
}
- Prettier ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ณ ์ค์ ํ๋ ๊ฑด ํฐ ์๋ฏธ๊ฐ ์๋ค. ์๋์ฒ๋ผ VSCode์ ์ฐ๋ํ์ฌ์ผ ์๋ฏธ๋ฅผ ๊ฐ๋๋ค.
โ ๏ธVSCode ํ์ฅ ํ๋ก๊ทธ๋จ ์ค Prettier ์ค์นํ ํ, ๊ธฐ๋ณธ ํฌ๋งทํฐ ๋ฐ ์ ์ฅ ์ ์๋ ํฌ๋งทํ VSCode ์ค์ ํ์
3. IntelliSense ์ค์ (JSConfig / TSConfig)
jsconfig.json: ๊ฐ๋ฐ ์ธ์ด ์๋ํฐ(Sublime, VSCode)์์ ์ฌ์ฉํ๋ LSP๋ก intellisense ์ค์ ์ ํด๋น
- ๊ธฐ์กด ํ์ ์คํฌ๋ฆฝํธ ์ค์ ํ์ผ์ธ `tsconfig.json`์ ์์๋ฐ์ ์ค์ ํ์ผ `jsconfig.json`
{
"compilerOptions": {
"jsx": "react-jsx",
"lib": ["esnext", "dom"],
"checkJs": true,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
},
"types": ["vite/client"]
},
"include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"],
"exclude": ["node_modules", "**/node_modules", "dist"]
}
- compilerOptions: ์๋๋ TS ์ปดํ์ผ ์ต์
์ด์ง๋ง JS์์ ์ปดํ์ผ ๋์ง ์๊ณ ์ค์ ๊ทธ๋๋ก ์ฐ๋ ค๊ณ ์ด๋ฆ๋ง ์ฐจ์ฉ.
- jsx: ๋ณธ ์ค์ ์ ํ์ง ์์ผ๋ฉด React ํ์ผ ๋ด ๋ค์ ์๋ฌ ๋ฐ์
- React๋ UMD ์ ์ญ์ ์ฐธ์กฐํ์ง๋ง ํ์ฌ ํ์ผ์ ๋ชจ๋์
๋๋ค.(ts2686)
- React๊ฐ ESM ๋ชจ๋์ ์ฌ์ฉํ๋๋ฐ์๋ ๋ถ๊ตฌํ๊ณ , UMD ๋ชจ๋๋ก ์ฌ์ฉํ๋ ค๊ณ ํด์ ๋ฐ์ํ๋ ์๋ฌ
- ๊ณผ๊ฑฐ์๋ JSX ํ์ผ์ `import React from 'react';`๋ฅผ ๋ช ์์ ์ผ๋ก ์ถ๊ฐํด์ผํ์ง๋ง, ์ต๊ทผ์๋ JSX ์ปดํ์ผ ์ ์๋์ผ๋ก ์ฒ๋ฆฌ๋๋ฏ๋ก ์ด ์ค์ ๋ง์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ
- React๋ UMD ์ ์ญ์ ์ฐธ์กฐํ์ง๋ง ํ์ฌ ํ์ผ์ ๋ชจ๋์
๋๋ค.(ts2686)
- lib: ES(ECMA Script) ๋ฒ์ ๋ณ๋ก ๋ฌธ๋ฒ์ ์ถ๊ฐํ ๋ ์ฌ์ฉํ๋ ์ค์ . ์๋ฅผ ๋ค์ด, ํน์ ๋ฒ์ ์ ES ๋ฌธ๋ฒ์ด ํ์ํ ๊ฒฝ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฒ๋ผ ์ถ๊ฐ ๊ฐ๋ฅ
- ์์:
- ES2017 ๋ฌธ๋ฒ ์ฌ์ฉ : `"lib": ["es2017.object"]`
- ES2015 (ES6) ๋ฌธ๋ฒ ์ฌ์ฉ: `"lib" : ["es2015"]`
- ์ต์ ES ๋ฌธ๋ฒ ์ฌ์ฉ: `"lib" : ["esnext"]
- DOM ๊ด๋ จ API ์ฌ์ฉ: `"lib" : ["dom"]` (React ๊ฐ๋ฐ ์ ํ์)
- ์์:
- checkJs:
- ์ด ์ต์ ์ ํตํด ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ํ์ ์คํฌ๋ฆฝํธ์ฒ๋ผ ์๋ฌ๋ฅผ ์ฒดํฌํ๊ณ ์์ ํ ์ ์๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ๋ฐ์ํ ์ ์๋ ์๋ฌ๋ฅผ ๋ฏธ๋ฆฌ ํ์ธํ๊ณ ์ฒ๋ฆฌํ ์ ์๋ ์ ์ฉํ ๋๊ตฌ.
- baseUrl:
- ํ๋ก์ ํธ ๋ฃจํธ๋ฅผ ์ง์ . ์ผ๋ฐ์ ์ผ๋ก `.`์ผ๋ก ์ค์ ํ๋ฉฐ, ์ด ์ค์ ๋๋ถ์ ๊ฒฝ๋ก ์ค์ ์ด ๋ ์ ์ฐํด์ง๋ค.
- paths:
- `baseUrl`์ ๊ธฐ์ค์ผ๋ก ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ์ ์๋ค. ์ฃผ๋ก ์ ๋ ๊ฒฝ๋ก๋ฅผ ํตํด ๋ชจ๋์ ์ฝ๊ฒ importํ๊ธฐ ์ํด ์ฌ์ฉ
- types:
- Vite๋ Node.js API๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฏ๋ก, ํด๋ผ์ด์ธํธ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ์ ์์คํ ์ ์ถ๊ฐํด์ผํ๋ค.
- ์๋ฅผ ๋ค์ด, Vite์ ํด๋ผ์ด์ธํธ ํ๊ฒฝ ๋ณ์ `import.meta.env`๋ `.svg`๊ฐ์ ์์ ์ ๋ค๋ฃฐ ๋ ํ์ํ ์ค์ ์ด๋ค.
- ์์: `"types": ["vite/client"]`
- include:
- ํ๋ก์ ํธ์์ ๋ค๋ฃฐ ํ์ผ๋ค์ ์ง์ ํ๋ ์ต์ . ์๋ฅผ ๋ค์ด `.jsx`, `.js` ํ์ฅ์๋ฅผ ๊ฐ์ง ํ์ผ๋ค์ด๋ ํ์ ์ ์ธ ํ์ผ์ ํฌํจํ ์ ์๋ค.
- exclude:
- ์ฑ๋ฅ์ ์ํด ์ธํ ๋ฆฌ์ผ์ค๊ฐ ๋ถํ์ํ ๋๋ ํฐ๋ฆฌ๋ ํ์ผ์ ์ ์ธํ ๋ ์ฌ์ฉ๋จ. ์๋ฅผ ๋ค์ด `node_modules`๋ `dist` ๋๋ ํฐ๋ฆฌ๋ฅผ ์ ์ธํ ์ ์๋ค.
- jsx: ๋ณธ ์ค์ ์ ํ์ง ์์ผ๋ฉด React ํ์ผ ๋ด ๋ค์ ์๋ฌ ๋ฐ์
์ด๋ฌํ ์ค์ ๋ค์ ํ๋ก์ ํธ์์ ํจ์จ์ ์ผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ค๋ฃจ๊ณ , ์ธํ ๋ฆฌ์ผ์ค์ ์ฝ๋ ์์ฑ ๊ธฐ๋ฅ์ ์ต์ ํํ๋ ๋ฐ ์ ์ฉํ๋ค.
โ ๏ธ์๋ VSCode ํ์ฅ ํ๋ก๊ทธ๋จ ์ค Auto Import ์ค์น๋ฅผ ํด์ผ ์ ๋๊ฒฝ๋ก import ๊ฐ๋ฅ
โ ๏ธVSCode์๋ ์ค์ ํ์: ์ฌ์ฉ์ ์ค์ ์ด๊ธฐ ํ `typescript import module specifier` ๊ฒ์
โ ๏ธVite์๋ ์ค์ ํ์: ์ ๋ ๊ฒฝ๋ก ์ฌ์ฉ์ ์ํด `jsconfig.json` ๋ฟ๋ง ์๋๋ผ `vite.config.js` ์์ ํ์
`jsconfig.json`์ VSCode๋ฅผ ์ํ ์ปดํ์ผ ์ค์ ์ด๊ธฐ์ `vite.config.js` ๋ด ๋ฐํ์ ์ค์ ํ์
์ถ๊ฐ์ ์ผ๋ก ESLint์๊ฒ๋ ์๋ ค์ค์ผํ๋ค.
1. vite-tsconfig-paths ์ค์น
npm install -D vite-tsconfig-paths
2. vite.config.js ์์ :
- `vite-tsconfig-paths` ํ๋ฌ๊ทธ์ธ์ ์ถ๊ฐํ์ฌ Vite์์ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ธ์ํ๋๋ก ์ค์
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
โimport tsconfigPaths from 'vite-tsconfig-paths';โ
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react(), โtsconfigPaths()โ],
});
- ์ด ์ค์ ์ ํตํด, `jsconfig.json`์ ์ ์๋ ๊ฒฝ๋ก ์ค์ ์ Vite์์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. ์ด๋ก ์ธํด, ๋งค๋ฒ ๋ณต์กํ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ ํ์ ์์ด ์ ๋๊ฒฝ๋ก๋ฅผ ์์ฝ๊ฒ ์ฌ์ฉ๊ฐ๋ฅ.
3. ์ถ๊ฐ์ ์ผ๋ก ESLint ์ค์ :
- ์ ๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ๋ ESLint๊ฐ ๊ฒฝ๋ก๋ฅผ ์ธ์ํ ์ ์๋๋ก ESLint ์ค์ ๋ ํ์ํ๋ค.
- `jsconfig.json` ํ์ผ์์ ๊ฒฝ๋ก ์ค์
{
"compilerOptions": {
"jsx": "react-jsx",
"checkJs": true,
"baseUrl": ".",
"paths": {
โ "@/*": ["src/*"] โ
},
"types": ["vite/client"]
},
"include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.jsx", "src/**/*.ts", "src/**/*.tsx"],
"exclude": ["node_modules", "**/node_modules", "dist"]
}
โน๏ธ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
'๐ปDEV-STUDY > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] React์ State, Props, Ref์ ์ญํ (1) | 2024.09.18 |
---|---|
[React] JSX ๋ฌธ๋ฒ + ๋จ๋ฐฉํฅ ๋ฐ์ธ๋ฉ + VDOM (1) | 2024.09.17 |
[React] ๋ ๋๋ง๋ฐฉ์(CSR)๊ณผ ์น ์ดํ๋ฆฌ์ผ์ด์ ๊ตฌ์กฐ(SPA) (1) | 2024.09.17 |
[React] React์ ๋ฑ์ฅ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ vs ํ๋ ์์ํฌ (1) | 2024.09.17 |