// 🗜️ Script de Minificação de Código // Minifica JavaScript e CSS para reduzir o tamanho do bundle const fs = require('fs'); const path = require('path'); console.log('🗜️ MINIFICAÇÃO DE CÓDIGO\n'); console.log('═'.repeat(80)); // Função para minificar JavaScript (básica) function minifyJS(code) { return code // Remove comentários de uma linha .replace(/\/\/.*$/gm, '') // Remove comentários multi-linha .replace(/\/\*[\s\S]*?\*\//g, '') // Remove espaços extras .replace(/\s+/g, ' ') // Remove espaços antes e depois de operadores .replace(/\s*([{};,:\[\]()=+\-*\/])\s*/g, '$1') // Remove linhas vazias .replace(/\n\s*\n/g, '\n') .trim(); } // Função para minificar CSS (básica) function minifyCSS(code) { return code // Remove comentários .replace(/\/\*[\s\S]*?\*\//g, '') // Remove espaços extras .replace(/\s+/g, ' ') // Remove espaços ao redor de : ; { } .replace(/\s*([{}:;,])\s*/g, '$1') // Remove última vírgula antes de } .replace(/;}/g, '}') .trim(); } // Função para calcular economia function calculateSavings(original, minified) { const saved = original - minified; const percentage = ((saved / original) * 100).toFixed(2); return { saved, percentage }; } // Função para formatar bytes function formatBytes(bytes) { return (bytes / 1024).toFixed(2) + ' KB'; } // Minificar app.js console.log('\n📄 Minificando app.js...'); try { const appJsOriginal = fs.readFileSync('public/app.js', 'utf8'); const appJsMinified = minifyJS(appJsOriginal); fs.writeFileSync('public/app.min.js', appJsMinified); const savings = calculateSavings(appJsOriginal.length, appJsMinified.length); console.log(` Original: ${formatBytes(appJsOriginal.length)}`); console.log(` Minificado: ${formatBytes(appJsMinified.length)}`); console.log(` ✅ Economizou: ${formatBytes(savings.saved)} (${savings.percentage}%)`); } catch (error) { console.log(` ❌ Erro: ${error.message}`); } // Minificar styles.css console.log('\n📄 Minificando styles.css...'); try { const cssOriginal = fs.readFileSync('public/styles.css', 'utf8'); const cssMinified = minifyCSS(cssOriginal); fs.writeFileSync('public/styles.min.css', cssMinified); const savings = calculateSavings(cssOriginal.length, cssMinified.length); console.log(` Original: ${formatBytes(cssOriginal.length)}`); console.log(` Minificado: ${formatBytes(cssMinified.length)}`); console.log(` ✅ Economizou: ${formatBytes(savings.saved)} (${savings.percentage}%)`); } catch (error) { console.log(` ❌ Erro: ${error.message}`); } // Minificar sw.js console.log('\n📄 Minificando sw.js...'); try { const swJsOriginal = fs.readFileSync('public/sw.js', 'utf8'); const swJsMinified = minifyJS(swJsOriginal); fs.writeFileSync('public/sw.min.js', swJsMinified); const savings = calculateSavings(swJsOriginal.length, swJsMinified.length); console.log(` Original: ${formatBytes(swJsOriginal.length)}`); console.log(` Minificado: ${formatBytes(swJsMinified.length)}`); console.log(` ✅ Economizou: ${formatBytes(savings.saved)} (${savings.percentage}%)`); } catch (error) { console.log(` ❌ Erro: ${error.message}`); } console.log('\n' + '═'.repeat(80)); console.log('\n✅ Minificação concluída!'); console.log('📝 Nota: Para produção, use ferramentas profissionais como Terser e cssnano\n'); console.log('💡 Próximo passo: Configurar compressão Gzip/Brotli no servidor\n');