Loading...
Loading...
Configure and optimize Vite 7 for React projects. Covers build tooling, dev server, plugins, HMR, chunk splitting, Environment API, and Rolldown integration. Use when setting up Vite, configuring builds, optimizing bundles, managing plugins, or troubleshooting dev server. Triggers on vite, vite config, vite plugin, HMR, dev server, build optimization, chunk splitting, rolldown, vite proxy, environment api, rolldown-vite.
npx skill4agent add tenequm/skills vitebaseline-widely-availablerolldown-vite@vitejs/plugin-react@tailwindcss/vite@tanstack/router-plugin@cloudflare/vite-plugin@tanstack/react-start@vitejs/plugin-reactplugins: [
tanstackStart(), // or tanstackRouter() for SPA
tailwindcss(),
react(), // ALWAYS last among framework plugins
]vite.config.tsimportexportrequire()require(esm)tailwind.config.jstailwind.config.jstailwind.config.ts@tailwindcss/vite@theme@utility@pluginVITE_import.meta.envImportMetaEnvvite-env.d.tsbuild.rollupOptions.output.manualChunksimport { defineConfig } from 'vite'
import { tanstackStart } from '@tanstack/react-start/plugin/vite'
import { cloudflare } from '@cloudflare/vite-plugin'
import tailwindcss from '@tailwindcss/vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [
tanstackStart(),
cloudflare(),
tailwindcss(),
react(),
],
resolve: {
alias: {
'@': new URL('./src', import.meta.url).pathname,
},
},
})import { defineConfig } from 'vite'
import { tanstackRouter } from '@tanstack/router-plugin/vite'
import tailwindcss from '@tailwindcss/vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [
tanstackRouter({ autoCodeSplitting: true }),
tailwindcss(),
react(),
],
resolve: {
alias: {
'@': new URL('./src', import.meta.url).pathname,
},
},
})react({
babel: {
plugins: [['babel-plugin-react-compiler', {}]],
},
})pnpm add -D babel-plugin-react-compileruseMemouseCallbackimport.meta.url__dirnameresolve: {
alias: {
'@': new URL('./src', import.meta.url).pathname,
},
}tsconfig.json"paths": { "@/*": ["./src/*"] }.env.env.local.env.[mode].env.[mode].localVITE_import.meta.env.MODE.DEV.PROD.SSR.BASE_URLsrc/vite-env.d.tsinterface ImportMetaEnv {
readonly VITE_API_URL: string
}
interface ImportMeta {
readonly env: ImportMetaEnv
}import react from '@vitejs/plugin-react'
react() // zero-config default
react({ fastRefresh: false }) // disable for debugging HMR issuespostcss.config.jsimport tailwindcss from '@tailwindcss/vite'
tailwindcss() // zero-config, reads @theme from CSSreact()import { tanstackRouter } from '@tanstack/router-plugin/vite'
tanstackRouter({ autoCodeSplitting: true })import { tanstackStart } from '@tanstack/react-start/plugin/vite'
tanstackStart() // default SSR
tanstackStart({ spa: { enabled: true } }) // SPA mode (no SSR)workerdimport { cloudflare } from '@cloudflare/vite-plugin'
cloudflare() // reads wrangler.jsonc by default
// Programmatic config (no wrangler file needed)
cloudflare({
config: {
name: 'my-worker',
compatibility_flags: ['nodejs_compat'],
},
})server: {
proxy: {
'/api': {
target: 'http://localhost:8787',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''),
},
'/ws': { target: 'ws://localhost:8787', ws: true },
},
}| Symptom | Fix |
|---|---|
| Full reload instead of HMR | Check |
| HMR not connecting | Set |
| Stale state after edit | Component must export a single component |
| CSS not updating | Ensure |
server: {
hmr: { protocol: 'ws', host: 'localhost', port: 5173, clientPort: 443 },
}server: {
warmup: {
clientFiles: ['./src/components/*.tsx', './src/routes/__root.tsx'],
},
}baseline-widely-availablebuild.target: 'es2020'['chrome90', 'safari14']build: {
rollupOptions: {
output: {
manualChunks: {
'react-vendor': ['react', 'react-dom'],
'tanstack': ['@tanstack/react-router', '@tanstack/react-query'],
},
},
},
}manualChunks(id) {
if (id.includes('node_modules')) {
if (id.includes('react')) return 'react-vendor'
if (id.includes('@tanstack')) return 'tanstack'
return 'vendor'
}
}pnpm add -D rollup-plugin-visualizerimport { visualizer } from 'rollup-plugin-visualizer'
// Add to plugins array
visualizer({ filename: 'stats.html', open: true, gzipSize: true })rolldown-viterolldown-vitepackage.jsonviterolldown-vite{
"devDependencies": {
"vite": "npm:rolldown-vite@latest"
}
}{
"pnpm": {
"overrides": {
"vite": "npm:rolldown-vite@latest"
}
}
}pnpm installminify: 'esbuild'rolldown-vitebuildApp@cloudflare/vite-pluginworkerdexport default defineConfig({
builder: {
async buildApp(builder) {
await builder.build(builder.environments.client)
await builder.build(builder.environments.server)
},
},
}){
name: 'my-framework',
buildApp: async (builder) => {
const environments = Object.values(builder.environments)
return Promise.all(
environments.map((env) => builder.build(env))
)
},
}export default defineConfig({
environments: {
client: {
build: { outDir: 'dist/client' },
},
server: {
build: { outDir: 'dist/server' },
},
},
})@cloudflare/vite-plugin@tanstack/react-startcloudflare()wrangler.jsonc// wrangler.jsonc
{
"name": "my-app",
"compatibility_date": "2025-01-01",
"compatibility_flags": ["nodejs_compat"],
"main": "./dist/server/index.js",
"assets": { "directory": "./dist/client" }
}pnpm vite build && pnpm wrangler deploydist/tanstackStart({ prerender: { enabled: true, crawlLinks: true } })react()staleTimeserver.warmupreact@tanstack/*transition-allimport.meta.urlrollup-plugin-visualizerVITE_build.sourcemap'hidden'