Untitled

 avatar
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