在寫個人部落格時,經常需要使用到圖片,為了優化文章的閱讀體驗,需要對圖片進行壓縮,現在有很多好用的圖片壓縮網站,比如: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 ⭐️