์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[React] Vite๋ฅผ ์‚ฌ์šฉํ•œ React ํ”„๋กœ์ ํŠธ ์‹œ์ž‘

Lively a-life 2025. 5. 5. 07:24
๋ฐ˜์‘ํ˜•

๐Ÿ” Vite๋ž€?

Vite๋Š” ์ฐจ์„ธ๋Œ€ ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œ ๋„๊ตฌ๋กœ React์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ๋น ๋ฅธ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์‹œ ๋ณดํ†ต์€ react-create-app ์ด๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ตœ๊ทผ์—๋Š” vite๋“ค์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ์ด์— ๋Œ€ํ•œ ์ž๋ฃŒ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ํ™˜๊ฒฝ๋“ค ๋ณด๋‹ค ๋งŽ์ด ๋น ๋ฅด๋‹ค๊ณ ๋“ค ํ•ฉ๋‹ˆ๋‹ค. 

์ฃผ์š” ํŠน์ง•:

  • โšก๏ธ ๋งค์šฐ ๋น ๋ฅธ ์„œ๋ฒ„ ์‹œ์ž‘: ๋ฒˆ๋“ค๋ง ์—†์ด ์ฆ‰์‹œ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘
  • ๐Ÿ”ฅ ๋น ๋ฅธ HMR (Hot Module Replacement): ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ์ฆ‰๊ฐ์ ์ธ ์—…๋ฐ์ดํŠธ
  • ๐Ÿ—๏ธ ์ตœ์ ํ™”๋œ ๋นŒ๋“œ: Rollup ๊ธฐ๋ฐ˜์˜ ํšจ์œจ์ ์ธ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ
  • ๐Ÿ”ง TypeScript์™€ JSX ์ฆ‰์‹œ ์ง€์›: ๋ณ„๋„ ์„ค์ • ๋ถˆํ•„์š”

๐Ÿ› ๏ธ Vite๋กœ React ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

๐Ÿš€ 1๋‹จ๊ณ„: Vite๋กœ React ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ

# npm ์‚ฌ์šฉ
npm create vite@latest my-react-app -- --template react

 

 

๐Ÿ“ฅ 2๋‹จ๊ณ„: ์˜์กด์„ฑ ์„ค์น˜

cd my-react-app
npm install

โšก 3๋‹จ๊ณ„: ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰

npm run dev

์ฝ˜์†”์— ์•„๋ž˜์ฒ˜๋Ÿผ ๋‚˜์˜ค๋ฉด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค.

rundev ์‹คํ–‰

 

๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด React ํ™”๋ฉด์ด ๋œน๋‹ˆ๋‹ค! ๐ŸŽ‰

 

 

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

my-app/
โ”œโ”€โ”€ index.html                 # HTML ์ง„์ž…์ 
โ”œโ”€โ”€ vite.config.js            # Vite ์„ค์ • ํŒŒ์ผ
โ”œโ”€โ”€ package.json              # npm ์„ค์ •
โ”œโ”€โ”€ public/                   # ์ •์  ํŒŒ์ผ
โ”‚   โ””โ”€โ”€ vite.svg             # ๊ณต๊ฐœ ์—์…‹
โ””โ”€โ”€ src/                      # ์†Œ์Šค ์ฝ”๋“œ
    โ”œโ”€โ”€ App.jsx              # ๋ฉ”์ธ ์ปดํฌ๋„ŒํŠธ
    โ”œโ”€โ”€ main.jsx             # React ์ง„์ž…์ 
    โ”œโ”€โ”€ App.css              # ์Šคํƒ€์ผ
    โ”œโ”€โ”€ index.css            # ๊ธ€๋กœ๋ฒŒ ์Šคํƒ€์ผ
    โ””โ”€โ”€ assets/              # ์ด๋ฏธ์ง€ ๋“ฑ

๐Ÿงช ํ•ต์‹ฌ ํŒŒ์ผ ์˜ˆ์ œ

main.jsx

import React from 'react'
import ReactDOM from 'react-dom/client'
import App from './App'
import './index.css'

ReactDOM.createRoot(document.getElementById('root')).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
)

App.jsx

import { useState } from 'react'
import './App.css'

function App() {
  const [count, setCount] = useState(0)

  return (
    <div className="App">
      <h1>Vite + React</h1>
      <button onClick={() => setCount((count) => count + 1)}>
        count is {count}
      </button>
    </div>
  )
}

export default App

โš™๏ธ Vite ์„ค์ • ์‚ฌ์šฉ์žํ™”

vite.config.js๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์›ํ•˜๋Š” ๋Œ€๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

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

export default defineConfig({
  plugins: [react()],
  server: {
    port: 3000,        // ๊ฐœ๋ฐœ ์„œ๋ฒ„ ํฌํŠธ ๋ณ€๊ฒฝ
    open: true         // ์ž๋™์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ์—ด๊ธฐ
  },
  build: {
    outDir: 'dist',    // ๋นŒ๋“œ ๋””๋ ‰ํ† ๋ฆฌ
    sourcemap: true    // ์†Œ์Šค๋งต ์ƒ์„ฑ
  }
})

 

๐Ÿ†š Vite vs Create React App (CRA)

ํŠน์ง• Vite Create React App

์‹œ์ž‘ ์†๋„ ๋งค์šฐ ๋น ๋ฆ„ (ES ๋ชจ๋“ˆ ์‚ฌ์šฉ) ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ
HMR ์†๋„ ๊ฑฐ์˜ ์ฆ‰๊ฐ์  ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ
๋นŒ๋“œ ์‹œ๊ฐ„ ๋น ๋ฆ„ (Rollup ์‚ฌ์šฉ) ์ค‘๊ฐ„ (Webpack ์‚ฌ์šฉ)
์„ค์ • ๋ณต์žก๋„ ๊ฐ„๋‹จ ์ค‘๊ฐ„
์ƒํƒœ๊ณ„ ์„ฑ์ˆ™๋„ ์„ฑ์žฅ ์ค‘ ๋งค์šฐ ์„ฑ์ˆ™ํ•จ

Vite๋Š” ํŠนํžˆ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ํ›จ์”ฌ ๋น ๋ฅด๊ณ , ํ˜„๋Œ€์ ์ธ JavaScript ์ƒํƒœ๊ณ„์™€ ์ž˜ ํ†ตํ•ฉ๋˜์–ด ์žˆ์–ด ์ƒˆ๋กœ์šด React ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค! ๐Ÿ’ช

 

๋ฐ˜์‘ํ˜•