jz-img-compress
Version:
压缩项目中的图片资源的自动化工具
98 lines (87 loc) • 2.63 kB
JavaScript
const path = require('path');
const fs = require('fs');
const crypto = require('crypto');
/**
* 遍历给定目录下的指定文件
* @param {String} root 根目录
* @param {Function} filter 过滤器
* @returns {[String]}
*/
function travelPaths(root, filter) {
let paths = [];
const entries = fs.readdirSync(root, { withFileTypes: true });
let filepath;
for (const entry of entries) {
filepath = path.join(root, entry.name);
if (entry.isFile() && filter(filepath)) {
paths.push(filepath);
} else if (entry.isDirectory()) {
paths.push(...travelPaths(filepath, filter));
}
}
return paths;
}
/**
* 检测是否是图片文件(目前 tinypng.com 只支持 png/jpg/jpeg 类型的图片)
* @param file
*/
function isImage(file) {
return ['.png', '.jpg', '.jpeg'].includes(path.extname(file))
}
/**
* 计算文件md5
* @param file
* @returns {string}
*/
function fileHash(file) {
const buffer = fs.readFileSync(file)
return crypto.createHash('md5').update(buffer).digest('hex')
}
/**
* 解析缓存
* @param {string} cacheFile 缓存文件位置
*/
function resolveCache(cacheFile) {
let cache = []
if (fs.existsSync(cacheFile)) {
const content = fs.readFileSync(cacheFile).toString('utf8')
if (content) {
cache.push(...JSON.parse(content))
}
}
return cache
}
/**
* 覆盖缓存
* @param data 缓存数据
* @param {string} cacheFile 缓存文件位置
*/
function overrideCache(data, cacheFile) {
// 检查缓存文件是否存在
if (!fs.existsSync(cacheFile)) {
fs.mkdirSync(path.dirname(cacheFile), {recursive: true})
}
fs.writeFileSync(cacheFile, data, {flag: 'w'})
}
function output(results) {
const originSize = results.filter(r => r.type === 'compressed').reduce((size, item) => size + item.originSize, 0)
const compressedSize = results.filter(r => r.type === 'compressed').reduce((size, item) => size + item.compressedSize, 0)
const msg = `
====> 本次压缩结果汇总 <====
处理文件总数: ${results.length}
缓存命中数: ${results.filter(r => r.type === 'ignore').length}
实际压缩文件数: ${results.filter(r => r.type === 'compressed').length}
原始文件总大小: ${(originSize / 1000).toFixed(2)}kB
压缩文件总大小: ${(compressedSize / 1000).toFixed(2)}kB
压缩率: ${((originSize - compressedSize) / originSize * 100).toFixed(2)}%`
console.log(msg)
console.log()
}
module.exports = {
travelPaths,
isImage,
fileHash,
resolveCache,
overrideCache,
output,
}