defineConfig in vite.config.ts for type-safe configuration; key areas are plugins, resolve.alias, server.proxy, and build.rollupOptions.npx vite (dev) / npx vite build (production)server.proxy and expecting it to work in production — it is dev-server only.vite.config.ts must use defineConfig for type safetyserver.proxy only works during dev — production needs a real reverse proxybuild.target defaults to "modules" (ES2020) — set explicitly for broader supportisolatedModules: true required in tsconfig when using ViteVITE_ to be exposed to client code| Option | Default | Purpose |
|---|---|---|
root | process.cwd() | Project root directory |
base | "/" | Public base path |
plugins | [] | Framework adapters |
resolve.alias | {} | Path alias mapping |
server.port | 5173 | Dev server port |
server.proxy | {} | API proxy (dev only) |
build.outDir | "dist" | Output directory |
build.target | "modules" | Browser target |
build.sourcemap | false | Source maps |
build.rollupOptions | {} | Advanced Rollup config |
envPrefix | "VITE_" | Client-exposed env var prefix |
START
├── React? → @vitejs/plugin-react-swc (faster)
├── Vue? → @vitejs/plugin-vue
├── Svelte? → @sveltejs/vite-plugin-svelte
├── Library? → build.lib + rollupOptions.external
├── Need SSR? → build.ssr + server middleware
├── Need API proxy? → server.proxy
└── DEFAULT → defineConfig + resolve.alias + build defaults
[src1]
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react-swc';
export default defineConfig({
plugins: [react()],
});
[src1]
import path from 'node:path';
export default defineConfig({
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
},
},
});
[src2]
export default defineConfig({
server: {
port: 3000,
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
},
},
},
});
[src3]
export default defineConfig({
build: {
target: 'es2022',
sourcemap: true,
rollupOptions: {
output: {
manualChunks: {
vendor: ['react', 'react-dom'],
},
},
},
},
});
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react-swc';
import tsconfigPaths from 'vite-tsconfig-paths';
export default defineConfig({
plugins: [react(), tsconfigPaths()],
server: {
port: 3000,
strictPort: true,
proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } },
},
build: {
target: 'es2022',
sourcemap: true,
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
if (id.includes('react')) return 'vendor-react';
return 'vendor';
}
},
},
},
},
});
import { defineConfig } from 'vite';
import { resolve } from 'node:path';
import dts from 'vite-plugin-dts';
export default defineConfig({
plugins: [dts({ rollupTypes: true })],
build: {
lib: {
entry: resolve(__dirname, 'src/index.ts'),
name: 'MyLib',
formats: ['es', 'cjs'],
},
rollupOptions: {
external: ['react', 'react-dom'],
},
},
});
// ❌ BAD — proxy only works in dev
export default defineConfig({
server: { proxy: { '/api': 'http://api:8080' } },
// Production: proxy is gone!
// ✅ GOOD — production reads VITE_API_URL
// const API = import.meta.env.VITE_API_URL || '/api';
// ❌ BAD — no type safety
export default { sever: { port: 3000 } }; // Typo not caught!
// ✅ GOOD — typos caught at type-check
import { defineConfig } from 'vite';
export default defineConfig({ server: { port: 3000 } });
# ❌ BAD — bundled into client JS, visible to anyone
VITE_DATABASE_URL=postgresql://user:password@host/db
# ✅ GOOD — secrets stay server-only
VITE_API_URL=https://api.example.com
DATABASE_URL=postgresql://...
server: { strictPort: true } to fail fast. [src2]vite-tsconfig-paths plugin. [src7]*.module.css. [src4]optimizeDeps.include. [src1]manualChunks. [src3]VITE_. [src4]# Check Vite version
npx vite --version
# Start with debug logging
npx vite --debug
# Preview production build
npx vite preview
# Force dependency optimization
npx vite optimize --force
| Version | Status | Breaking Changes | Migration Notes |
|---|---|---|---|
| Vite 6.x | Current | Environment API (experimental) | Most configs work unchanged from v5 |
| Vite 5.x | Maintenance | Rollup 4, Node 18+ | Update Rollup plugins |
| Vite 4.x | EOL | SWC React plugin | Upgrade to v5+ |
| Use When | Don't Use When | Use Instead |
|---|---|---|
| New React/Vue/Svelte apps | Next.js / Nuxt projects | Framework CLI |
| Need fast dev server | Very old browsers (IE11) | webpack 5 |
| Library bundling | Server-only Node.js project | tsc or esbuild |
server.proxy uses http-proxy — complex scenarios may need custom middlewarebuild.target: "esnext" requires all users on very modern browsersworker.format and worker.plugins config