Alert

์ด ๊ธ€์€ Claude Code์˜ ๋„์›€์„ ๋ฐ›์•„ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

TL;DR

  • Vite๋Š” ES Modules ๊ธฐ๋ฐ˜์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œ ๋„๊ตฌ
  • ๊ฐœ๋ฐœ ์„œ๋ฒ„๋Š” ๋ฒˆ๋“ค๋ง ์—†์ด ์ฆ‰์‹œ ์‹œ์ž‘, ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋Š” Rollup ์‚ฌ์šฉ
  • esbuild๋กœ ์˜์กด์„ฑ ์‚ฌ์ „ ๋ฒˆ๋“ค๋งํ•˜์—ฌ ์†๋„ ํ™•๋ณด
  • React, Vue, Svelte ๋“ฑ ์ฃผ์š” ํ”„๋ ˆ์ž„์›Œํฌ ์ง€์›

Vite?

  • ํ”„๋ž‘์Šค์–ด๋กœ โ€œ๋น ๋ฅด๋‹คโ€๋Š” ๋œป์˜ ํ”„๋ก ํŠธ์—”๋“œ ๋นŒ๋“œ ๋„๊ตฌ
  • Evan You(Vue.js ์ฐฝ์‹œ์ž)๊ฐ€ ๊ฐœ๋ฐœ
  • CRA(Create React App)์˜ ์‚ฌ์‹ค์ƒ ํ›„์† ๋Œ€์•ˆ
  • https://vite.dev/

1. ๋นŒ๋“œ ๋„๊ตฌ๋ž€

์ž‘์„ฑํ•œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋„๊ตฌ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTML, CSS, ์ˆœ์ˆ˜ JavaScript๋งŒ ์ดํ•ดํ•œ๋‹ค. JSX, TypeScript, CSS Modules ๊ฐ™์€ ๊ฒƒ๋“ค์€ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€ํ™˜ ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

์ž‘์—…์„ค๋ช…
๋ณ€ํ™˜(Transform)JSX โ†’ JS, TypeScript โ†’ JS ๋“ฑ ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜
๋ฒˆ๋“ค๋ง(Bundle)์ˆ˜๋ฐฑ ๊ฐœ ํŒŒ์ผ์„ ์†Œ์ˆ˜์˜ ํŒŒ์ผ๋กœ ํ•ฉ์นจ
์ตœ์ ํ™”(Optimize)๋ฏธ์‚ฌ์šฉ ์ฝ”๋“œ ์ œ๊ฑฐ, ์••์ถ•(minify), ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…
๊ฐœ๋ฐœ ์„œ๋ฒ„๋กœ์ปฌ์—์„œ ์‹ค์‹œ๊ฐ„ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ œ๊ณต

2. ๊ธฐ์กด ๋นŒ๋“œ ๋„๊ตฌ์˜ ๋ฌธ์ œ

Webpack ๊ฐ™์€ ๊ธฐ์กด ๋ฒˆ๋“ค๋Ÿฌ๋Š” ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ๋ฏธ๋ฆฌ ๋ฒˆ๋“ค๋งํ•œ๋‹ค.

[Webpack ๋ฐฉ์‹]
๋ชจ๋“  ๋ชจ๋“ˆ ๋ถ„์„ โ†’ ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„ ์ƒ์„ฑ โ†’ ๋ฒˆ๋“ค ์ƒ์„ฑ โ†’ ์„œ๋ฒ„ ์‹œ์ž‘

ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์„œ๋ฒ„ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ณ , ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด๋„ ๋ฐ˜์˜(HMR, Hot Module Replacement)์ด ๋А๋ ค์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.


3. Vite์˜ ์ ‘๊ทผ ๋ฐฉ์‹

Vite๋Š” ๊ฐœ๋ฐœ๊ณผ ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ๋ฅผ ๋‹ค๋ฅธ ์ „๋žต์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๊ฐœ๋ฐœ ๋ชจ๋“œ

๋ธŒ๋ผ์šฐ์ €์˜ ๋„ค์ดํ‹ฐ๋ธŒ ES Modules(ESM)์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•œ๋‹ค. ํŒŒ์ผ์„ ๋ฏธ๋ฆฌ ๋ฌถ์ง€ ์•Š๊ณ , ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ชจ๋“ˆ์„ ์š”์ฒญํ•˜๋ฉด ๊ทธ๋•Œ ๋ณ€ํ™˜ํ•ด์„œ ๋‚ด๋ ค์ค€๋‹ค.

[Vite ๋ฐฉ์‹]
์„œ๋ฒ„ ์ฆ‰์‹œ ์‹œ์ž‘ โ†’ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ชจ๋“ˆ ์š”์ฒญ โ†’ ํ•ด๋‹น ๋ชจ๋“ˆ๋งŒ ๋ณ€ํ™˜ํ•˜์—ฌ ์‘๋‹ต

ESM์ด๋ž€

import/export ๊ตฌ๋ฌธ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ธŒ๋ผ์šฐ์ € ํ‘œ์ค€ ๋ฐฉ์‹์ด๋‹ค. ๋ณ„๋„ ๋ฒˆ๋“ค๋Ÿฌ ์—†์ด ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง์ ‘ ๋ชจ๋“ˆ ์˜์กด์„ฑ์„ ํ•ด์„ํ•œ๋‹ค.

ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ

ํ”„๋กœ๋•์…˜์—์„œ๋Š” Rollup์„ ์‚ฌ์šฉํ•ด์„œ ๋ฒˆ๋“ค๋งํ•œ๋‹ค. ํŠธ๋ฆฌ์…ฐ์ดํ‚น, ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ์••์ถ• ๋“ฑ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

npx vite build    # dist/ ํด๋”์— ์ตœ์ ํ™”๋œ ๊ฒฐ๊ณผ๋ฌผ ์ƒ์„ฑ
์˜์กด์„ฑ ์‚ฌ์ „ ๋ฒˆ๋“ค๋ง

node_modules์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ESM์ด ์•„๋‹Œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. Vite๋Š” esbuild(Go ๊ธฐ๋ฐ˜)๋กœ ์ด๋ฅผ ์‚ฌ์ „ ๋ณ€ํ™˜ํ•ด๋‘”๋‹ค. ์ด ๊ณผ์ •์€ ์ตœ์ดˆ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๊ณ  ์บ์‹œ๋œ๋‹ค.


4. Webpack๊ณผ ๋น„๊ต

WebpackVite
๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹œ์ž‘์ „์ฒด ๋ฒˆ๋“ค๋ง ํ›„ ์‹œ์ž‘ (๋А๋ฆผ)์ฆ‰์‹œ ์‹œ์ž‘
HMR ์†๋„ํ”„๋กœ์ ํŠธ ์ปค์งˆ์ˆ˜๋ก ๋А๋ ค์ง๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๊ต์ฒดํ•˜์—ฌ ์ผ์ •
ํ”„๋กœ๋•์…˜ ๋นŒ๋“œWebpack ์ž์ฒด ๋ฒˆ๋“ค๋งRollup ๊ธฐ๋ฐ˜ ๋ฒˆ๋“ค๋ง
์„ค์ • ๋ณต์žก๋„๋†’์Œ (loader, plugin ์„ค์ •)๋‚ฎ์Œ (ํ•ฉ๋ฆฌ์ ์ธ ๊ธฐ๋ณธ๊ฐ’)
์ƒํƒœ๊ณ„์„ฑ์ˆ™ํ•˜๊ณ  ๋ฐฉ๋Œ€ํ•จ๋น ๋ฅด๊ฒŒ ์„ฑ์žฅ ์ค‘

5. ๋น ๋ฅธ ์‹œ์ž‘

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
# React + TypeScript ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ
npm create vite@latest my-app -- --template react-ts
 
cd my-app
npm install
๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
npm run dev    # ๊ธฐ๋ณธ ํฌํŠธ: http://localhost:5173
ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ
npm run build    # dist/ ํด๋”์— ๋นŒ๋“œ ๊ฒฐ๊ณผ ์ƒ์„ฑ
npm run preview  # ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ ๋กœ์ปฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
์ฃผ์š” ํ…œํ”Œ๋ฆฟ
ํ…œํ”Œ๋ฆฟ๋ช…๋ น์–ด
React + TS--template react-ts
Vue + TS--template vue-ts
Svelte + TS--template svelte-ts
Vanilla--template vanilla

6. ์„ค์ •

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์˜ vite.config.ts์—์„œ ์„ค์ •ํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ, ํ•„์š”ํ•˜๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋‚˜ ๊ฒฝ๋กœ ๋“ฑ์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
 
export default defineConfig({
  plugins: [react()],
  server: {
    port: 3000,          // ๊ฐœ๋ฐœ ์„œ๋ฒ„ ํฌํŠธ ๋ณ€๊ฒฝ
  },
  build: {
    outDir: 'dist',      // ๋นŒ๋“œ ์ถœ๋ ฅ ๊ฒฝ๋กœ
  },
})