Untitled
unknown
plain_text
a year ago
4.0 kB
6
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