Sin webpack, comprimiendo imágenes locales con Node.js: Comparación y aplicación de sharp e imagemin
- 747Palabras
- 4Minutos
- 23 Jul, 2024
En el desarrollo web moderno, la optimización del tamaño de las imágenes es un paso crucial para mejorar el rendimiento del sitio web. Este artículo presentará cómo usar las bibliotecas de Node.js sharp e imagemin para comprimir imágenes locales, comparando en detalle las funciones y capacidades de compresión de estas dos herramientas.
Uso de sharp
Instalación de sharp
Primero, instala sharp a través de npm:
1npm install sharp
Procesamiento de imágenes con sharp
sharp
es una biblioteca de procesamiento de imágenes de alto rendimiento que soporta diversas operaciones de imagen. Aquí hay algunos usos comunes:
-
Redimensionar (Resize):
1const sharp = require("sharp");23sharp("input.jpg")4.resize(300, 200) // 300px de ancho, 200px de alto5.toFile("output.jpg", (err, info) => {6if (err) {7console.error(err);8} else {9console.log(info);10}11}); -
Recortar (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}); -
Rotar (Rotate):
1sharp("input.jpg")2.rotate(90) // Rotar 90 grados en sentido horario3.toFile("output.jpg", (err, info) => {4if (err) {5console.error(err);6} else {7console.log(info);8}9}); -
Agregar marca de agua (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}); -
Comprimir todas las imágenes en un directorio:
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) // Redimensionar a 800px de ancho, la altura se ajustará automáticamente para mantener la relación de aspecto20.toFormat("jpeg", { quality: 80 }) // Convertir a JPEG con una calidad de 8021.toFile(outputFile, (err, info) => {22if (err) {23console.error("Error processing file:", err);24} else {25console.log("File processed:", info);26}27});28});29});
Uso de imagemin
Instalación de imagemin
Primero, instala imagemin y sus plugins relacionados a través de npm:
1npm install imagemin imagemin-mozjpeg imagemin-pngquant imagemin-svgo
Compresión de imágenes con imagemin
imagemin
es una biblioteca de compresión de imágenes altamente configurable que soporta varios plugins. Dado que imagemin
es un módulo ES, no podemos usar require
para importarlo, necesitamos agregar el siguiente código en package.json
para habilitar los módulos ES:
1"type": "module",
Aquí hay algunos usos comunes de imagemin:
-
Comprimir JPEG:
1import imagemin from "imagemin";2import imageminMozjpeg from "imagemin-mozjpeg";34(async () => {5await imagemin(["images/*.jpg"], {6destination: "output",7plugins: [imageminMozjpeg({ quality: 70 })],8});9})(); -
Comprimir 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})(); -
Comprimir SVG:
1import imagemin from "imagemin";2import imageminSvgo from "imagemin-svgo";34(async () => {5await imagemin(["images/*.svg"], {6destination: "output",7plugins: [imageminSvgo()],8});9})(); -
Comprimir GIF:
1import imagemin from "imagemin";2import imageminGifsicle from "imagemin-gifsicle";34(async () => {5await imagemin(["images/*.gif"], {6destination: "output",7plugins: [imageminGifsicle({ optimizationLevel: 3 })],8});9})(); -
Comprimir todas las imágenes en un directorio:
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})();
Comparación entre sharp e imagemin
Eficiencia de compresión
- sharp utiliza la biblioteca libvips, que ofrece una velocidad de compresión muy rápida, especialmente cuando se manejan grandes volúmenes de imágenes.
- imagemin depende de plugins específicos, y la eficiencia de compresión varía entre los diferentes plugins. En general,
imagemin
es un poco más lento quesharp
, pero soporta más formatos.
Calidad de compresión
- sharp proporciona un efecto de compresión de alta calidad, soportando el ajuste de la calidad de compresión y el tamaño de la imagen, permitiendo reducir significativamente el tamaño del archivo manteniendo una buena calidad de imagen.
- imagemin ofrece múltiples plugins, y los usuarios pueden elegir diferentes plugins para optimizar distintos formatos de imágenes. Su calidad de compresión también es muy alta, especialmente cuando se usan plugins específicos de optimización (como imagemin-mozjpeg).
Funcionalidad
- sharp no es solo una herramienta de compresión, sino que también ofrece potentes funciones de procesamiento de imágenes, como recorte, rotación, redimensionamiento, marcas de agua, etc.
- imagemin se enfoca en la compresión de imágenes, soportando la optimización de varios formatos a través de diferentes plugins, pero no ofrece otras funciones de procesamiento de imágenes.
Conclusión
En resumen, si necesitas funciones eficientes de procesamiento y compresión de imágenes, sharp
es una excelente opción. Si necesitas optimizar varios formatos de imágenes y te enfocas en el efecto de compresión, imagemin
es una mejor elección.