Vite Plugins mit Claude Code: Build-Optimierung 2026
Vite ist der schnellste Build-Bundler — aber seine wahre Stärke liegt im Plugin-Ökosystem. Claude Code kennt die Plugin-API in- und auswendig: eigene Plugins schreiben, Virtual Modules, Code-Transformation, Build-Analyse und optimierte Production-Builds.
Essential Vite Plugins für jedes Projekt
PluginsDas Standard-Plugin-Set
# Prompt: "Konfiguriere Vite optimal für ein React TypeScript SaaS-Projekt"
npm install -D \
@vitejs/plugin-react # React Fast Refresh
vite-plugin-checker # TypeScript-Fehler im Terminal
vite-tsconfig-paths # TypeScript Path Aliases (@/)
vite-plugin-pwa # Progressive Web App
rollup-plugin-visualizer # Bundle-Analyse
vite-plugin-compression # Brotli/Gzip Pre-Compression
// vite.config.ts — Optimale Produktions-Konfiguration
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import checker from 'vite-plugin-checker';
import tsconfigPaths from 'vite-tsconfig-paths';
import { visualizer } from 'rollup-plugin-visualizer';
import compression from 'vite-plugin-compression';
export default defineConfig(({ mode }) => ({
plugins: [
react(),
tsconfigPaths(),
checker({ typescript: true }),
compression({ algorithm: 'brotliCompress' }),
mode === 'analyze' && visualizer({
open: true,
filename: 'dist/stats.html',
gzipSize: true,
}),
],
build: {
rollupOptions: {
output: {
// Manuelles Code-Splitting für besseres Caching:
manualChunks: {
vendor: ['react', 'react-dom'],
router: ['react-router-dom'],
query: ['@tanstack/react-query'],
ui: ['@radix-ui/react-dialog', '@radix-ui/react-dropdown-menu'],
},
},
},
chunkSizeWarningLimit: 1000,
sourcemap: mode !== 'production',
},
server: {
proxy: {
'/api': { target: 'http://localhost:3001', changeOrigin: true },
},
},
}));
Eigenes Vite Plugin schreiben
Custom PluginPlugin-API: Hooks und Lifecycle
// Prompt: "Schreibe ein Vite Plugin das Build-Infos ins Bundle injiziert"
import type { Plugin } from 'vite';
// Plugin-Struktur:
function buildInfoPlugin(): Plugin {
return {
name: 'build-info', // Plugin-Name (für Fehler-Meldungen)
// config: Konfiguration modifizieren:
config(config, { mode }) {
config.define = {
...config.define,
__BUILD_MODE__: JSON.stringify(mode),
};
},
// configResolved: Finale Konfiguration lesen:
configResolved(config) {
console.log(`Build für: ${config.mode}`);
},
// buildStart: Wird einmal zu Beginn aufgerufen:
async buildStart() {
const buildInfo = {
timestamp: new Date().toISOString(),
version: process.env.npm_package_version,
commit: await getGitCommit(),
};
// In Virtual Module für Import bereitstellen:
this.emitFile({
type: 'asset',
fileName: 'build-info.json',
source: JSON.stringify(buildInfo, null, 2),
});
},
// transform: Code-Transformation pro Datei:
transform(code, id) {
if (!id.endsWith('.ts') && !id.endsWith('.tsx')) return;
// Code modifizieren (z.B. debug-Statements entfernen):
if (process.env.NODE_ENV === 'production') {
code = code.replace(/console\.debug\([^)]*\);?/g, '');
}
return { code };
},
// generateBundle: Zugriff auf alle generierten Chunks:
generateBundle(_, bundle) {
const totalSize = Object.values(bundle)
.filter(chunk => chunk.type === 'chunk')
.reduce((sum, chunk) => sum + (chunk as any).code.length, 0);
console.log(`Total bundle size: ${(totalSize / 1024).toFixed(2)}kb`);
},
};
}
Virtual Modules
VirtualSynthetische Module zur Laufzeit
// Prompt: "Virtual Module für dynamisch generierte Route-Liste"
import { glob } from 'glob';
const VIRTUAL_ID = 'virtual:routes';
const RESOLVED_ID = '\0virtual:routes'; // \0 = Vite-Konvention
function routesPlugin(): Plugin {
return {
name: 'virtual-routes',
resolveId(id) {
if (id === VIRTUAL_ID) return RESOLVED_ID;
},
async load(id) {
if (id !== RESOLVED_ID) return;
// Pages-Verzeichnis scannen und Route-Objekte generieren:
const pages = await glob('src/pages/**/*.tsx');
const routes = pages.map(page => {
const path = page
.replace('src/pages', '')
.replace('.tsx', '')
.replace('/index', '/');
return { path, component: page };
});
// Generierter Code als String:
return `
import { lazy } from 'react';
export const routes = [
${routes.map(r => `{
path: "${r.path}",
component: lazy(() => import("/${r.component}"))
}`).join(',')}
];
`;
},
};
}
// Nutzung in der App:
import { routes } from 'virtual:routes';
// TypeScript-Typen für Virtual Modules (vite-env.d.ts):
// declare module 'virtual:routes' { export const routes: Route[]; }
Virtual Module Use Cases: Auto-generierte Route-Listen, Icon-Sprites aus SVG-Ordner, i18n-Strings aus JSON-Dateien, Environment-Variablen zur Compile-Zeit. Claude Code schreibt solche Plugins auf Prompt — inklusive TypeScript-Deklarationen.
Bundle-Analyse und Optimierung
# Prompt: "Analysiere unseren Production-Build und identifiziere große Dependencies"
# Bundle analysieren:
npx vite build --mode analyze
# → Öffnet interaktives Treemap in Browser
# Häufige Probleme die Claude Code findet:
# 1. moment.js (230kb) → date-fns tree-shaken (2-10kb)
# 2. lodash (70kb) → lodash-es tree-shaken ODER native JS
# 3. Icons: lucide-react ALLE importiert statt einzeln
# SCHLECHT: import * as Icons from 'lucide-react'
# GUT: import { Search, User } from 'lucide-react'
# Dynamic Import für große Komponenten:
const RichEditor = lazy(() => import('./RichEditor'));
const PDFViewer = lazy(() => import('./PDFViewer'));
# Preload für kritische Chunks:
// vite.config.ts:
modulePreload: {
polyfill: true,
resolveDependencies: (url, deps) => deps.filter(d => d.includes('vendor')),
}
Build-Tooling-Modul im Kurs
Im Claude Code Mastery Kurs: vollständiges Vite-Modul mit Plugin-Entwicklung, Virtual Modules, Code-Transformation, Bundle-Analyse und Production-Optimierung — inkl. eigenes Starter-Plugin-Template.
14 Tage kostenlos testen →