無需webpack,使用 Node.js 壓縮本地圖片:sharp 與 imagemin 的對比與應用
- 942字
- 5分鐘
- 2024-07-23
在現代 web 開發中,優化圖片大小是提升網站性能的關鍵步驟之一。本文將介紹如何使用 Node.js 庫 sharp 和 imagemin 壓縮本地圖片,並對這兩種工具的功能和壓縮能力進行詳細對比。
sharp 的使用
安裝 sharp
首先,通過 npm 安裝 sharp:
1npm install sharp
使用 sharp 進行圖片處理
sharp
是一個高性能的圖片處理庫,支持多種圖片操作。以下是一些常見的用法:
-
調整大小 (Resize):
1const sharp = require("sharp");23sharp("input.jpg")4.resize(300, 200) // 300px 寬,200px 高5.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) // 順時針旋轉90度3.toFile("output.jpg", (err, info) => {4if (err) {5console.error(err);6} else {7console.log(info);8}9}); -
添加水印 (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}); -
壓縮目錄下的所有圖片:
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)20.toFormat("jpeg", { quality: 80 })21.toFile(outputFile, (err, info) => {22if (err) {23console.error("Error processing file:", err);24} else {25console.log("File processed:", info);26}27});28});29});
imagemin 的使用
安裝 imagemin
首先,通過 npm 安裝 imagemin 及其相關插件:
1npm install imagemin imagemin-mozjpeg imagemin-pngquant imagemin-svgo
使用 imagemin 進行圖片壓縮
imagemin
是一個高度可配置的圖片壓縮庫,支持多種插件。由於 imagemin
是一個 ES 模塊,因此我們不能使用 require
來引入它,我們需要在 package.json
中添加如下代碼來開啟ES Module:
1"type": "module",
以下是一些常見的imagemin用法:
-
壓縮 JPEG:
1import imagemin from "imagemin";2import imageminMozjpeg from "imagemin-mozjpeg";34(async () => {5await imagemin(["images/*.jpg"], {6destination: "output",7plugins: [imageminMozjpeg({ quality: 70 })],8});9})(); -
壓縮 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})(); -
壓縮 SVG:
1import imagemin from "imagemin";2import imageminSvgo from "imagemin-svgo";34(async () => {5await imagemin(["images/*.svg"], {6destination: "output",7plugins: [imageminSvgo()],8});9})(); -
壓縮 GIF:
1import imagemin from "imagemin";2import imageminGifsicle from "imagemin-gifsicle";34(async () => {5await imagemin(["images/*.gif"], {6destination: "output",7plugins: [imageminGifsicle({ optimizationLevel: 3 })],8});9})(); -
壓縮目錄下的所有圖片:
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})();
sharp 與 imagemin 的對比
壓縮效率
- sharp 使用 libvips 庫,壓縮速度非常快,尤其是在處理大批量圖片時表現優異。
- imagemin 依賴於具體的插件,不同的插件壓縮效率有所不同。總體來說,
imagemin
的壓縮速度稍慢於sharp
,但提供了更多格式的支持。
壓縮質量
- sharp 提供了高質量的壓縮效果,支持調整壓縮質量和圖片大小,可以在保持較好圖片質量的同時顯著減少文件大小。
- imagemin 提供了多個插件,用戶可以根據需要選擇不同的插件來優化不同格式的圖片。其壓縮質量也非常高,尤其是在使用特定的優化插件時(如 imagemin-mozjpeg)。
功能性
- sharp 不僅僅是一個壓縮工具,它還提供了強大的圖片處理功能,如裁剪、旋轉、調整大小、水印等。
- imagemin 專注於圖片壓縮,通過不同的插件支持多種圖片格式的優化,但不具備圖片處理的其他功能。
結論
總結來說,如果需要高效的圖片處理和壓縮功能,sharp
是一個非常不錯的選擇。如果需要優化多種圖片格式且專注於壓縮效果,imagemin
是更好的選擇。