- Add comprehensive health check system with multiple endpoints - Add Prometheus metrics endpoint - Add production logging configurations (5 strategies) - Add complete deployment documentation suite: * QUICKSTART.md - 30-minute deployment guide * DEPLOYMENT_CHECKLIST.md - Printable verification checklist * DEPLOYMENT_WORKFLOW.md - Complete deployment lifecycle * PRODUCTION_DEPLOYMENT.md - Comprehensive technical reference * production-logging.md - Logging configuration guide * ANSIBLE_DEPLOYMENT.md - Infrastructure as Code automation * README.md - Navigation hub * DEPLOYMENT_SUMMARY.md - Executive summary - Add deployment scripts and automation - Add DEPLOYMENT_PLAN.md - Concrete plan for immediate deployment - Update README with production-ready features All production infrastructure is now complete and ready for deployment.
116 lines
3.6 KiB
JavaScript
116 lines
3.6 KiB
JavaScript
import { defineConfig } from 'vite';
|
|
import { resolve } from 'path';
|
|
import { VitePWA } from 'vite-plugin-pwa';
|
|
import * as fs from 'node:fs';
|
|
|
|
export default defineConfig({
|
|
build: {
|
|
outDir: 'public', // Direct output to public directory
|
|
manifest: '.vite/manifest.json', // Put manifest in .vite subfolder
|
|
emptyOutDir: false, // Don't delete existing public files
|
|
assetsDir: 'assets',
|
|
|
|
// Performance optimizations
|
|
minify: 'terser',
|
|
terserOptions: {
|
|
compress: {
|
|
drop_console: false, // Keep console.log for debugging
|
|
drop_debugger: true
|
|
}
|
|
},
|
|
|
|
// Chunk optimization to prevent excessive fragmentation
|
|
rollupOptions: {
|
|
input: {
|
|
main: resolve(import.meta.dirname, 'resources/js/main.js'),
|
|
admin: resolve(import.meta.dirname, 'resources/css/admin/admin.css')
|
|
},
|
|
output: {
|
|
// Simplified chunking - disable manual chunking to let Vite handle it naturally
|
|
// manualChunks: undefined,
|
|
|
|
// Optimize chunk sizes
|
|
chunkFileNames: 'assets/js/[name]-[hash].js',
|
|
entryFileNames: 'assets/js/[name]-[hash].js',
|
|
assetFileNames: (assetInfo) => {
|
|
const info = assetInfo.name.split('.');
|
|
const ext = info[info.length - 1];
|
|
|
|
if (/\.(png|jpe?g|svg|gif|tiff|bmp|ico)$/i.test(assetInfo.name)) {
|
|
return `assets/images/[name]-[hash].${ext}`;
|
|
}
|
|
|
|
if (/\.css$/i.test(assetInfo.name)) {
|
|
return `assets/css/[name]-[hash].${ext}`;
|
|
}
|
|
|
|
return `assets/[name]-[hash].${ext}`;
|
|
}
|
|
}
|
|
},
|
|
|
|
// Compression and optimization
|
|
reportCompressedSize: true,
|
|
chunkSizeWarningLimit: 1000,
|
|
|
|
// Source maps for production debugging
|
|
sourcemap: 'hidden'
|
|
},
|
|
|
|
plugins: [
|
|
// PWA plugin temporarily disabled due to build issues
|
|
// VitePWA({ ... })
|
|
],
|
|
|
|
// Optimized development server
|
|
server: {
|
|
https: (() => {
|
|
try {
|
|
if (fs.existsSync('./ssl/localhost.pem') && fs.existsSync('./ssl/localhost-key.pem')) {
|
|
return {
|
|
key: fs.readFileSync('./ssl/localhost-key.pem'),
|
|
cert: fs.readFileSync('./ssl/localhost.pem')
|
|
};
|
|
}
|
|
} catch (error) {
|
|
console.warn('SSL certificates not found, falling back to HTTP');
|
|
}
|
|
return false;
|
|
})(),
|
|
host: true,
|
|
port: 3000,
|
|
open: false,
|
|
hmr: {
|
|
overlay: true
|
|
}
|
|
},
|
|
|
|
// CSS optimization
|
|
css: {
|
|
devSourcemap: true,
|
|
preprocessorOptions: {
|
|
scss: {
|
|
additionalData: '@import "resources/css/settings/variables.css";'
|
|
}
|
|
}
|
|
},
|
|
|
|
// Dependency optimization
|
|
optimizeDeps: {
|
|
include: [
|
|
// Pre-bundle known dependencies
|
|
],
|
|
exclude: [
|
|
// Exclude problematic dependencies
|
|
]
|
|
},
|
|
|
|
// Asset handling
|
|
assetsInclude: ['**/*.woff2', '**/*.woff', '**/*.ttf'],
|
|
|
|
// Development environment
|
|
define: {
|
|
__DEV__: JSON.stringify(process.env.NODE_ENV !== 'production')
|
|
}
|
|
});
|