node,轻松实现图片的批量压缩

1,517 阅读1分钟

简介

前端开发中,图片压缩的需求太常见了,如果只是图片数量少,找一个在线的,基本能满足要求,如果是大量的图片,比如几千张,在线的压缩工具很难满足要求,一是有数量的限制,二是效果也不是很理想,而且效率很低。何不自己写一个压缩功能?

依赖库

  • 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"
  }
}