基于tinify对图片进行批量压缩

121 阅读1分钟
const fs = require('fs');
const path = require('path');//解析需要遍历的文件夹
const filePath = path.resolve('./temp');
const tinify = require('tinify');
const { spawn } = require('child_process')
tinify.key = 'VzjzXnvLyZncGtY4HzQFKlXst26mP68G';
​
const run = async (command) => {
    // cmd表示命令,args代表参数,如 rm -rf  rm就是命令,-rf就为参数
    const [cmd, ...args] = command.split(' ')
    return new Promise((resolve, reject) => {
        const app = spawn(cmd, args, {
            cwd: path.resolve('./'), // 执行命令的路径
            stdio: 'inherit', // 输出共享给父进程
            shell: true
        })
        // 执行完毕关闭并resolve
        app.on('close', resolve)
    })
}
​
async function compressionImg(imgsPath, tinifyImgsPath) {
    if (!fs.existsSync(path.join(__dirname, `tinifyImgs`))) {
        fs.mkdirSync(path.join(__dirname, `tinifyImgs`));
    }
    if (!fs.existsSync(tinifyImgsPath)) {
        fs.mkdirSync(tinifyImgsPath);
    }
    fs.readdir(imgsPath, (err, files) => {
        if (!err) {
            files.forEach((fileName, index) => {
                tinify.fromFile(path.join(imgsPath, fileName))
                    .toFile(path.join(tinifyImgsPath, fileName))
                    .then(() => {
                        console.log('tinify ok:%s', fileName);
                    })
                    .catch((err) => {
                        console.log('tinify err:%s', err);
                    });
            })
        }
    });
}
​
//调用文件遍历方法
const ignoreFile = ['node_modules', 'yarn.lock', '8-4']
const noDir = true
fileDisplay(filePath)
//文件遍历方法function fileDisplay(filePath, noDir = false) {
    // run(`rm -rf tinifyImgs`)
    //根据文件路径读取文件,返回文件列表
    let imgFile = []
    return fs.readdir(filePath, function (err, files) {
        if (err) {
            console.warn(err)
        } else {
            //遍历读取到的文件列表
            files.map(fileName => {
                if (ignoreFile.includes(fileName)) return
                const filedir = path.join(filePath, fileName);
                fs.stat(filedir, function (eror, stats) {
                    if (eror) {
                        console.warn('获取文件stats失败');
                    } else {
                        const isFile = stats.isFile();//是文件
                        const isDir = stats.isDirectory();//是文件夹
                        if (isFile) {
                            compressionImg(filedir, path.join(__dirname, `tinifyImgs`))
                        }
                        if (isDir) {
                            if (noDir) {
                                return
                            }
                            imgFile.push(filedir)
                            compressionImg(filedir, path.join(__dirname, `tinifyImgs\${fileName}`))
                            console.log('文件夹:', filedir, fileName)
                            fileDisplay(filedir);//递归,如果是文件夹,就继续遍历该文件夹下面的文件
                        }
                    }
                })
                return fileName
            })
        }
    });
}