【Node】簡單快捷的圖片壓縮指令碼

hujiao發表於2018-09-04

原文地址:github.com/HuJiaoHJ/bl…

在寫個人部落格時,經常需要使用到圖片,為了優化文章的閱讀體驗,需要對圖片進行壓縮,現在有很多好用的圖片壓縮網站,比如:tinypng.com/

但是每次壓縮都手動的去上傳下載,還挺麻煩的,於是想著寫一個node指令碼來做圖片壓縮工作

本文介紹的方法真的很簡單快捷,使用的是 tinypng.com/ 提供的Node API,文件:tinypng.com/developers/…

在使用之前,需要去申請一個API Key,入口:tinypng.com/developers,注意一個API Key一個月只能免費壓縮500個圖片,不過我覺得還是夠用的

具體使用方式可以參考官方文件,下面介紹如何批量的對圖片進行壓縮,直接上程式碼:

tinify.js

const tinify = require('tinify');
const apiKey = require('./api_key');
const fs = require('fs');
const path = require('path');
// API Key
tinify.key = apiKey;

// 執行圖片壓縮任務,返回promise物件
const task = file => {
    const source = tinify.fromFile(file.fromFile);
    source.toFile(file.toFile);
    return source._url;
}
// 通過輸入資料夾和輸出資料夾,返回一個陣列
const fromDir = (inDir, outDir, _files = []) => {
    const files = fs.readdirSync(inDir);
    for (let file of files) {
        const filePath = `${inDir}/${file}`;
        const toFilePath = `${outDir}/${file}`;
        if (fs.statSync(filePath).isDirectory()) {
            fromDir(filePath, toFilePath, _files)
        } else {
            try {
                fs.accessSync(toFilePath);
            } catch (err) {
                _files.push({
                    fromFile: filePath,
                    toFile: toFilePath,
                });
            }
        }
    }
    return _files;
}

const rootDir = fs.realpathSync(process.cwd());
const screenshotDir = path.resolve(rootDir, './screenshotin');
const screenshotOutDir = path.resolve(rootDir, './screenshot');

const files = fromDir(screenshotDir, screenshotOutDir);

// 遍歷陣列,順序執行各任務
if (files.length === 0) {
    return;
}
let current = task(files[0]);
for (let i = 1; i < files.length; i++) {
    current = current.then(task(files[i]));
}
複製程式碼

執行 node tinify.js,即可批量壓縮 ./screenshotin 資料夾下的圖片啦

寫在最後

這個指令碼是用於壓縮我的部落格中的圖片,基本能滿足我的個人需求,其他情況並未考慮,希望能對有需要的小夥伴有幫助~~~

喜歡我的文章小夥伴可以去 我的個人部落格 點star ⭐️

相關文章