|
|
|
|
|
|
|
|
|
|
|
const fs = require('fs'); |
|
|
const path = require('path'); |
|
|
|
|
|
console.log('🗜️ MINIFICAÇÃO DE CÓDIGO\n'); |
|
|
console.log('═'.repeat(80)); |
|
|
|
|
|
|
|
|
function minifyJS(code) { |
|
|
return code |
|
|
|
|
|
.replace(/\/\/.*$/gm, '') |
|
|
|
|
|
.replace(/\/\*[\s\S]*?\*\//g, '') |
|
|
|
|
|
.replace(/\s+/g, ' ') |
|
|
|
|
|
.replace(/\s*([{};,:\[\]()=+\-*\/])\s*/g, '$1') |
|
|
|
|
|
.replace(/\n\s*\n/g, '\n') |
|
|
.trim(); |
|
|
} |
|
|
|
|
|
|
|
|
function minifyCSS(code) { |
|
|
return code |
|
|
|
|
|
.replace(/\/\*[\s\S]*?\*\//g, '') |
|
|
|
|
|
.replace(/\s+/g, ' ') |
|
|
|
|
|
.replace(/\s*([{}:;,])\s*/g, '$1') |
|
|
|
|
|
.replace(/;}/g, '}') |
|
|
.trim(); |
|
|
} |
|
|
|
|
|
|
|
|
function calculateSavings(original, minified) { |
|
|
const saved = original - minified; |
|
|
const percentage = ((saved / original) * 100).toFixed(2); |
|
|
return { saved, percentage }; |
|
|
} |
|
|
|
|
|
|
|
|
function formatBytes(bytes) { |
|
|
return (bytes / 1024).toFixed(2) + ' KB'; |
|
|
} |
|
|
|
|
|
|
|
|
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}`); |
|
|
} |
|
|
|
|
|
|
|
|
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}`); |
|
|
} |
|
|
|
|
|
|
|
|
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'); |
|
|
|