portfolio-website/scripts/analyze-bundle.js

93 lines
2.6 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { readdir, stat } from 'fs/promises';
import { join, extname } from 'path';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const distDir = join(__dirname, '..', 'dist');
async function getFileSize(filePath) {
const stats = await stat(filePath);
return stats.size;
}
async function analyzeDirectory(dir, prefix = '') {
const files = await readdir(dir);
const results = [];
for (const file of files) {
const fullPath = join(dir, file);
const stats = await stat(fullPath);
if (stats.isDirectory()) {
results.push(...(await analyzeDirectory(fullPath, prefix + file + '/')));
} else {
const size = await getFileSize(fullPath);
results.push({
path: prefix + file,
size,
sizeKB: (size / 1024).toFixed(2),
ext: extname(file)
});
}
}
return results;
}
async function main() {
console.log('📊 Analyse du bundle de production...\n');
try {
const files = await analyzeDirectory(distDir);
// Grouper par type
const byType = files.reduce((acc, file) => {
if (!acc[file.ext]) acc[file.ext] = [];
acc[file.ext].push(file);
return acc;
}, {});
// Afficher les statistiques
console.log('📦 Taille par type de fichier:\n');
Object.keys(byType).sort().forEach(ext => {
const totalSize = byType[ext].reduce((sum, f) => sum + f.size, 0);
const count = byType[ext].length;
console.log(`${ext || 'no-ext'}: ${(totalSize / 1024).toFixed(2)} KB (${count} fichier${count > 1 ? 's' : ''})`);
});
// Fichiers les plus lourds
console.log('\n🔝 10 fichiers les plus lourds:\n');
files
.sort((a, b) => b.size - a.size)
.slice(0, 10)
.forEach((file, i) => {
console.log(`${i + 1}. ${file.path}: ${file.sizeKB} KB`);
});
// Taille totale
const totalSize = files.reduce((sum, f) => sum + f.size, 0);
console.log(`\n💾 Taille totale: ${(totalSize / 1024 / 1024).toFixed(2)} MB`);
// Avertissements
console.log('\n⚠ Avertissements:');
const largeFiles = files.filter(f => f.size > 500 * 1024); // > 500KB
if (largeFiles.length > 0) {
console.log(`\n${largeFiles.length} fichier(s) de plus de 500 KB détecté(s):`);
largeFiles.forEach(f => {
console.log(` - ${f.path}: ${f.sizeKB} KB`);
});
} else {
console.log('✅ Aucun fichier trop lourd détecté!');
}
} catch (error) {
console.error('❌ Erreur lors de l\'analyse:', error.message);
}
}
main().catch(console.error);