Untitled
unknown
plain_text
a year ago
4.0 kB
13
Indexable
const fs = require('fs').promises;
const path = require('path');
const { performance } = require('perf_hooks');
const readline = require('readline');
const imageDir = path.join(__dirname, 'public', 'images');
const projectDir = __dirname;
// Функция для поиска всех файлов в проекте
const findAllFiles = async (dir) => {
let files = [];
const items = await fs.readdir(dir);
for (const item of items) {
const fullPath = path.join(dir, item);
const stat = await fs.lstat(fullPath);
if (stat.isDirectory()) {
files = files.concat(await findAllFiles(fullPath));
} else if (stat.isFile()) {
files.push(fullPath);
}
}
return files;
};
// Функция для поиска упоминаний изображений в файлах
const findAllImageUsages = async () => {
console.log('Ищем упоминания изображений в проекте...');
const files = await findAllFiles(projectDir);
const imageUsages = new Set();
for (const file of files) {
const ext = path.extname(file).toLowerCase();
if (['.js', '.jsx', '.ts', '.tsx'].includes(ext)) {
const content = await fs.readFile(file, 'utf8');
const regex = /['"\s](\/images\/[^'"\s]+)['"\s]/g;
let match;
while ((match = regex.exec(content)) !== null) {
imageUsages.add(path.basename(match[1]));
}
}
}
return imageUsages;
};
// Асинхронная функция для рекурсивного обхода директорий и поиска неиспользуемых изображений
const findUnusedImages = async (dir, imageUsages) => {
const unusedImages = [];
console.log(`Обходим директорию: ${dir}`);
const files = await findAllFiles(dir);
const totalFiles = files.length;
let processedFiles = 0;
for (const file of files) {
const ext = path.extname(file).toLowerCase();
if (['.png', '.jpg', '.jpeg', '.gif', '.svg'].includes(ext)) {
const imageName = path.basename(file);
if (!imageUsages.has(imageName)) {
unusedImages.push(file);
}
}
processedFiles++;
process.stdout.write(`\rОбработано файлов: ${processedFiles}/${totalFiles}`);
}
return unusedImages;
};
// Функция для получения размера файлов
const getTotalSize = async (files) => {
let totalSize = 0;
for (const file of files) {
const { size } = await fs.stat(file);
totalSize += size;
}
return totalSize;
};
// Основная логика
const main = async () => {
const startTime = performance.now();
console.log('Начало поиска неиспользуемых изображений');
// Поиск всех упоминаний изображений
const imageUsages = await findAllImageUsages();
console.log('Найдено упоминаний изображений:', imageUsages.size);
// Поиск неиспользуемых изображений
const unusedImages = await findUnusedImages(imageDir, imageUsages);
console.log('\nПоиск завершен');
if (unusedImages.length > 0) {
console.log('Найденные неиспользуемые изображения:');
unusedImages.forEach((image) => console.log(image));
const totalSize = await getTotalSize(unusedImages);
console.log(`Общий размер неиспользуемых изображений: ${(totalSize / 1024 / 1024).toFixed(2)} MB`);
} else {
console.log('Все изображения используются.');
}
const endTime = performance.now();
console.log(`Время выполнения: ${(endTime - startTime) / 1000} секунд`);
};
main().catch((err) => {
console.error('Ошибка выполнения скрипта:', err);
});
Editor is loading...
Leave a Comment