jz-img-compress
Version:
压缩项目中的图片资源的自动化工具
97 lines (78 loc) • 2.71 kB
JavaScript
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')
})