交互式命令行工具之压缩图片

523 阅读1分钟

交互时命令行,选择对应文件夹压缩图片文件夹中所有图片极其子图片

// http://tinify.com
const tinify = require('tinify')
// https://www.npmjs.com/package/inquirer
const inquirer = require('inquirer')
const fs = require('fs')
const path = require('path')
const chalk = require('chalk')
// const md5File = require('md5-file')

tinify.key = "YOUR_API_KEY"
// console.log(chalk`{hex('#06f') 

const questions = [
  {
    type: 'list',
    name: 'homeDirectory',
    message: 'Please select the home directory to be compressed',
    choices: ['A', 'B'],
    default: 'A',
  },
  {
    type: 'list',
    name: 'dir',
    message: 'Please select the page to be compressed',
    choices: function(answers) {
      const { homeDirectory } = answers
      PAGE_ROOT_PATH = homeDirectory === 'A' ? './src/aDirectory/' : './src/bDirectory/'
      dirs = fs.readdirSync(PAGE_ROOT_PATH)
      dirs.sort((a, b) => {
        return fs.statSync(PAGE_ROOT_PATH + b).mtime.getTime() -
          fs.statSync(PAGE_ROOT_PATH + a).mtime.getTime()
      })
      return dirs
    },
  }
]

let PAGE_ROOT_PATH = './src/pages/'
let dirs = null

const imgFilePathArr = []
function deepGetDirectories(distPath) {
  const dirArr = fs.readdirSync(distPath)
  dirArr.forEach(file => {
    if (fs.statSync(distPath + file).isDirectory()) {
      deepGetDirectories(distPath + file+'/')
    } else {
      if (file.match(/(\.png|\.jpg|\.jpeg)$/)) {
        imgFilePathArr.push(path.resolve(distPath + file))
      } 
    }
  })
}

inquirer.prompt(questions).then(({ dir }) => {
  console.log(chalk`\r\n{hex('#090') 开始压缩:${PAGE_ROOT_PATH + dir }/img}\r\n`)
  // let db = JSON.parse(fs.readFileSync(__dirname + '/db.json', 'utf8'))
  deepGetDirectories(PAGE_ROOT_PATH + dir + '/img/')
  imgFilePathArr.forEach(file => {
    // const hash = md5File.sync(file)
    // if (hash !== db[file]) {
      const source = tinify.fromFile(file)
      source.toFile(file).then(() => {
        // db[file] = md5File.sync(file)
        // fs.writeFileSync(__dirname + '/db.json', JSON.stringify(db))
        console.log(chalk`{hex('#09f') 压缩完成:${file}}`)
      })
    // } else {
      // console.log(chalk`{hex('#0f9') 文件无需压缩:${file}}`)
    // }
  })
})
// 最后配置脚本 "compress": "node ./xx/compressor.js"
// 命令行:npm run compress