Skip to main content

Vite Build Optimizer Guide

Vite uses Rollup for production builds — blazing fast in dev, highly optimizable in prod. Learn how to analyze bundle composition, configure code splitting, and squeeze maximum performance from your Vite output.

✓ Bundle visualization ✓ Manual chunk config ✓ Pre-compression ✓ Build configuration

Bundle Visualization with rollup-plugin-visualizer

npm install --save-dev rollup-plugin-visualizer
// vite.config.ts
import { defineConfig } from 'vite';
import { visualizer } from 'rollup-plugin-visualizer';

export default defineConfig({
  plugins: [
    visualizer({
      open: true,              // auto-open browser after build
      filename: 'dist/stats.html',
      gzipSize: true,          // show gzip sizes
      brotliSize: true,        // show brotli sizes (most accurate)
      template: 'treemap',     // 'treemap' | 'sunburst' | 'network'
    }),
  ],
});

Production Build Configuration

// vite.config.ts
import { defineConfig, splitVendorChunkPlugin } from 'vite';

export default defineConfig({
  plugins: [splitVendorChunkPlugin()],  // auto vendor splitting
  build: {
    target: 'es2020',          // modern browsers only
    minify: 'esbuild',         // fastest; use 'terser' for max compression
    cssCodeSplit: true,        // separate CSS per chunk
    sourcemap: false,          // disable in prod for smaller output
    chunkSizeWarningLimit: 500, // warn if chunk > 500KB

    rollupOptions: {
      output: {
        // Manual vendor chunk splitting
        manualChunks: {
          'react-vendor': ['react', 'react-dom'],
          'router': ['react-router-dom'],
          'query': ['@tanstack/react-query'],
          'ui': ['@radix-ui/react-dialog', '@radix-ui/react-dropdown-menu'],
        },
        // Asset file naming
        chunkFileNames: 'assets/js/[name]-[hash].js',
        entryFileNames: 'assets/js/[name]-[hash].js',
        assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',
      },
    },
  },
});

Dynamic Imports for Code Splitting

// React Router v6 with lazy loading
import { lazy, Suspense } from 'react';
import { createBrowserRouter } from 'react-router-dom';

const Dashboard = lazy(() => import('./pages/Dashboard'));
const Settings  = lazy(() => import('./pages/Settings'));
const Admin     = lazy(() => import('./pages/Admin'));

const router = createBrowserRouter([
  {
    path: '/dashboard',
    element: (
      <Suspense fallback={<div>Loading...</div>}>
        <Dashboard />
      </Suspense>
    ),
  },
]);

// Vue Router lazy loading
const routes = [
  {
    path: '/dashboard',
    component: () => import('./pages/Dashboard.vue'),
  },
];

Pre-Compression at Build Time

npm install --save-dev vite-plugin-compression
// vite.config.ts
import viteCompression from 'vite-plugin-compression';

export default defineConfig({
  plugins: [
    // Generate .gz files
    viteCompression({ algorithm: 'gzip', ext: '.gz' }),
    // Generate .br files (Brotli — 10–15% smaller than gzip)
    viteCompression({ algorithm: 'brotliCompress', ext: '.br' }),
  ],
});

// Configure nginx to serve pre-compressed files:
// gzip_static on;
// brotli_static on;  (requires ngx_brotli module)

Build Performance Benchmarks

Optimization Impact Effort
Route-level code splittingHigh — 50–80% initial JS reductionLow
Manual vendor chunksHigh — better cachingLow
Brotli pre-compressionMedium — 10–15% smallerLow
Terser vs esbuild minifyLow — 1–3% smallerLow
Tree-shake heavy depsHigh — depends on depsMedium

Frequently Asked Questions

How do I analyze my Vite bundle size?▼

Install `rollup-plugin-visualizer`: `npm install --save-dev rollup-plugin-visualizer`. Add it to vite.config.ts plugins array: `visualizer({ open: true, gzipSize: true, brotliSize: true })`. Run `vite build` and a stats.html file opens in your browser showing a treemap of bundle composition by gzip and brotli size.

What is the difference between Vite's dev server and production build?▼

In dev mode, Vite serves files as native ES modules — no bundling, instant HMR. In production, Vite uses Rollup under the hood to bundle, tree-shake, and minify. Dev performance does not predict production bundle size. Always run `vite build` to check production output. Use `vite preview` to serve the production build locally and verify behavior.

How do I set up code splitting in Vite?▼

Vite handles code splitting automatically for dynamic imports. Use `() => import('./Component')` for lazy-loaded routes. Configure `manualChunks` in `build.rollupOptions` to force specific packages into their own chunks. For React apps, use `React.lazy()` + `<Suspense>` for component-level splitting. Vite also automatically splits CSS imported by JS into separate chunk files.

How do I configure Vite for maximum production performance?▼

Key optimizations: (1) `build.minify: 'esbuild'` (default, fastest) or `'terser'` for maximum compression. (2) `build.cssCodeSplit: true` (default) — separate CSS per chunk. (3) `build.rollupOptions.output.manualChunks` — vendor splitting. (4) Enable Brotli/gzip at the server level (Vite doesn't compress, your web server or CDN does). (5) Use `vite-plugin-compression` to pre-compress assets at build time.

Share this tool: X / Twitter LinkedIn
✓ 60,000+ developers use DevPlaybook ★★★★★ 4.8 / 5 on Gumroad ✓ MIT licensed · Instant download ✓ No login required

Related Products

on Gumroad

You Might Also Need

More Free Tools

Related Articles

Enjoying this tool? Get more like it.

Weekly developer tool guides, productivity playbooks & AI tricks. Free. No spam.

DevPlaybook Pro 7 days free

Unlock AI-Powered Dev Tools

  • ⚡ AI Code Review, Doc Generator & SQL Builder
  • ⚡ All premium templates & early access
  • ⚡ Member discounts on Gumroad products
Start Free Trial →

$9/mo after trial · Cancel anytime

Want the full toolkit?

Get DevPlaybook Pro

Every template, guide, boilerplate, and automation script in one bundle. 13 premium products — grab them all at once and save big.

$79
$241 separately Save $162 (67% off)
Get DevPlaybook Pro — $79 →

MIT licensed · Instant download · No subscription

See what's included → Browse all deals →