Compress Local Images Using Node.js Without Webpack: Comparison and Application of sharp and imagemin
- 657Words
- 3Minutes
- 23 Jul, 2024
In modern web development, optimizing image size is a key step to enhance website performance. This article will introduce how to compress local images using Node.js libraries sharp and imagemin, and provide a detailed comparison of their functions and compression capabilities.
Using sharp
Installing sharp
First, install sharp via npm:
1npm install sharp
Image Processing with sharp
sharp
is a high-performance image processing library that supports various image operations. Here are some common usages:
-
Resize:
1const sharp = require("sharp");23sharp("input.jpg")4.resize(300, 200) // 300px width, 200px height5.toFile("output.jpg", (err, info) => {6if (err) {7console.error(err);8} else {9console.log(info);10}11}); -
Crop:
1sharp("input.jpg")2.resize(300, 300, {3fit: sharp.fit.cover,4position: sharp.strategy.entropy,5})6.toFile("output.jpg", (err, info) => {7if (err) {8console.error(err);9} else {10console.log(info);11}12}); -
Rotate:
1sharp("input.jpg")2.rotate(90) // Rotate 90 degrees clockwise3.toFile("output.jpg", (err, info) => {4if (err) {5console.error(err);6} else {7console.log(info);8}9}); -
Add Watermark (Composite):
1sharp("input.jpg")2.composite([{ input: "watermark.png", gravity: "southeast" }])3.toFile("output.jpg", (err, info) => {4if (err) {5console.error(err);6} else {7console.log(info);8}9}); -
Compress All Images in a Directory:
1const sharp = require("sharp");2const fs = require("fs");3const path = require("path");45const inputDir = "path/to/your/images";6const outputDir = "path/to/output/images";78fs.readdir(inputDir, (err, files) => {9if (err) {10console.error("Error reading input directory:", err);11return;12}1314files.forEach((file) => {15const inputFile = path.join(inputDir, file);16const outputFile = path.join(outputDir, file);1718sharp(inputFile)19.resize(800) // Resize to width 800px, height will be auto-scaled to maintain aspect ratio20.toFormat("jpeg", { quality: 80 }) // Convert to JPEG with quality of 8021.toFile(outputFile, (err, info) => {22if (err) {23console.error("Error processing file:", err);24} else {25console.log("File processed:", info);26}27});28});29});
Using imagemin
Installing imagemin
First, install imagemin and its related plugins via npm:
1npm install imagemin imagemin-mozjpeg imagemin-pngquant imagemin-svgo
Compressing Images with imagemin
imagemin
is a highly configurable image compression library that supports various plugins. Since imagemin
is an ES module, we cannot use require
to import it. We need to add the following code to package.json
to enable ES Module:
1"type": "module",
Here are some common usages of imagemin:
-
Compress JPEG:
1import imagemin from "imagemin";2import imageminMozjpeg from "imagemin-mozjpeg";34(async () => {5await imagemin(["images/*.jpg"], {6destination: "output",7plugins: [imageminMozjpeg({ quality: 70 })],8});9})(); -
Compress PNG:
1import imagemin from "imagemin";2import imageminPngquant from "imagemin-pngquant";34(async () => {5await imagemin(["images/*.png"], {6destination: "output",7plugins: [8imageminPngquant({9quality: [0.6, 0.8],10}),11],12});13})(); -
Compress SVG:
1import imagemin from "imagemin";2import imageminSvgo from "imagemin-svgo";34(async () => {5await imagemin(["images/*.svg"], {6destination: "output",7plugins: [imageminSvgo()],8});9})(); -
Compress GIF:
1import imagemin from "imagemin";2import imageminGifsicle from "imagemin-gifsicle";34(async () => {5await imagemin(["images/*.gif"], {6destination: "output",7plugins: [imageminGifsicle({ optimizationLevel: 3 })],8});9})(); -
Compress All Images in a Directory:
1import imagemin from "imagemin";2import imageminMozjpeg from "imagemin-mozjpeg";3import imageminPngquant from "imagemin-pngquant";4import imageminSvgo from "imagemin-svgo";5import path from "path";67const inputDir = "path/to/your/images/*.{jpg,png,svg}";8const outputDir = "path/to/output/images";910(async () => {11const files = await imagemin([inputDir], {12destination: outputDir,13plugins: [14imageminMozjpeg({ quality: 80 }),15imageminPngquant({16quality: [0.6, 0.8],17}),18imageminSvgo(),19],20});21console.log("Images optimized:", files);22})();
Comparison of sharp and imagemin
Compression Efficiency
- sharp uses the libvips library and offers very fast compression, especially when processing large batches of images.
- imagemin relies on specific plugins, and the compression efficiency varies. Overall,
imagemin
is slightly slower thansharp
, but it provides support for more formats.
Compression Quality
- sharp offers high-quality compression, allowing adjustments to compression quality and image size, significantly reducing file size while maintaining good image quality.
- imagemin offers multiple plugins, allowing users to choose different plugins for optimizing various image formats. Its compression quality is also very high, especially when using specific optimization plugins like imagemin-mozjpeg.
Functionality
- sharp is not just a compression tool; it also provides powerful image processing functions such as cropping, rotating, resizing, watermarking, etc.
- imagemin focuses on image compression, supporting optimization for various image formats through different plugins, but lacks other image processing capabilities.
Conclusion
In summary, if you need efficient image processing and compression, sharp
is a very good choice. If you need to optimize multiple image formats and focus on compression effects, imagemin
is the better choice.