@uppy/compressor vs compressorjs
Client-Side Image Compression Strategies in Frontend Applications
@uppy/compressorcompressorjs

Client-Side Image Compression Strategies in Frontend Applications

compressorjs is a standalone JavaScript library designed for compressing and converting images directly in the browser using the Canvas API. It provides a flexible API for resizing and optimizing image files before they are uploaded or stored. @uppy/compressor, on the other hand, is a plugin for the Uppy file uploader framework that integrates image compression capabilities into the upload pipeline. It leverages compression logic (often powered by compressorjs internally) to automatically process files before they are sent to the server, specifically tailored for workflows already using Uppy.

Npm Package Weekly Downloads Trend

3 Years

Github Stars Ranking

Stat Detail

Package
Downloads
Stars
Size
Issues
Publish
License
@uppy/compressor030,92527 kB1939 months agoMIT
compressorjs05,764161 kB74 months agoMIT

Client-Side Image Compression: @uppy/compressor vs compressorjs

Reducing image file size before upload is a critical optimization for modern web applications. It saves bandwidth, speeds up transfers, and reduces server storage costs. Two common solutions in the JavaScript ecosystem are compressorjs and @uppy/compressor. While they share the same goal, they serve different architectural roles. Let's explore how they differ in practice.

πŸ—οΈ Architecture & Dependency: Standalone vs Plugin

compressorjs is a standalone library.

  • It has no dependencies on file uploaders.
  • You can use it with fetch, XMLHttpRequest, or any custom logic.
  • Best for projects that need compression without a full upload framework.
// compressorjs: Standalone usage
import { Compressor } from 'compressorjs';

const file = input.files[0];

new Compressor(file, {
  quality: 0.6,
  success(result) {
    // result is a Blob, ready to upload manually
    const formData = new FormData();
    formData.append('file', result);
    fetch('/upload', { method: 'POST', body: formData });
  },
});

@uppy/compressor is a plugin for the Uppy uploader.

  • It depends on @uppy/core to function.
  • It hooks into Uppy's lifecycle events automatically.
  • Best for projects already committed to the Uppy ecosystem.
// @uppy/compressor: Plugin usage
import Uppy from '@uppy/core';
import Compressor from '@uppy/compressor';

const uppy = new Uppy()
  .use(Compressor, {
    quality: 0.6,
    // Automatically runs before upload
  });

// Uppy handles the upload after compression
uppy.upload();

βš™οΈ API Configuration & Control

compressorjs exposes detailed options for image manipulation.

  • You control width, height, resize, and mimeType directly.
  • Callbacks (success, error) handle the flow explicitly.
  • Suitable for complex preprocessing logic beyond just uploading.
// compressorjs: Detailed configuration
new Compressor(file, {
  width: 800,
  height: 600,
  resize: 'cover',
  mimeType: 'image/webp',
  success(result) {
    console.log('Compressed to WebP:', result.size);
  },
  error(err) {
    console.error('Compression failed:', err.message);
  },
});

@uppy/compressor simplifies configuration for upload flows.

  • Options are passed during plugin installation.
  • It abstracts away the success/error callbacks into Uppy's event system.
  • Less flexible if you need to manipulate the file outside the upload context.
// @uppy/compressor: Simplified configuration
uppy.use(Compressor, {
  quality: 0.6,
  mimeType: 'image/webp',
  // Uppy handles errors via its own logger/events
});

uppy.on('upload-success', (file, response) => {
  console.log('Upload complete after compression');
});

πŸ“„ File Handling & Output

compressorjs returns a new Blob object.

  • You are responsible for replacing the original file.
  • You must manually manage form data or request bodies.
  • Gives you the freedom to store the blob locally or send it anywhere.
// compressorjs: Manual file handling
new Compressor(file, {
  success(result) {
    // You must create a new File or Blob to upload
    const compressedFile = new File([result], file.name, {
      type: result.type,
      lastModified: Date.now(),
    });
    // Proceed with your own upload logic
  },
});

@uppy/compressor replaces the file in Uppy's state.

  • The original file in the Uppy store is swapped for the compressed version.
  • No manual form data creation is needed.
  • Ensures the uploader sends the optimized version without extra code.
// @uppy/compressor: Automatic file replacement
// No need to manually swap files. 
// The plugin intercepts the file before the request.
uppy.use(Compressor, {
  quality: 0.6,
});

// When uppy.upload() is called, it sends the compressed file

⚠️ Error Handling & Resilience

compressorjs requires explicit error callbacks.

  • You must define what happens if compression fails (e.g., fallback to original).
  • Gives you granular control over retry logic or user notifications.
  • Essential for robust standalone implementations.
// compressorjs: Explicit error handling
new Compressor(file, {
  error(err) {
    // Decide whether to upload original or show error
    alert('Compression failed, uploading original.');
    uploadOriginal(file);
  },
});

@uppy/compressor integrates with Uppy's error system.

  • Errors are emitted through Uppy's upload-error or plugin events.
  • Less boilerplate but less control over specific compression failures.
  • Relies on Uppy's built-in retry mechanisms.
// @uppy/compressor: Integrated error handling
uppy.on('upload-error', (file, error) => {
  // Handles both network and compression errors uniformly
  console.error('Upload or compression failed:', error);
});

🌱 When Not to Use These

These tools are specific to image optimization. Consider alternatives when:

  • You need server-side compression for security or consistency: Use backend libraries (e.g., Sharp for Node.js).
  • You are handling video or non-image files: These packages are strictly for images.
  • You need advanced format conversion (e.g., HEIC to JPEG): Ensure the library supports the specific input format, as browser Canvas API has limitations.

πŸ“Œ Summary Table

Featurecompressorjs@uppy/compressor
TypeπŸ› οΈ Standalone LibraryπŸ”Œ Uppy Plugin
Dependency❌ Noneβœ… Requires @uppy/core
File OutputπŸ“„ Returns Blob (Manual handling)πŸ”„ Auto-replaces in Uppy state
Configurationβš™οΈ Detailed API optionsβš™οΈ Plugin options
Error Handling⚠️ Callback-basedπŸ“’ Uppy Event System
Best ForπŸš€ Custom upload logic🧩 Uppy-based upload flows

πŸ’‘ Final Recommendation

Think in terms of your upload architecture:

  • Building a custom uploader or just processing files? β†’ Use compressorjs. It is lightweight, flexible, and does not force an upload framework on you.
  • Already using Uppy? β†’ Use @uppy/compressor. It saves development time by integrating directly into the existing pipeline, ensuring files are optimized without extra wiring.

Final Thought: Both tools solve the same problem but at different layers of the stack. compressorjs is the engine; @uppy/compressor is the integration of that engine into a specific vehicle. Choose based on whether you need the engine alone or the complete vehicle.

How to Choose: @uppy/compressor vs compressorjs

  • @uppy/compressor:

    Choose @uppy/compressor if your project already uses the Uppy file uploader framework. It integrates compression directly into the upload pipeline, handling file replacement automatically before the request is sent, which reduces boilerplate code for Uppy users. This is the most efficient path if you want seamless compression without manually wiring up file processing events.

  • compressorjs:

    Choose compressorjs if you need a standalone image compression utility that works independently of any file uploader. It is ideal for custom upload implementations, local file processing before storage, or when you want to avoid tying your compression logic to a specific upload framework. This gives you full control over when and how compression happens without importing a heavy uploader library.

README for @uppy/compressor

@uppy/compressor

Uppy logo: a smiling puppy above a pink upwards arrow

CI status for Uppy tests CI status for Companion tests CI status for browser tests

The Compressor plugin for Uppy optimizes images (JPEG, PNG, WEBP), saving on average up to 60% in size (roughly 18 MB for 10 images). It uses Compressor.js.

Uppy is being developed by the folks at Transloadit, a versatile file encoding service.

Example

import Uppy from '@uppy/core'
import Compressor from '@uppy/compressor'

const uppy = new Uppy()
uppy.use(Compressor)

Installation

npm install @uppy/compressor

We recommend installing from yarn or npm, and then using a module bundler such as Parcel, Vite or Webpack.

Alternatively, you can also use this plugin in a pre-built bundle from Transloadit’s CDN: Smart CDN. In that case Uppy will attach itself to the global window.Uppy object. See the main Uppy documentation for instructions.

Documentation

Documentation for this plugin can be found on the Uppy website.

License

The MIT License.