Optimize frontend build performance with Vite's lightning-fast HMR, code splitting, and tree-shaking. Modern build tooling that's replaced Webpack as the developer favorite.
#ViteBuildOptimizationSpecialistSkill##WhatThisSkillEnablesClaudecanoptimizeyourVitebuildconfigurationforproduction-readyperformancewithinstantHotModuleReplacement(HMR),intelligentcodesplitting,andtree-shaking.ViteleveragesnativeESmodulesduringdevelopmentandRollupforoptimizedproductionbuilds,deliveringthefastestdeveloperexperiencewhilegeneratinghighlyoptimizedbundles.Fromconfiguringbuildoptionstodebuggingbundlesize,Claudehandlesthecomplexityofmodernfrontendtooling.##Prerequisites**Required:**-ClaudeProsubscriptionorClaudeCodeCLI-Node.js18+(20+recommended)-npm,pnpm,oryarnpackagemanager-BasicunderstandingofJavaScriptmodules**WhatClaudehandlesautomatically:**-Configuringvite.config.tsforoptimalbuilds-Settingupcodesplittingstrategies-Implementinglazyloadingforroutes/components-Analyzingandoptimizingbundlesize-ConfiguringCSSoptimizationandextraction-Settingupenvironmentvariables-Implementingcachingstrategies-Configuringbuildtargetsforbrowsersupport##HowtoUseThisSkill###ProductionBuildOptimization**Prompt:**"Optimize my Vite config for production with: code splitting by route, lazy loading for heavy components, CSS extraction, source maps, and tree-shaking. Target modern browsers (ES2020)."Claudewill:1.Configurebuild.rollupOptionsforchunking2.Setupmanualchunksforvendors3.EnableCSScodesplitting4.Configuresourcemapgeneration5.Setbuild.targetforES20206.Addtree-shakingoptimizations7.Configureminificationsettings###BundleSizeAnalysis**Prompt:**"My Vite bundle is 2MB. Help me analyze what's taking space and optimize. Use rollup-plugin-visualizer and suggest splitting strategies."Claudewill:1.Installandconfigurebundleanalyzer2.Generatevisualbundlereport3.Identifylargedependencies4.Suggestdynamicimportsforheavylibs5.Configurevendorchunksplitting6.Recommendlighteralternatives7.Setuplazyloadingforroutes###Multi-PageApplicationSetup**Prompt:**"Configure Vite for multi-page app with 3 entry points: landing page, dashboard, admin panel. Each should have separate bundles but share common dependencies."Claudewill:1.Setupbuild.rollupOptions.input2.CreateseparateHTMLentrypoints3.Configuresharedchunkextraction4.SetupindependentCSSbundles5.Implementcommonvendorsplitting6.Addentry-specificoptimizations7.Configuredevserverformulti-page###PluginConfiguration&Optimization**Prompt:**"Set up Vite with React, TypeScript, PWA support, image optimization, and SVG imports. Optimize for fastest dev server startup and HMR."Claudewill:1.Installandconfigure@vitejs/plugin-react2.Addvite-plugin-pwawithprecaching3.Setupvite-imagetoolsforoptimization4.Configurevite-plugin-svgr5.EnableReactFastRefresh6.Optimizedependenciesprebundling7.ConfigureHMRboundaries##TipsforBestResults1.**UseManualChunksWisely**:Splitvendorsbyupdatefrequency.React/Vuerarelychange,butbusinesslogicdoes.Use`manualChunks`toseparatestablefromvolatilecode.2.**LazyLoadHeavyLibraries**:Importchartlibraries,richeditors,orlargeUIcomponentsdynamicallyonlywhenneeded.Vitehandlescodesplittingautomatically.3.**OptimizeDependencies**:Use`optimizeDeps.include`fordependenciesthatslowdowndevserverstartup.Pre-bundleCJSdependenciestoESM.4.**EnvironmentVariables**:Use`import.meta.env`(not`process.env`).Prefixwith`VITE_`toexposetoclientcode.Use`.env.local`forsecrets.5.**SourceMapsinProduction**:Use`hidden-source-map`forerrortrackingwithoutexposingcode.Neveruse`inline-source-map`inproduction.6.**CSSOptimization**:Enable`build.cssCodeSplit`forroute-basedCSS.UsePostCSSforautoprefixerandminification.##CommonWorkflows###LargeReactAppOptimization```"Optimize Vite build for React app with 50+ routes:1. Implement route-based code splitting with React.lazy()2. Split vendor chunks: react/react-dom, UI library, utilities3. Configure dynamic imports for modals, charts, editors4. Add preload hints for critical chunks5. Enable CSS code splitting per route6. Configure build.rollupOptions for optimal chunking7. Add bundle analyzer and aim for <200KB initial load8. Set up Lighthouse CI to track performance"```###MonorepoBuildConfiguration```"Configure Vite in Turborepo monorepo:1. Shared vite.config.base.ts for common config2. App-specific configs extending base3. Shared component library with optimized exports4. Configure path aliases for @workspace packages5. Set up cache strategy for unchanged packages6. Optimize prebundling for internal dependencies7. Configure dev server proxy for backend services8. Add workspace-aware HMR"```###ProgressiveWebAppBuild```"Set up Vite PWA with offline support:1. Install vite-plugin-pwa with Workbox2. Configure service worker precaching strategy3. Add runtime caching for API calls4. Set up offline fallback page5. Generate web manifest with icons6. Configure update notification for new versions7. Optimize caching based on file types8. Add service worker update lifecycle"```###LibraryBuildConfiguration```"Configure Vite for component library build:1. Set build.lib mode with entry point2. Configure external dependencies (React, Vue)3. Generate ESM and UMD bundles4. Add TypeScript declaration generation5. Set up CSS extraction and modules6. Configure tree-shaking for optimal imports7. Add source maps for debugging8. Set up package.json exports field"```##Troubleshooting**Issue:**"Dev server slow to start with large dependencies"**Solution:**Addslowdependenciesto`optimizeDeps.include`array.Use`server.warmup`toprebundlecommonlyusedfiles.Checkforcirculardependencies.Considerusing`optimizeDeps.esbuildOptions.target`toskipunnecessarytransforms.**Issue:**"HMR not working for certain components"**Solution:**Checkcomponentexportsarenamed(notdefault).Ensurenosideeffectsinmodulescope.AddHMRboundarieswith`import.meta.hot.accept()`.Verifyvite-plugin-reactisinstalledforReactFastRefresh.**Issue:**"Production bundle size larger than expected"**Solution:**Runbundleanalyzertoidentifyheavydependencies.Checkforduplicatedependenciesinnode_modules.Usedynamicimportsforheavylibs.Verifytree-shakingwith`build.rollupOptions.treeshake`.Checkforunintentionalglobalimports.**Issue:**"Environment variables not accessible in client"**Solution:**Prefixvariableswith`VITE_`in.envfile.Use`import.meta.env.VITE_VAR_NAME`not`process.env`.Check.envfileisinprojectroot.Restartdevserverafteraddingnewenvvars.**Issue:**"Build fails with 'Cannot find module' errors"**Solution:**Checkpathaliasesinvite.config.tsmatchtsconfig.json.Verifyresolve.aliasconfiguration.Ensureallimportsusecorrectfileextensions.Checkforcase-sensitivefilenamingissues.##LearnMore-[ViteOfficialDocumentation](https://vitejs.dev/)-[ViteGitHubRepository](https://github.com/vitejs/vite)-[RollupPluginDocumentation](https://rollupjs.org/guide/en/#plugin-development)-[VitePluginCollection](https://github.com/vitejs/awesome-vite)-[ViteConf2024Talks](https://viteconf.org/2024/replay)-[VitePerformanceGuide](https://vitejs.dev/guide/performance.html)
Features
Key capabilities and functionality
Instant Hot Module Replacement (HMR) with native ESM
Rollup-powered production builds with tree-shaking
Ask Claude: 'Optimize my Vite config for [your use case]'
Claude generates optimized vite.config.ts
Build with: npm run build
Use Cases
Common scenarios and applications
Optimizing large React/Vue apps with 50+ routes
Building component libraries with ESM/UMD output
Configuring PWAs with offline support
Troubleshooting
Common issues and solutions
Dev server startup slow with large dependencies
Add slow dependencies to optimizeDeps.include. Use server.warmup for commonly used files. Check for circular dependencies. Configure optimizeDeps.esbuildOptions.target appropriately.
HMR not working for specific components
Ensure named exports (not default). Check for side effects in module scope. Add HMR boundaries with import.meta.hot.accept(). Verify plugin installation (vite-plugin-react for React).
Production bundle larger than expected
Use bundle analyzer (rollup-plugin-visualizer) to identify heavy dependencies. Check for duplicates. Implement dynamic imports. Verify tree-shaking configuration. Audit global imports.
Usage Examples
Practical code examples demonstrating common use cases and implementation patterns
Optimized Production Build Config
optimized-production-build-config.ts
typescript
import{defineConfig}from'vite';importreactfrom'@vitejs/plugin-react';import{visualizer}from'rollup-plugin-visualizer';exportdefaultdefineConfig({plugins:[react(),visualizer({open:true,filename:'dist/stats.html'}),],build:{target:'es2020',sourcemap:'hidden',rollupOptions:{output:{manualChunks:(id)=>{// Vendor chunk for React ecosystemif(id.includes('node_modules/react')||id.includes('node_modules/react-dom')){return'vendor-react';}// Separate chunk for UI libraryif(id.includes('node_modules/@mui')||id.includes('node_modules/@emotion')){return'vendor-ui';}// Utilities chunkif(id.includes('node_modules/lodash')||id.includes('node_modules/date-fns')){return'vendor-utils';}},},},cssCodeSplit:true,minify:'terser',terserOptions:{compress:{drop_console:true,drop_debugger:true,},},},optimizeDeps:{include:['react','react-dom'],},});
Multi-Page App Configuration
multi-page-app-configuration.ts
typescript
import{defineConfig}from'vite';import{resolve}from'path';exportdefaultdefineConfig({build:{rollupOptions:{input:{main:resolve(__dirname,'index.html'),dashboard:resolve(__dirname,'dashboard/index.html'),admin:resolve(__dirname,'admin/index.html'),},output:{manualChunks:{// Shared dependencies across all pagesshared:['react','react-dom','react-router-dom'],},},},},server:{open:'/index.html',},});
PWA with Service Worker
pwa-with-service-worker.ts
typescript
import{defineConfig}from'vite';importreactfrom'@vitejs/plugin-react';import{VitePWA}from'vite-plugin-pwa';exportdefaultdefineConfig({plugins:[react(),VitePWA({registerType:'autoUpdate',includeAssets:['favicon.ico','apple-touch-icon.png','masked-icon.svg'],manifest:{name:'My App',short_name:'App',description:'My awesome Progressive Web App',theme_color:'#ffffff',icons:[{src:'pwa-192x192.png',sizes:'192x192',type:'image/png',},{src:'pwa-512x512.png',sizes:'512x512',type:'image/png',},],},workbox:{runtimeCaching:[{urlPattern:/^https:\/\/api\.example\.com\/.*$/,handler:'NetworkFirst',options:{cacheName:'api-cache',expiration:{maxEntries:50,maxAgeSeconds:86400,// 1 day},},},{urlPattern:/\.(?:png|jpg|jpeg|svg|gif)$/,handler:'CacheFirst',options:{cacheName:'images-cache',expiration:{maxEntries:100,maxAgeSeconds:2592000,// 30 days},},},],},}),],});