UNPKG

jz-img-compress

Version:

压缩项目中的图片资源的自动化工具

98 lines (87 loc) 2.63 kB
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, }