본문으로 건너뛰기
김신건의 로그

[JavaScript] Vite

· 수정 · 📖 약 2분 · 683자/단어 #javascript #bundler #build-tool #vite #esm
Vite, vite, Vite 6, Vite 7, Rolldown-Vite, vite dev server, vitest

정의

Vite (프랑스어 “빠르다”) 는 Evan You (Vue 창시자) 가 2020년 시작한 모던 프런트엔드 빌드 도구. 두 부분:

  • Dev Server: Native ESM 을 브라우저에 직접 서빙 (번들 없음)
  • Production Build: 현재 Rollup, 미래 Rolldown (Rust)

한 줄 요약: “개발은 번들 안 함, 프로덕션은 번들”. 이 이중 전략으로 대규모 앱도 즉시 시작.

왜 Vite 인가

Webpack 의 문제

Dev cold start: Webpack 은 개발 시에도 전체 앱을 번들해 브라우저에 서빙. 파일 수천 개 앱은 시작에 수 분.

Vite 의 통찰

브라우저는 이미 ESM 지원 (2020+ 모든 evergreen). 개발 시 번들 안 하고 브라우저에게 native ESM 직접 서빙 → 즉시 시작.

<!-- 브라우저가 파싱 -->
<script type="module" src="/src/main.ts"></script>

<!-- main.ts 안 -->
<script type="module">
  import { createApp } from '/node_modules/.vite/deps/vue.js'
  import App from '/src/App.vue?t=1234'
</script>

파일 요청 시 Vite 가 즉석 변환 (TS → JS, Vue SFC → JS/CSS).

아키텍처

flowchart LR
  subgraph "Dev (esbuild dep prebundle + native ESM)"
    U[Browser] -->|import| DS[Vite Dev Server]
    DS -->|즉석 변환| S[.ts/.vue/.svelte 소스]
    DS -->|프리번들| N[node_modules]
    N -->|esbuild| Cache[.vite/deps/*.js]
  end
  subgraph "Build (Rollup/Rolldown)"
    Src[src/*] --> R[Rollup]
    R --> Dist[dist/*]
  end

개발 서버

Native ESM 서빙

.ts, .vue, .svelte 요청 시 즉석 컴파일 (esbuild + framework plugin).

Dependency Pre-Bundling

node_modules 는 esbuild 로 미리 번들 후 캐시 (.vite/deps/). 이유:

  • CJS-only 라이브러리를 ESM 으로 변환
  • 수백 개 파일 요청을 하나로 통합

HMR

파일 저장 시 해당 모듈만 교체. React Fast Refresh, Vue HMR 통합.

속도: 대규모 앱도 밀리초.

프로덕션 빌드

현재 (Vite 6-7): Rollup 백엔드. Tree shaking, minification, code splitting.

미래 (Rolldown-Vite): Rollup 호환 API + Rust 성능. 2025 년 프리뷰, 2026+ 안정화 목표.

vite build     # Rollup 기반 (기본)
// package.json (프리뷰)
{
  "dependencies": {
    "rolldown-vite": "^1.0.0"
  }
}

설정

// vite.config.ts
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

export default defineConfig({
  plugins: [react()],
  build: {
    outDir: 'dist',
    sourcemap: true,
    rollupOptions: {
      output: {
        manualChunks: {
          vendor: ['react', 'react-dom'],
        },
      },
    },
  },
  server: {
    port: 3000,
    proxy: {
      '/api': 'http://localhost:8000',
    },
  },
  resolve: {
    alias: {
      '@': '/src',
    },
  },
});

Webpack 대비 압도적으로 단순.

프레임워크 통합

공식 템플릿:

npm create vite@latest my-app
# 선택: Vanilla, Vue, React, Preact, Lit, Svelte, Solid, Qwik

주요 채택:

  • Vue 3: 공식
  • Svelte / SvelteKit: 공식
  • Nuxt 3+: Vite 내장
  • Astro: Vite 내장
  • Solid: 공식
  • Remix: Vite 이관 (v2+)
  • Qwik: Vite 내장

Next.js 는 자체 Turbopack (Vite 아님).

Plugin 시스템

Rollup plugin 호환 + Vite 특화 hook (configureServer, transformIndexHtml).

export default {
  plugins: [
    {
      name: 'custom-plugin',
      transform(code, id) {
        if (id.endsWith('.custom')) {
          return { code: transformCustom(code) };
        }
      },
    },
  ],
};

수천 개 커뮤니티 plugin.

SSR 지원

Vite 는 SSR 도 지원 (vite-plugin-ssr, SvelteKit, Nuxt 등이 활용):

import { createServer } from 'vite';

const vite = await createServer({
  server: { middlewareMode: true },
  appType: 'custom',
});

// Express 등에서
app.use(vite.middlewares);

Environment API (Vite 6+)

Vite 6 도입. Client / SSR / Edge 등 여러 환경을 동시 지원.

export default {
  environments: {
    client: { /* browser bundle */ },
    ssr: { /* Node bundle */ },
    edge: { /* Cloudflare Workers */ },
  },
};

Framework 개발자 대상 (Nuxt, SvelteKit 활용).

관용 스택

  • Vitest: Vite 위 테스트 프레임워크 (Jest 대체)
  • @vitejs/plugin-react, -vue, -svelte
  • vite-plugin-pwa
  • unplugin-auto-import, unplugin-vue-components
  • rollup-plugin-visualizer: 번들 분석

성능

  • Cold start: 즉시 (대규모 앱도 초 미만)
  • HMR: 밀리초
  • Production build: Rollup 기반이라 esbuild/Turbopack 보다 느림, Rolldown 이관 후 개선 예상

함정

WARNING

CJS-only 라이브러리 는 pre-bundle 필요. 처음 dev 시작 시 지연.

CAUTION

optimizeDeps.include 로 명시 필요한 경우 (동적 import 로 발견 못 하는 dep).

WARNING

Prod 빌드는 여전히 Rollup 속도. 큰 앱은 esbuild 나 Rspack 대비 느림.

IMPORTANT

Env variable prefix. .env 파일의 변수 중 VITE_ prefix 만 클라이언트 노출.

관련 위키

이 글의 용어 (7개)
[JavaScript] Bundling (번들링 개요)javascript
정의 JavaScript 번들링 (Bundling) 은 여러 소스 파일 (JS, CSS, 이미지, JSON 등) 을 브라우저나 런타임이 효율적으로 실행할 수 있는 최소한의 결과물…
[JavaScript] CommonJS vs ESM (package.json 설정 완전 정복)javascript
정의 JavaScript 는 두 개의 서로 다른 모듈 시스템 을 가집니다. - CommonJS (CJS): Node.js 초기 (2009) 부터 사용. / . 동기 로딩. - E…
[Javascript] ES Modules (import / export)javascript
정의 ES Modules (ESM) 은 표준 JS 모듈 시스템 (ES6). / 키워드. 브라우저와 Node.js 16+ 모두 지원. export named export defau…
[JavaScript] esbuildjavascript
정의 esbuild 는 Evan Wallace (Figma CTO) 가 2020년 발표한 Go 로 작성된 JavaScript 번들러/컴파일러 입니다. 10-100배 빠른 성능으로…
[JavaScript] Rollupjavascript
정의 Rollup 은 Rich Harris (Svelte 창시자) 가 2015년 만든 JavaScript 번들러. 라이브러리 배포 에 특화되어 tree shaking 을 처음으로…
[JavaScript] Turbopack & Rspack (Rust 번들러)javascript
정의 2022-2023년 등장한 Rust 로 재구현된 Webpack 계열 번들러 두 개: - Turbopack: Vercel (Next.js) 개발. Next.js dev/bui…
[JavaScript] Webpackjavascript
정의 Webpack 은 2014년 Tobias Koppers 가 만든 JavaScript 모듈 번들러입니다. 오랫동안 사실상의 표준 이었고, 방대한 loader/plugin 생태…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기