Vite(νλμ€μ΄λ‘ βλΉ λ₯΄λ€βλ₯Ό μλ―Έ, /vit/λ‘ λ°μ)λ νλ μΉ νλ‘μ νΈλ₯Ό μν λΉλ λꡬλ‘, λ λΉ λ₯΄κ³ κ°λ²Όμ΄ κ°λ° κ²½νμ μ 곡νλ κ²μ λͺ©νλ‘ νλ€.
λ κ°μ§ ν΅μ¬ ꡬμ±μμλ‘ μ΄λ£¨μ΄μ Έ μλ€:
- Dev Server: Native ES Modules μμμ λμνλ©°, λ§€μ° λΉ λ₯Έ Hot Module Replacement(HMR) μ 곡
- 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-bundling | esbuild | Go κΈ°λ°μΌλ‘ 10~100λ°° λΉ λ¦ |
| Production Build | Rollup | μ μ°ν νλ¬κ·ΈμΈ μνκ³, 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μ μκ°μ λ°μ λꡬλ€
| λꡬ | κΈ°μ¬ | μν |
|---|---|---|
| Snowpack | Native ESM dev server, dependency pre-bundling κ°λ μκ° | Archived |
| WMR (Preact) | Universal Rollup plugin API μκ° | μ μ§λ³΄μ μ’ λ£ |
| @web/dev-server | Koa κΈ°λ° μλ² μν€ν μ² μκ° | νλ°ν μ μ§ |
Q&A
Q) βκ·Έλ λ€λ©΄ Viteλ νλ‘ νΈμλ νλ μμν¬μΈ React, Vue.js, Angular λ±μ λͺ¨λ λΆμΌ μ μλ νλ μμν¬μΌ?β
- Viteλ **νλ μμν¬κ° μλλΌ λΉλ λꡬ(Build Tool)**λ€. React, Vue, Angular κ°μ νλ μμν¬μ λμΌ κ³μΈ΅μ΄ μλλΌ νμ μΈνλΌ κ³μΈ΅μ μμΉνλ€.
- λΉμ νμλ©΄: React/Vue = μλμ°¨, Vite = μμ§. μμ§μ μ¬λ¬ μλμ°¨μ μ₯μ°©ν μ μλ€.
- νλ¬κ·ΈμΈ κΈ°λ° μν€ν
μ²λ‘ νλ μμν¬λ₯Ό μ§μνλ€. 곡μ
create-viteν νλ¦Ώμ΄ μ 곡νλ νλ μμν¬:
| νλ μμν¬ | 곡μ ν νλ¦Ώ | λΉκ³ | |
|---|---|---|---|
| Vue | O | Vite μ°½μμ(Evan You)κ° Vue μ°½μμμ΄κΈ°λ ν¨ | |
| React | O | react, react-ts, react-swc ν
νλ¦Ώ μ 곡 | |
| Svelte | O | ||
| Solid | O | ||
| Preact | O | ||
| Lit | O | Web Components | |
| Qwik | O | ||
| Angular | X (곡μ ν νλ¦Ώ μμ) | λ¨, Angular 16+λΆν° μ체μ μΌλ‘ Viteλ₯Ό dev serverλ‘ μ±νν¨ | |
| Vanilla JS/TS | O | νλ μμν¬ μμ΄ μμ JS/TS | > |
- ν΅μ¬: Viteλ νΉμ νλ μμν¬μ μ’ μλμ§ μλ λ²μ© λΉλ λꡬμ΄λ©°, νλ¬κ·ΈμΈμ ν΅ν΄ κ±°μ λͺ¨λ νλ‘ νΈμλ νλ μμν¬μ ν¨κ» μ¬μ©ν μ μλ€.