vite
Assists with configuring and using Vite as a frontend build tool for modern web applications. Use when setting up dev servers, optimizing production builds, configuring plugins, migrating from Webpack
SKILL.mdskills/vite/SKILL.md
GitHubVite
Overview
Vite is a next-generation frontend build tool providing instant dev server startup via native ES modules and production builds bundled by Rolldown (since Vite 8; earlier versions used Rollup and esbuild). It supports React, Vue, Svelte, and vanilla TypeScript projects with advanced bundling strategies, plugin extensibility, and library mode.
Instructions
- To start a project run
npm create vite@latest(ornpm create vite@latest storefront -- --template react-ts). Vite 8 needs Node.js 20.19+ or 22.12+. - When setting up a project, create
vite.config.tswith the appropriate framework plugin (@vitejs/plugin-react,@vitejs/plugin-vue), configureresolve.aliaswith@mapping tosrc/, and set environment variables withVITE_prefix in.env,.env.localor.env.[mode]files (restart the dev server after editing them). Addvite-env.d.tswith anImportMetaEnvinterface for typed variables. - When configuring the dev server, set up API proxying with
server.proxy, enable HTTPS with@vitejs/plugin-basic-ssl, and useserver.watchpolling for containers or VMs. - When optimizing builds, split vendor code with
build.rolldownOptions.output.codeSplitting(Vite 8; the object form ofmanualChunkswas removed and the function form is deprecated; on Vite 7 and older usebuild.rollupOptions.output.manualChunks). CSS code splitting is on by default.build.targetdefaults to'baseline-widely-available'(Chrome 111, Edge 111, Firefox 114, Safari 16.4). - When creating plugins, use the Rollup-compatible plugin API with
resolveId,load, andtransformhooks, and leverage virtual modules with thevirtual:prefix. - When building libraries, configure
build.libwith entry point and output formats (es, cjs, umd), externalize peer dependencies, and usevite-plugin-dtsfor TypeScript declaration generation. Default formats areesandumdfor one entry,esandcjsfor several; AMD and SystemJS output was removed in Vite 8. - When upgrading to Vite 8: rename
build.rollupOptionstobuild.rolldownOptions, expect Oxc instead of esbuild for transforms and minification (esbuildoptions are auto-converted tooxcbut deprecated), and Lightning CSS for CSS minification. If a default import from a CommonJS package changes behavior, setlegacy.inconsistentCjsInterop: truetemporarily. - When migrating from Webpack, replace
webpack.config.jswithvite.config.ts, swap loaders for Vite plugins, and updateREACT_APP_*env vars toVITE_*. Create React App is no longer maintained, so this is the usual path off it. - When integrating testing, use Vitest, which shares the Vite config (recent Vitest versions need Node 22.12+).
A typical dev setup with an alias and an API proxy:
// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { fileURLToPath, URL } from 'node:url'
export default defineConfig({
plugins: [react()],
resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) } },
server: { proxy: { '/api': 'http://localhost:3000' } },
})
Typed environment variables (src/vite-env.d.ts), read with import.meta.env.VITE_API_URL:
interface ImportMetaEnv {
readonly VITE_API_URL: string
}
interface ImportMeta {
readonly env: ImportMetaEnv
}
Examples
Example 1: Migrate a Create React App project to Vite
User request: "Convert my CRA project to use Vite instead"
Actions:
- Install Vite and
@vitejs/plugin-react, remove react-scripts - Create
vite.config.tswith React plugin and path aliases - Rename
REACT_APP_*environment variables toVITE_* - Update
index.htmlto reference the entry module directly
Output: A Vite-powered React project with faster dev startup and HMR.
Example 2: Configure optimized production build
User request: "Set up Vite build with vendor chunk splitting and source maps for Sentry"
Actions:
- Configure
build.rolldownOptions.output.codeSplittingwith a group{ test: /node_modules/, name: 'vendor' } - Enable
build.sourcemapfor error monitoring integration - Set
build.targetappropriate to browser support requirements - Add
build.assetsInlineLimittuning for small asset optimization
Config:
// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()],
build: {
sourcemap: true,
rolldownOptions: {
output: { codeSplitting: { groups: [{ test: /node_modules/, name: 'vendor' }] } },
},
},
})
Output: npm run build writes dist/assets/vendor-3f9a1c2b.js plus .map files. An optimized production build configuration with proper chunk splitting and debugging support.
Guidelines
- Always use
import.meta.env.VITE_*for client-exposed env vars, neverprocess.env.VITE_*values end up in the browser bundle: never put API keys in them. - Configure
resolve.aliaswith@prefix mapping tosrc/for clean imports. - Split vendor chunks manually when default chunking produces too many small files.
- Use
build.target: "esnext"for modern-only apps,@vitejs/plugin-legacyfor browsers older than the default target. - Native decorators are not supported by the Vite 8 transform yet; use a Babel or SWC plugin.
build.sourcemapis off by default; enable it for error monitoring tools, and do not serve the maps publicly if the source is private.- Keep
vite.config.tsclean by extracting complex plugin configs into separate files. - Use
optimizeDeps.includeto pre-bundle problematic dependencies that break during dev.