Skip to content

image-manifest ​

image-manifest

Кроссплатформенный инструмент Node.js, который конвертирует изображения в нужный формат, генерирует структуру файлов в формате JSON и при необходимости изменяет размеры. Доступен из командной строки, через локальный Web UI или как библиотека. Полезен для статических сайтов, галерей и автоматизации.

Требуется Node.js 22 или новее. npx image-manifest --help покажет все доступные опции.

📖 Использование ​

Создайте папку img-src

shell
mkdir img-src

Поместите изображения в img-src

shell
# Интерактивный CLI (всегда задаёт вопросы)
npx image-manifest@latest -i

# Интерфейс в браузере
npx image-manifest@latest --ui

Запуск npx image-manifest@latest без аргументов использует найденный файл конфигурации, если он есть; иначе запускается интерактивный режим.

💻 Параметры командной строки ​

ПараметрОписаниеПо умолчанию
--src, -sИмя исходной папки (должна существовать)img-src
--dist, -dИмя папки с результатамиimg-dist
--format, -fВыходной формат: webp, jpg, png, avif или исходный (original)webp
--json, -jИмя выходного JSON-файла (или --no-json, чтобы пропустить)null
--width, -WМаксимальная ширина изображения в пикселяхnull
--height, -HМаксимальная высота изображения в пикселяхnull
--concurrency, -cМаксимум одновременно обрабатываемых изображений5
--include-sizeВключить размеры изображений (ширину и высоту) в JSONfalse
--manifest-onlyТолько генерация JSON-манифеста, без конвертации изображенийfalse
--no-progressОтключить индикатор выполненияfalse
--continue-on-errorПродолжать обработку, даже если некоторые изображения выдают ошибкуfalse
--interactive, -iПринудительный интерактивный режим, даже если переданы аргументыfalse
--uiОткрыть локальный Web UI в браузереfalse

✨ Примеры ​

shell
# Конвертировать все изображения в webp (по умолчанию) и создать манифест
npx image-manifest --json static-images --format original

# Изменить размер до максимальной высоты 2000px, другая исходная папка
npx image-manifest --src sources --height 2000

# Только создать JSON-манифест из существующих изображений (без обработки)
npx image-manifest --manifest-only --json gallery --src myimages

# Продолжить обработку при ошибках и отключить прогресс-бар
npx image-manifest --continue-on-error --no-progress --json report

# Запустить интерактивный режим (запрашивает все параметры)
npx image-manifest --interactive

# Открыть локальный Web UI
npx image-manifest --ui

🌐 Локальный Web UI ​

Запустите npx image-manifest --ui, чтобы открыть локальный интерфейс в браузере. Укажите исходную папку; папка результата автоматически предлагается как <исходная-папка>-dist, но её можно изменить. Выберите WebP, AVIF, JPG, PNG или Исходный формат, затем задайте независимые максимальные ширину и высоту в пикселях. По умолчанию оба ограничения — 1000 px; соотношение сторон сохраняется, а изображение уменьшается только при превышении ограничения. Нажмите Начать. Во время обработки эта же кнопка становится кнопкой остановки: текущая картинка завершится, остальные будут пропущены. Кнопка Закрыть недоступна во время обработки.

Сервер привязан к 127.0.0.1 и использует случайный свободный порт. Интерфейс выбирает язык браузера, если доступен английский, русский, украинский или немецкий перевод; иначе используется английский. Светлая или тёмная тема соответствует настройке браузера/системы. После закрытия запустите npx image-manifest --ui, чтобы открыть интерфейс снова. Браузер не всегда может передать полный путь перетащенной папки, поэтому ручная вставка пути остаётся самым надёжным способом.

⚙️ Файл конфигурации ​

Вы можете хранить настройки в файле конфигурации, чтобы не передавать их каждый раз в командной строке. Допустимые файлы (поиск в текущей директории и выше):

  • .image-manifestrc.json
  • .image-manifestrc
  • свойство "image-manifest" в package.json

Пример .image-manifestrc.json:

json
{
  "src": "my-images",
  "format": "webp",
  "json": "gallery",
  "width": 1200,
  "includeSize": true
}

При запуске npx image-manifest без аргументов будет автоматически использован файл конфигурации, если он существует. В противном случае запустится интерактивный режим.

📦 Программный API ​

Вы также можете использовать image-manifest как библиотеку в своих скриптах.

ts
import { run } from 'image-manifest';

await run({
  src: 'photos',
  dist: 'output',
  format: 'webp',
  json: 'manifest',
  width: 800,
  height: null,
  concurrency: 4,
  includeSize: true,
  continueOnError: true,
  // manifestOnly: true  // раскомментируйте, чтобы пропустить конвертацию
});

Пользователи TypeScript могут импортировать типы манифеста:

ts
import type { ImageManifest, ImageFile } from 'image-manifest';

Также можно импортировать отдельные утилиты:

ts
import { imageProcessing } from 'image-manifest/image-processing';
import { convertToWebp } from 'image-manifest/to-webp';
import { isImage } from 'image-manifest/is-image';
import { collectImages } from 'image-manifest/collect-images';

convertToWebp принимает путь к файлу или Buffer, возвращает WebP Buffer и размеры изображения и по умолчанию ограничивает длинную сторону 1000 пикселями:

ts
const { buffer, width, height } = await convertToWebp(input, 1000);

Исходная и выходная папки должны различаться. Библиотека прекращает работу, если они совпадают или одна папка находится внутри другой.

Для отладки установите переменную окружения DEBUG:

bash
DEBUG=image-manifest:* npx image-manifest --src photos