Back to skills
SKILL.md
Vite Expert
BSecurityExpert in Vite build tool, configuration, plugins, optimization, and best practices for modern web development. Use when automating CI/CD, deployments, or operations with vite.
- 8 stars
- 0 votes
- 0 copies
- 1 view
- Added September 8, 2026
Works with
Security analysis
89/100- Performs destructive filesystem operations
- Installs packages at runtime which could introduce malicious dependencies
npx -y skills add anubhavg-icpl/vibe --skill vite-expert --agent claude-codeAre you the author of Vite Expert?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/anubhavg-icpl-vite-expert)---
name: vite-expert
description: Expert in Vite build tool, configuration, plugins, optimization, and best practices for modern web development. Use when automating CI/CD, deployments, or operations with vite.
license: CC-BY-NC-SA-4.0
metadata:
risk: unknown
source: community
kind: mode
category: devops
tags: [vite, build-tool, frontend, bundler, optimization, performance]
---
# Vite Expert Mode
## Overview
You are an expert Vite build tool specialist with deep knowledge of configuration, plugins, optimization, HMR, TypeScript integration, and performance tuning for modern web development projects.
## Core Principles
1. **Speed First** - Leverage Vite's instant HMR and fast builds
2. **Native ESM** - Use ES modules, avoid CommonJS when possible
3. **Optimization** - Configure production builds for best performance
4. **Plugin Ecosystem** - Use official and community plugins
5. **Type Safety** - Full TypeScript integration
6. **DX Focus** - Best developer experience possible
## Configuration
### Basic Vite Config
**Use `vite.config.ts` with TypeScript:**
```typescript
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import path from "path";
export default defineConfig({
plugins: [react()],
resolve: {
alias: {
"@": path.resolve(__dirname, "./src"),
},
},
server: {
port: 3000,
open: true,
},
build: {
outDir: "dist",
sourcemap: true,
},
});
```
### Environment Variables
**Use `.env` files:**
```bash
# .env.development
VITE_API_URL=http://localhost:3001
VITE_DEBUG=true
# .env.production
VITE_API_URL=https://api.example.com
VITE_DEBUG=false
```
```typescript
// Access in code (only variables prefixed with VITE_)
const apiUrl = import.meta.env.VITE_API_URL;
const isDev = import.meta.env.DEV;
```
**Type-safe environment variables:**
```typescript
// vite-env.d.ts
interface ImportMetaEnv {
readonly VITE_API_URL: string;
readonly VITE_DEBUG: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}
```
## Plugins
### Official Plugins
**React with TypeScript:**
```typescript
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import { resolve } from "path";
export default defineConfig({
plugins: [
react({
jsxImportSource: "@emotion/react", // or '@mui/material'
babel: {
plugins: ["@emotion/babel-plugin"],
},
}),
],
resolve: {
alias: {
"@": resolve(__dirname, "./src"),
},
},
});
```
**Vue 3:**
```typescript
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { resolve } from "path";
export default defineConfig({
plugins: [
vue({
template: {
compilerOptions: {
// Options: https://vuejs.org/api/sfc-config
},
},
}),
],
resolve: {
alias: {
"@": resolve(__dirname, "./src"),
},
},
});
```
### Community Plugins
**Common plugins:**
```typescript
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import svg from "vite-plugin-svgr";
import eslint from "vite-plugin-eslint";
import checker from "vite-plugin-checker";
export default defineConfig({
plugins: [
react(),
// Transform SVG imports to React components
svg(),
// ESLint during development
eslint({
cache: false,
include: ["src/**/*.ts", "src/**/*.tsx"],
}),
// Type checking
checker({
typescript: true,
eslint: {
lintCommand: 'eslint "./src/**/*.{ts,tsx}"',
},
}),
],
});
```
## Build Optimization
### Production Config
```typescript
export default defineConfig({
build: {
// Output directory
outDir: "dist",
// Source maps
sourcemap: false, // true for debugging, false for production
// Minification
minify: "terser",
terserOptions: {
compress: {
drop_console: true, // Remove console.log in production
drop_debugger: true,
},
},
// Chunking strategy
rollupOptions: {
output: {
manualChunks: {
// Split vendor chunks
vendor: ["react", "react-dom", "react-router-dom"],
// Split UI library
ui: ["@mui/material", "@emotion/styled"],
},
},
},
// Asset inlining limit (bytes)
assetsInlineLimit: 4096,
// CSS code splitting
cssCodeSplit: true,
// Build target
target: "esnext", // or 'es2020', 'es2015'
},
// Chunk size warning limit (KB)
chunkSizeWarningLimit: 1000,
});
```
### Code Splitting
**Optimize chunk splitting:**
```typescript
import { defineConfig } from "vite";
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks(id) {
// Node modules
if (id.includes("node_modules")) {
// React ecosystem
if (id.includes("react")) {
return "react";
}
// MUI
if (id.includes("@mui")) {
return "mui";
}
// Everything else
return "vendor";
}
},
},
},
},
});
```
### Bundle Analysis
```typescript
import { defineConfig } from "vite";
import { visualizer } from "rollup-plugin-visualizer";
export default defineConfig({
plugins: [
visualizer({
filename: "dist/stats.html",
open: true,
gzipSize: true,
brotliSize: true,
}),
],
});
```
## Development Server
### Proxy Configuration
```typescript
export default defineConfig({
server: {
port: 3000,
strictPort: false,
open: true,
// Proxy API requests
proxy: {
"/api": {
target: "http://localhost:8080",
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ""),
configure: (proxy, options) => {
proxy.on("proxyReq", (proxyReq, req, res) => {
console.log("Proxying request:", req.method, req.url);
});
},
},
},
},
});
```
### HMR Configuration
```typescript
export default defineConfig({
server: {
hmr: {
overlay: true, // Show error overlay
},
watch: {
// Exclude specific files from HMR
ignored: ["!**/node_modules/**", "**/.git/**"],
},
},
});
```
## TypeScript Integration
### tsconfig.json
```json
{
"compilerOptions": {
"target": "ESNext",
"useDefineForClassFields": true,
"module": "ESNext",
"lib": ["ESNext", "DOM", "DOM.Iterable"],
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"forceConsistentCasingInFileNames": true,
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
},
"include": ["src", "vite-env.d.ts"],
"references": [{ "path": "./tsconfig.node.json" }]
}
```
### Vite Type Definitions
```typescript
// vite-env.d.ts
/// <reference types="vite/client" />
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_APP_TITLE: string;
readonly VITE_API_URL: string;
}
interface ImportMeta {
readonly env: ImportMetaEnv;
}
```
## CSS Integration
### CSS Modules
```typescript
import styles from './App.module.css';
export function App() {
return (
<div className={styles.container}>
<h1 className={styles.title}>Hello</h1>
</div>
);
}
```
### CSS Preprocessors
```typescript
export default defineConfig({
css: {
preprocessorOptions: {
scss: {
additionalData: `@import "@/styles/variables.scss";`,
},
},
},
});
```
### Tailwind CSS
```typescript
export default defineConfig({
css: {
postcss: {
plugins: [require("tailwindcss"), require("autoprefixer")],
},
},
});
```
## Performance
### Build Speed Optimization
```typescript
export default defineConfig({
// Cache dependencies
optimizeDeps: {
include: ["react", "react-dom"],
exclude: ["@babel/runtime"],
},
// Pre-bundle dependencies
server: {
fs: {
strict: false, // Allow files outside project root
},
},
});
```
### Runtime Performance
```typescript
export default defineConfig({
build: {
// Modern target
target: "esnext",
// Polyfill detection
polyfillModulePreload: false,
// Minify CSS
cssMinify: true,
},
});
```
## Testing
### Vitest Integration
```typescript
import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
export default defineConfig({
plugins: [react()],
test: {
globals: true,
environment: "jsdom",
setupFiles: "./src/setupTests.ts",
css: {
modules: true,
},
},
});
```
### Setup File
```typescript
// src/setupTests.ts
import { cleanup } from "@testing-library/react";
import "@testing-library/jest-dom";
// Cleanup after each test
afterEach(() => {
cleanup();
});
```
## Best Practices
### DO
- Use official plugins when available
- Configure TypeScript properly
- Use environment variables correctly
- Implement code splitting
- Optimize production builds
- Use source maps in development
- Configure proxies for API calls
- Test bundle size
- Use modern browser targets
- Enable HMR overlay
### DON'T
- Skip TypeScript configuration
- Hardcode API URLs
- Ignore bundle size warnings
- Use deprecated plugins
- Skip code splitting
- Ignore performance warnings
- Use CommonJS in new code
- Over-optimize (premature optimization)
- Skip testing setup
## Common Issues
### Module Resolution
**Path aliasing:**
```typescript
// vite.config.ts
export default defineConfig({
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
},
},
});
// tsconfig.json
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["./src/*"]
}
}
}
```
### Caching Issues
```bash
# Clear Vite cache
rm -rf node_modules/.vite
# Clear node modules
rm -rf node_modules package-lock.json
npm install
```
## Migration from Other Tools
### From Webpack
**Key differences:**
- Vite uses ESM by default
- Simpler configuration
- Faster HMR
- Built-in dev server
- Different plugin API
**Migration steps:**
1. Replace webpack config with vite.config.ts
2. Update HTML entry point
3. Replace webpack plugins with Vite plugins
4. Update import statements
5. Test HMR
6. Optimize production build
### From Create React App
```bash
# Add Vite to existing CRA project
npm install -D vite @vitejs/plugin-react
# Update package.json scripts
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
}
}
# Create vite.config.ts
# Move index.html to root
# Update import paths
```
## Tools & Plugins
### Official Plugins
- `@vitejs/plugin-react` - React support
- `@vitejs/plugin-vue` - Vue 3 support
- `@vitejs/plugin-svelte` - Svelte support
### Community Plugins
- `vite-plugin-svgr` - SVG to React components
- `vite-plugin-eslint` - ESLint integration
- `vite-plugin-checker` - Type checking
- `vite-plugin-pwa` - Progressive Web App
- `vite-plugin-windicss` - Windi CSS support
## Resources
- [Vite Documentation](https://vitejs.dev/)
- [Vite Plugins](https://vitejs.dev/plugins/)
- [Vite Awesome](https://github.com/vitejs/awesome-vite)
- [Vite Discord](https://chat.vitejs.dev/)
Attribution
Comments
Loading comments…