Vite is a dev server and a production bundler. That's the whole product. The reason it feels magical is that it stopped pretending to be a bundler in development.
The two-mode trick
Older React tooling — Create React App, webpack-based starters — used the same bundler for development and production. Every time you saved a file, webpack rebuilt a chunk graph and re-ran your code through Babel. Cold starts took 15-60 seconds for medium projects. Hot reload was 'fast' only relative to a full restart.
Vite splits the modes:
- Dev: native ES modules in the browser, served on demand by Vite's dev server. No bundling. Source files transform on request. Cold start is the time to start a Node process plus your first
importchain — usually sub-second. - Build:
vite builduses Rollup under the hood. This is a real bundler: tree-shaking, code splitting, minification, CSS extraction. The output is what you ship.
The trick works because browsers shipped native ESM support years ago. In dev, your code is what you wrote (with TS/JSX stripped). In prod, it's optimized.
What Vite is not
Vite is not a framework. It does not give you routing, data fetching, auth, or a deployment story. You compose those on top: React Router for routing, TanStack Query / SWR / native fetch for data, Tailwind v4 for styling, an auth library for auth. The shape of your app is your decision.
Vite is also not opinionated about file structure. There's no app/ or pages/ directory it cares about. You organize src/ however you want.
Vite vs Turbopack vs webpack vs esbuild
You'll hear these names. Quick map:
- esbuild — A Go-based JS/TS bundler/transformer. Vite uses esbuild internally for dependency pre-bundling and TS stripping.
- webpack — The classic. CRA was built on it. Still powers a lot of legacy. Slower than Vite at every scale.
- Turbopack — Vercel's bundler, written in Rust, that powers Next.js's dev server (and increasingly its production builds). Not used outside Next.js — don't reach for it in a Vite project.
- Vite — Native ESM in dev + Rollup in prod. Framework-agnostic. The default for SPAs in 2026.
@vitejs/plugin-react plugin wire React-specific behavior on top — Fast Refresh, JSX handling, automatic dev-only React imports.The whole config
A working Vite + React + TS config fits in eight lines. There's no hidden magic — what you see is what runs.