๐Ÿ’ปDEV-STUDY/React

[React] Vite๋กœ React ์ดˆ๊ธฐ ์•ฑ ์„ค์ •

1000_sang 2024. 9. 18. 17:44
728x90
๋ฐ˜์‘ํ˜•

 

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 ์„ค์ •์—์„œ Editor: Format On Save ์ฒด๊ทธํ•ด์•ผ ์ €์žฅ ์‹œ ์ ์šฉ๋œ๋‹ค.
VSCode ๋‚ด Prettir ์„ค์ •์—์„œ Editor: Default Formatter ์„ค์ • ํ•„์š”

โš ๏ธ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 ์ปดํŒŒ์ผ ์‹œ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋ฏ€๋กœ ์ด ์„ค์ •๋งŒ์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ
    • 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` ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ œ์™ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์„ค์ •๋“ค์€ ํ”„๋กœ์ ํŠธ์—์„œ ํšจ์œจ์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค๋ฃจ๊ณ , ์ธํ…”๋ฆฌ์„ผ์Šค์™€ ์ฝ”๋“œ ์™„์„ฑ ๊ธฐ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

 

โš ๏ธ์•„๋ž˜ 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๊ธฐ ๊ฐ•์˜์ž๋ฃŒ]

๋ฐ˜์‘ํ˜•