简介
前端开发中,图片压缩的需求太常见了,如果只是图片数量少,找一个在线的,基本能满足要求,如果是大量的图片,比如几千张,在线的压缩工具很难满足要求,一是有数量的限制,二是效果也不是很理想,而且效率很低。何不自己写一个压缩功能?
依赖库
- imagemin
- imageminJpegtran
- imageminPngquant
实现逻辑
// index.js
import fs from "fs";
import imagemin from "imagemin";
import imageminJpegtran from "imagemin-jpegtran";
import imageminPngquant from "imagemin-pngquant";
import path from "path";
// 待压缩的图片所在的文件夹
const sourcePath = path.resolve("./images");
// 压缩后的图片的输出路径
const targetPath = path.resolve("./output");
/**
* 读取文件夹下的所有图片列表
* @param {Function} cb
*/
const getImagesList = (cb) => {
fs.readdir(sourcePath, (err, files) => {
if (!err) {
return cb(files.map((name) => path.join(sourcePath, name)));
}
console.log(err);
});
};
/**
* 压缩图片
* @param {Array} files
*/
const compress = async (files) => {
return await imagemin(files, {
destination: targetPath,
plugins: [
imageminJpegtran(),
imageminPngquant({
quality: [0.6, 0.6],
}),
],
});
};
const run = () => {
getImagesList(async (files) => {
for (let index = 0; index < files.length; index++) {
try {
console.log(`${index+1}/${files.length}`)
// 图片一张一张处理,降低处理失败的概率。
await compress([files[index]]);
} catch (error) {
console.log(error);
}
}
});
};
run();
// packages.json
{
"name": "compress",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"type": "module",
"dependencies": {
"imagemin": "^8.0.1",
"imagemin-jpegtran": "^7.0.0",
"imagemin-pngquant": "^9.0.2"
}
}