K30 / scripts /minify.js
Raí Santos
oi
95aa6cf
// 🗜️ 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');