Vite(ν”„λž‘μŠ€μ–΄λ‘œ β€œλΉ λ₯΄λ‹€β€λ₯Ό 의미, /vit/둜 발음)λŠ” ν˜„λŒ€ μ›Ή ν”„λ‘œμ νŠΈλ₯Ό μœ„ν•œ λΉŒλ“œ λ„κ΅¬λ‘œ, 더 λΉ λ₯΄κ³  κ°€λ²Όμš΄ 개발 κ²½ν—˜μ„ μ œκ³΅ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•œλ‹€.

두 κ°€μ§€ 핡심 κ΅¬μ„±μš”μ†Œλ‘œ 이루어져 μžˆλ‹€:

  1. Dev Server: Native ES Modules μœ„μ—μ„œ λ™μž‘ν•˜λ©°, 맀우 λΉ λ₯Έ Hot Module Replacement(HMR) 제곡
  2. Build Command: Rollup을 μ‚¬μš©ν•˜μ—¬ ν”„λ‘œλ•μ…˜μš© μ΅œμ ν™”λœ 정적 에셋 λ²ˆλ“€λ§

ν•΄λ‹Ή κ°œλ…μ΄ ν•„μš”ν•œ 이유

  • Cold Start 속도 문제: κΈ°μ‘΄ λ²ˆλ“€λŸ¬(webpack λ“±)λŠ” 개발 μ„œλ²„ μ‹œμž‘ μ‹œ 전체 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν¬λ‘€λ§ν•˜κ³  λΉŒλ“œν•΄μ•Ό ν–ˆλ‹€. 수천 개의 λͺ¨λ“ˆμ„ κ°€μ§„ λŒ€κ·œλͺ¨ ν”„λ‘œμ νŠΈμ—μ„œλŠ” μ„œλ²„ μ‹œμž‘μ— 수 뢄이 μ†Œμš”
  • 느린 HMR μ—…λ°μ΄νŠΈ: κΈ°μ‘΄ λ²ˆλ“€λŸ¬λŠ” 파일 λ³€κ²½ μ‹œ 전체 λ²ˆλ“€μ„ λ‹€μ‹œ λΉŒλ“œν•΄μ•Ό ν•˜λ―€λ‘œ, 앱이 컀질수둝 HMR 속도가 ν˜„μ €νžˆ μ €ν•˜
  • 개발-ν”„λ‘œλ•μ…˜ 격차: 개발 ν™˜κ²½κ³Ό ν”„λ‘œλ•μ…˜ λΉŒλ“œ μ‚¬μ΄μ˜ 일관성 확보 ν•„μš”

AS-IS (κΈ°μ‘΄ λ²ˆλ“€λŸ¬ 기반 개발)

μ„œλ²„ μ‹œμž‘

sequenceDiagram
    autonumber
    participant Dev as 개발자
    participant Bundler as λ²ˆλ“€λŸ¬ (webpack)
    participant Browser as λΈŒλΌμš°μ €

    Dev->>Bundler: 개발 μ„œλ²„ μ‹œμž‘
    Bundler->>Bundler: 전체 μ†ŒμŠ€ μ½”λ“œ 크둀링
    Bundler->>Bundler: μ˜μ‘΄μ„± κ·Έλž˜ν”„ ꡬ좕
    Bundler->>Bundler: λͺ¨λ“  λͺ¨λ“ˆμ„ ν•˜λ‚˜μ˜ Bundle둜 λΉŒλ“œ
    Note over Bundler: 앱이 클수둝 수 λΆ„ μ†Œμš”
    Bundler->>Browser: Bundle 제곡 β†’ μ„œλ²„ Ready

파일 μˆ˜μ • μ‹œ

sequenceDiagram
    autonumber
    participant Dev as 개발자
    participant Bundler as λ²ˆλ“€λŸ¬ (webpack)
    participant Browser as λΈŒλΌμš°μ €

    Dev->>Bundler: 파일 1개 μˆ˜μ •
    Bundler->>Bundler: 전체 Bundle μž¬λΉŒλ“œ (λ³€κ²½ μ•ˆ 된 λͺ¨λ“ˆ 포함)
    Note over Bundler: 앱이 클수둝 HMR도 느렀짐
    Bundler->>Browser: μƒˆ Bundle 전솑 β†’ μ—…λ°μ΄νŠΈ

TO-BE (Vite 방식)

μ„œλ²„ μ‹œμž‘

sequenceDiagram
    autonumber
    participant Dev as 개발자
    participant Vite
    participant esbuild
    participant Browser as λΈŒλΌμš°μ €

    Dev->>Vite: 개발 μ„œλ²„ μ‹œμž‘
    Vite->>esbuild: Dependencies만 Pre-bundling μš”μ²­
    esbuild->>esbuild: CommonJS/UMD β†’ ESM λ³€ν™˜ + 단일 파일둜 ν•©μΉ¨
    Note over esbuild: Go 기반 β†’ 10~100λ°° 빠름
    esbuild-->>Vite: μΊμ‹±λœ μ˜μ‘΄μ„± μ€€λΉ„ μ™„λ£Œ
    Vite->>Browser: μ„œλ²„ Ready (μ†ŒμŠ€ μ½”λ“œλŠ” 아직 λΉŒλ“œ μ•ˆ 함)
    Browser->>Vite: νŽ˜μ΄μ§€ μ ‘κ·Ό β†’ ν•„μš”ν•œ λͺ¨λ“ˆλ§Œ μš”μ²­
    Vite->>Browser: Native ESM으둜 on-demand 제곡

파일 μˆ˜μ • μ‹œ

sequenceDiagram
    autonumber
    participant Dev as 개발자
    participant Vite
    participant Browser as λΈŒλΌμš°μ €

    Dev->>Vite: 파일 1개 μˆ˜μ •
    Vite->>Vite: ν•΄λ‹Ή λͺ¨λ“ˆ ~ κ°€μž₯ κ°€κΉŒμš΄ HMR κ²½κ³„κΉŒμ§€λ§Œ λ¬΄νš¨ν™”
    Note over Vite: λ‚˜λ¨Έμ§€ λͺ¨λ“ˆμ€ κ·ΈλŒ€λ‘œ μœ μ§€
    Vite->>Browser: λ³€κ²½λœ λͺ¨λ“ˆλ§Œ ESM으둜 전솑
    Note over Browser: μƒνƒœ μœ μ§€ + μ¦‰μ‹œ 반영 (μ•± 크기와 무관)

Vite의 핡심 μ „λž΅: λͺ¨λ“ˆ λΆ„λ₯˜

ViteλŠ” λͺ¨λ“ˆμ„ 두 κ°€μ§€ μΉ΄ν…Œκ³ λ¦¬λ‘œ λ‚˜λˆ  μ²˜λ¦¬ν•œλ‹€:

1. Dependencies (μ˜μ‘΄μ„±)

  • node_modules에 μžˆλŠ” λŒ€λΆ€λΆ„ 정적인 JavaScript
  • 변경이 λ“œλ¬Όκ³  크기가 큰 νŒ¨ν‚€μ§€λ“€ (예: lodash, react)
  • esbuild둜 사전 λ²ˆλ“€λ§ (Go둜 μž‘μ„±λ˜μ–΄ JS 기반 λ²ˆλ“€λŸ¬ λŒ€λΉ„ 10~100λ°° 빠름)
  • CommonJS/UMD λͺ¨λ“ˆμ„ ESM으둜 λ³€ν™˜
  • HTTP ν—€λ”λ‘œ κ°•λ ₯ν•˜κ²Œ 캐싱

2. Source Code (μ†ŒμŠ€ μ½”λ“œ)

  • JSX, CSS, Vue/Svelte μ»΄ν¬λ„ŒνŠΈ λ“± λ³€ν™˜μ΄ ν•„μš”ν•œ μ½”λ“œ
  • 자주 μˆ˜μ •λ˜λ©°, 항상 전체λ₯Ό λ‘œλ“œν•  ν•„μš” μ—†μŒ
  • **Native ESM**으둜 제곡 β†’ λΈŒλΌμš°μ €κ°€ ν•„μš”ν•œ λͺ¨λ“ˆλ§Œ on-demand둜 μš”μ²­
  • 304 Not Modified 응닡과 Cache-Control 헀더 ν™œμš©

ν”„λ‘œλ•μ…˜ λΉŒλ“œ: μ™œ μ—¬μ „νžˆ λ²ˆλ“€λ§ν•˜λŠ”κ°€?

Native ESM이 λΈŒλΌμš°μ €μ—μ„œ 널리 μ§€μ›λ˜μ§€λ§Œ, ν”„λ‘œλ•μ…˜μ—μ„œ λ²ˆλ“€λ§ 없이 λ°°ν¬ν•˜λ©΄ λΉ„νš¨μœ¨μ μ΄λ‹€:

  • μ€‘μ²©λœ import둜 μΈν•œ μΆ”κ°€ λ„€νŠΈμ›Œν¬ 왕볡(round trip) λ°œμƒ
  • Tree-shaking λΆˆκ°€

Tree-shaking: λ²ˆλ“€λ§ μ‹œ μ‹€μ œλ‘œ μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μ½”λ“œ(dead code)λ₯Ό μžλ™μœΌλ‘œ μ œκ±°ν•˜λŠ” μ΅œμ ν™” 기법. 예λ₯Ό λ“€μ–΄ lodashμ—μ„œ debounce만 importν•˜λ©΄, λ‚˜λ¨Έμ§€ ν•¨μˆ˜λ“€μ€ μ΅œμ’… λ²ˆλ“€μ— ν¬ν•¨λ˜μ§€ μ•ŠλŠ”λ‹€. ESM의 정적 import/export ꡬ문 덕뢄에 κ°€λŠ₯ν•˜λ‹€ (CommonJS의 동적 require()λ‘œλŠ” λΆˆκ°€).

  • Code Splitting 같은 μ΅œμ ν™” λΆˆκ°€

Code Splitting: λ²ˆλ“€μ„ μ—¬λŸ¬ 개의 μž‘μ€ 청크(chunk)둜 λΆ„ν• ν•˜μ—¬, ν•„μš”ν•œ μ‹œμ μ—λ§Œ λ‘œλ“œν•˜λŠ” 기법. 예λ₯Ό λ“€μ–΄ κ΄€λ¦¬μž νŽ˜μ΄μ§€ μ½”λ“œλŠ” κ΄€λ¦¬μžκ°€ μ ‘κ·Όν•  λ•Œλ§Œ λ‘œλ“œλœλ‹€. import() 동적 import와 ν•¨κ»˜ μ‚¬μš©ν•˜λ©°, 초기 λ‘œλ”© μ„±λŠ₯을 크게 κ°œμ„ ν•œλ‹€.

λ”°λΌμ„œ ViteλŠ” ν”„λ‘œλ•μ…˜ λΉŒλ“œμ— Rollup을 μ‚¬μš©ν•œλ‹€.

esbuild vs Rollup: μ™œ λ‘˜ λ‹€ μ“°λŠ”κ°€?

μ—­ν• λ„κ΅¬μ΄μœ 
Dev μ˜μ‘΄μ„± Pre-bundlingesbuildGo 기반으둜 10~100λ°° 빠름
Production BuildRollupμœ μ—°ν•œ ν”ŒλŸ¬κ·ΈμΈ μƒνƒœκ³„, tree-shaking 우수

esbuildκ°€ ν”„λ‘œλ•μ…˜ λΉŒλ“œμ—λ„ λΉ λ₯΄μ§€λ§Œ, Vite의 ν”ŒλŸ¬κ·ΈμΈ APIκ°€ esbuild와 ν˜Έν™˜λ˜μ§€ μ•ŠλŠ”λ‹€. ν–₯ν›„ Rolldown(Rollup의 Rust ν¬νŒ…)이 두 도ꡬλ₯Ό 톡합할 수 μžˆλ‹€.

μ£Όμš” κΈ°λŠ₯ (Features)

NPM μ˜μ‘΄μ„± 처리

  • bare module import (예: import { ref } from 'vue')λ₯Ό λΈŒλΌμš°μ €κ°€ 인식할 수 μžˆλŠ” URL둜 λ³€ν™˜
  • /node_modules/.vite/deps/vue.js?v=f3sf2ebd ν˜•νƒœλ‘œ 리라이트

TypeScript 지원

  • .ts νŒŒμΌμ„ λ„€μ΄ν‹°λΈŒλ‘œ import κ°€λŠ₯
  • esbuildλ₯Ό μ‚¬μš©ν•˜μ—¬ tsc λŒ€λΉ„ 20~30λ°° λΉ λ₯Έ 트랜슀파일링
  • 단, νƒ€μž… μ²΄ν¬λŠ” μˆ˜ν–‰ν•˜μ§€ μ•ŠμŒ β†’ IDEλ‚˜ tsc --noEmit으둜 별도 μ‹€ν–‰ ν•„μš”

CSS 처리

  • CSS import μ‹œ <style> νƒœκ·Έλ‘œ μžλ™ μ‚½μž… + HMR 지원
  • @import 인라이닝, PostCSS, CSS Modules (.module.css), Sass/Less/Stylus 지원

λΉŒλ“œ μ΅œμ ν™”

  • CSS Code Splitting: 비동기 청크의 CSSλ₯Ό μžλ™ 뢄리
  • Preload Directive 생성: μ΅œμ ν™”λœ λ¦¬μ†ŒμŠ€ λ‘œλ”©
  • Async Chunk λ‘œλ”© μ΅œμ ν™”: λΆˆν•„μš”ν•œ λ„€νŠΈμ›Œν¬ 왕볡 제거

Vite의 μ˜κ°μ„ 받은 도ꡬ듀

λ„κ΅¬κΈ°μ—¬μƒνƒœ
SnowpackNative ESM dev server, dependency pre-bundling κ°œλ… 영감Archived
WMR (Preact)Universal Rollup plugin API μ˜κ°μœ μ§€λ³΄μˆ˜ μ’…λ£Œ
@web/dev-serverKoa 기반 μ„œλ²„ μ•„ν‚€ν…μ²˜ μ˜κ°ν™œλ°œνžˆ μœ μ§€

Q&A

Q) β€œκ·Έλ ‡λ‹€λ©΄ ViteλŠ” ν”„λ‘ νŠΈμ—”λ“œ ν”„λ ˆμž„μ›Œν¬μΈ React, Vue.js, Angular 등에 λͺ¨λ‘ 뢙일 수 μžˆλŠ” ν”„λ ˆμž„μ›Œν¬μ•Ό?”

  • ViteλŠ” **ν”„λ ˆμž„μ›Œν¬κ°€ μ•„λ‹ˆλΌ λΉŒλ“œ 도ꡬ(Build Tool)**λ‹€. React, Vue, Angular 같은 ν”„λ ˆμž„μ›Œν¬μ™€ 동일 계측이 μ•„λ‹ˆλΌ ν•˜μœ„ 인프라 계측에 μœ„μΉ˜ν•œλ‹€.
  • λΉ„μœ ν•˜μžλ©΄: React/Vue = μžλ™μ°¨, Vite = μ—”μ§„. 엔진은 μ—¬λŸ¬ μžλ™μ°¨μ— μž₯μ°©ν•  수 μžˆλ‹€.
  • ν”ŒλŸ¬κ·ΈμΈ 기반 μ•„ν‚€ν…μ²˜λ‘œ ν”„λ ˆμž„μ›Œν¬λ₯Ό μ§€μ›ν•œλ‹€. 곡식 create-vite ν…œν”Œλ¦Ώμ΄ μ œκ³΅ν•˜λŠ” ν”„λ ˆμž„μ›Œν¬:
ν”„λ ˆμž„μ›Œν¬κ³΅μ‹ ν…œν”Œλ¦ΏλΉ„κ³ 
VueOVite μ°½μ‹œμž(Evan You)κ°€ Vue μ°½μ‹œμžμ΄κΈ°λ„ 함
ReactOreact, react-ts, react-swc ν…œν”Œλ¦Ώ 제곡
SvelteO
SolidO
PreactO
LitOWeb Components
QwikO
AngularX (곡식 ν…œν”Œλ¦Ώ μ—†μŒ)단, Angular 16+λΆ€ν„° 자체적으둜 Viteλ₯Ό dev server둜 채택함
Vanilla JS/TSOν”„λ ˆμž„μ›Œν¬ 없이 순수 JS/TS>
  • 핡심: ViteλŠ” νŠΉμ • ν”„λ ˆμž„μ›Œν¬μ— μ’…μ†λ˜μ§€ μ•ŠλŠ” λ²”μš© λΉŒλ“œ 도ꡬ이며, ν”ŒλŸ¬κ·ΈμΈμ„ 톡해 거의 λͺ¨λ“  ν”„λ‘ νŠΈμ—”λ“œ ν”„λ ˆμž„μ›Œν¬μ™€ ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆλ‹€.

μ°Έκ³  λ¬Έμ„œ