UNPKG

jz-img-compress

Version:

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

97 lines (78 loc) 2.71 kB
const tinify = require('tinify') const chalk = require('chalk') const fs = require('fs') const { travelPaths, fileHash, resolveCache, overrideCache, output, isImage } = require('./util') const { resolveConfig } = require('./config') const debug = require('debug') const appDebug = debug('compress:app') appDebug('app start') // 读取用户配置 const configDebug = debug('compress:config') configDebug('resolve user config') const config = resolveConfig() configDebug('%O', config) // 检测key是否存在 if (!config.key) { console.warn( chalk.red('请配置api key'), ) process.exit(1) } tinify.key = config.key // 读取上次操作的缓存,避免浪费api资源 const cacheDebug = debug('compress:cache') cacheDebug(`read local cache from ${config.cacheFile}`) const cache = resolveCache(config.cacheFile) cacheDebug('%O', cache) const initCacheCount = cache.length // 图片资源的目录位置 const targets = config.targets // 解析出所有图片资源的路径 const travelDebug = debug('compress:travel') const files = [] travelDebug('travel all target files') for (const target of targets) { files.push(...travelPaths(target, isImage)) } travelDebug('%O', files) // 处理文件 let count = 0 const spinner = require('ora')(`compress image ${count}/${files.length}\n`).start() const tasks = files.map(file => new Promise((resolve) => { // 判断缓存是否命中 const hash = fileHash(file) if (cache.find(c => c.hash === hash)) { cacheDebug(`file ${file} hit cache`) spinner.text = `compress image ${++count}/${files.length}` resolve({type: 'ignore', file}) return } const originSize = fs.statSync(file).size tinify.fromFile(file).toFile(file).then(() => { // 写入缓存 cache.push({file, hash: fileHash(file)}) spinner.text = `compress image ${++count}/${files.length}` resolve({type: 'compressed', file, originSize, compressedSize: fs.statSync(file).size}) }).catch(err => { console.log('error:', err) setTimeout(() => { files.push(file) }, 2000) }) })) // 将本次的压缩结果写入缓存 Promise.all(tasks).then((results) => { spinner.succeed('压缩完成') results.forEach((c, i) => c['index'] = i+1) debug('compress result')(results) // 输入本次压缩的结果 output(results) }).then(() => { if (cache.length !== initCacheCount) { // 更新缓存文件 cacheDebug(`rewrite cache to ${config.cacheFile}`) cache.forEach((c, i) => c["index"] = i+1) overrideCache(JSON.stringify(cache, null, ' '), config.cacheFile) } appDebug('app end') })