Files
bakery-ia/frontend/vite.config.ts
Claude 54ceaac0e4 fix: Prevent Vite file watcher from crashing in Kubernetes
Fixed the crash loop issue caused by Vite trying to watch too many
files (including node_modules) in Kubernetes environment.

Problem:
- Vite dev server was starting successfully
- But then container would crash with "too many open files"
- This caused infinite restart loop (CrashLoopBackOff)
- Error: "failed to create fsnotify watcher: too many open files"

Root Cause:
- Vite's file watcher was monitoring ALL files including node_modules
- In Kubernetes, this exceeded inotify limits
- Each restart would hit the same limit

Solution:
- Added 'ignored' patterns to vite.config.ts server.watch
- Excluded: node_modules, dist, .git, coverage, .cache
- Vite will only watch actual source files in src/
- Dramatically reduces number of watched files

Changes:
- frontend/vite.config.ts: Added server.watch.ignored array

Benefits:
- Container stays running without crashes
- Faster hot reload (fewer files to watch)
- Lower resource usage
- Dev server remains stable in Kubernetes

Testing:
- Tilt will auto-rebuild container with new config
- Container should start and stay running
- Vite dev server will be accessible
- Hot reload will still work for src/ files
2025-11-07 21:08:52 +00:00

65 lines
2.1 KiB
TypeScript

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';
export default defineConfig({
plugins: [
react(),
// PWA plugin temporarily disabled to avoid service worker conflicts
// VitePWA can be re-enabled later for production PWA features
],
resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
'@components': path.resolve(__dirname, './src/components'),
'@pages': path.resolve(__dirname, './src/pages'),
'@hooks': path.resolve(__dirname, './src/hooks'),
'@stores': path.resolve(__dirname, './src/stores'),
'@services': path.resolve(__dirname, './src/services'),
'@utils': path.resolve(__dirname, './src/utils'),
'@types': path.resolve(__dirname, './src/types'),
},
},
server: {
host: '0.0.0.0', // Important for Docker
port: 3000,
watch: {
usePolling: true, // Important for Docker file watching
// Ignore these directories to prevent "too many open files" error in Kubernetes
ignored: [
'**/node_modules/**',
'**/dist/**',
'**/.git/**',
'**/coverage/**',
'**/.cache/**',
],
},
proxy: {
'/api': {
target: process.env.VITE_API_URL !== undefined
? (process.env.VITE_API_URL || '') // Use value or empty string
: (process.env.NODE_ENV === 'development' && process.env.KUBERNETES_SERVICE_HOST
? 'http://gateway-service:8000' // Kubernetes internal service
: 'http://localhost:8000'), // Local development
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''),
},
},
},
build: {
outDir: 'dist',
sourcemap: true,
rollupOptions: {
external: ['/runtime-config.js'], // Externalize runtime config to avoid bundling
output: {
manualChunks: {
vendor: ['react', 'react-dom', 'react-router-dom'],
ui: ['@radix-ui/react-dialog', '@radix-ui/react-dropdown-menu'],
charts: ['recharts'],
forms: ['react-hook-form', 'zod'],
},
},
},
},
});