Інтеграція Sharp (Node.js) для серверної обробки зображень

Sharp — швидка обробка зображень без компромісів

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Інтеграція Sharp (Node.js) для серверної обробки зображень
Середній
від 1 дня до 3 днів

Наші компетенції:

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1418
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1286
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    983
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1243
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    983
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    998

Sharp — швидка обробка зображень без компромісів

Серверна обробка зображень стає вузьким місцем, коли користувачі завантажують RAW з камер або фото 12 Мп з телефону. Jimp споживає 200+ МБ на одне зображення, ImageMagick потребує системної установки та нестабільний під навантаженням. Ми стикалися з проектом, де 10 одночасних завантажень клали сервер через OOM. Рішення — Sharp на базі libvips. Він обробляє зображення потоково, без завантаження повного файлу в пам'ять, і в 4–5 разів швидше аналогів.

Чому Sharp швидше аналогів?

Sharp не тримає весь файл у пам'яті — він розбирає його по шматках, застосовує операції та одразу пише результат. Це дає вдвічі менше споживання пам'яті при тому ж навантаженні. Порівняйте з ImageMagick: той конвертує через тимчасові файли на диску, що уповільнює роботу у високонавантажених системах. У наших тестах Sharp обробив 1000 зображень (1920×1080 → 800px WebP) за 12 секунд — ImageMagick знадобилося 38 секунд.

Бібліотека Споживання пам'яті на 1 зображення Час конвертації (1000 шт.)
Sharp 20–30 МБ 12 с
Jimp 150–250 МБ 45 с
ImageMagick 100–150 МБ + I/O 38 с

Як Sharp захищає від decompression bomb?

Decompression bomb — зображення з величезними розмірами (наприклад, 100k×100k пікселів), яке при спробі завантаження виділяє всю пам'ять. Sharp дозволяє перевірити метадані до повного завантаження: викличте metadata() і відхиліть файл, якщо ширина × висота перевищує ліміт (наприклад, 50 Мп). Це запобігає OOM без зайвих витрат.

Як ми реалізуємо інтеграцію

На одному з проектів (інтернет-магазин одягу) потрібно було автоматично конвертувати завантажувані фото в WebP з кількома розмірами, зберігати EXIF для SEO і не допускати decompression bomb. Ми побудували пайплайн:

  1. Multer зберігає файл у пам'яті (buffer).
  2. Sharp читає метадані — якщо площа > 50 Мп, відхиляємо.
  3. Застосовуємо .rotate() для автоматичного повороту за EXIF.
  4. Через clone() створюємо три гілки: thumbnail (150×150 cover), medium (800px), large (1920px).
  5. Кожну гілку конвертуємо в WebP (quality 82, effort 4) і зберігаємо в S3.
  6. Повертаємо JSON з посиланнями.

Результат: час завантаження впав з 3 секунд до 0.8, сервер витримує 50 одночасних запитів.

Вибір формату: WebP чи AVIF?

Формат Ступінь стиснення (відносно JPEG) Підтримка браузерами (2025) Споживання CPU
WebP ~30% менше JPEG 96% Помірне
AVIF ~50% менше JPEG 87% Високе
JPEG XL ~60% менше JPEG 10% Середнє

Для більшості проектів WebP — оптимальний баланс. AVIF обирають, коли розмір критичний, а CPU не тисне.

Налаштування concurrency в продакшені

Sharp використовує всі ядра CPU за замовчуванням, що може перевантажити сервер. Рекомендуємо обмежити:

sharp.concurrency(2) // два потоки 

Також використовуйте чергу через p-limit для контролю одночасних обробок, контролюючи concurrency.

Процес роботи

  • Аналітика: вивчаємо поточний пайплайн, заміряємо навантаження, визначаємо цільові формати та роздільну здатність.
  • Проектування: обираємо стратегію кешування (CDN, заголовки Cache-Control), налаштовуємо конвеєр з урахуванням вашого стеку (Express, S3, Cloudflare).
  • Реалізація: пишемо код з обробкою помилок, захистом від decompression bomb, інтеграцією з Multer або busboy.
  • Тестування: навантажувальний тест з 1000 зображень, перевірка всіх форматів і роздільних здатностей.
  • Деплой: документація з розгортання, моніторинг (метрики часу обробки, пам'яті).

Терміни орієнтовно: від 2 до 5 робочих днів залежно від складності інтеграції (кількість форматів, S3, водяний знак). Вартість розраховується індивідуально після аудиту вашого проекту. Економія на серверних ресурсах — до 70% витрат на CPU та пам'ять.

Що входить у роботу

  • Готовий пайплайн обробки зображень (resize, конвертація, водяний знак).
  • Інтеграція з вашим веб-сервером (Express, Fastify, Next.js API routes).
  • Документація з деплою та налаштування (змінні середовища, ліміти форків Sharp).
  • Доступ до репозиторію з кодом.
  • Гарантія підтримки протягом 2 тижнів після здачі.

Типові помилки при інтеграції

  • Забули про concurrency: Sharp використовує всі ядра — в продакшені обмежте sharp.concurrency(2) та чергу через p-limit.
  • Не перевіряєте формат через metadata: MIME-тип можна підробити. Sharp автоматично визначить реальний формат — використовуйте meta.format.
  • Зберігаєте EXIF з GPS: при публічній публікації видаляйте метадані .withMetadata(false), інакше витік координат.

Оцінимо ваш проект безкоштовно — просто надішліть поточний код обробки. Отримайте консультацію з оптимізації зображень без купівлі дорогих бібліотек.

// Пример конвейера с защитой от decompression bomb async function safeProcess(buffer) { try { const meta = await sharp(buffer).metadata() if (meta.width * meta.height > 50_000_000) { throw new Error('Image too large: exceeds 50MP limit') } return await sharp(buffer) .rotate() .resize(2000, 2000, { fit: 'inside', withoutEnlargement: true }) .webp({ quality: 82 }) .toBuffer() } catch (err) { if (err.message.includes('Input buffer contains unsupported image format')) { throw new TypeError('Unsupported image format') } throw err } } 

Наш досвід: 10+ років у веб-розробці, 50+ проектів з інтеграцією Sharp. Гарантуємо сумісність з вашим стеком.