vue 中配置图片压缩 (tinify)

配置原则:压缩后的图片替换原图片

安装依赖

npm install glob --save-dev
npm install tinify --save-dev

项目根目录创建配置文件 .tinify.config

entry = dist/**/*.?(jpg|png)
key = you tinify key

获取配置文件信息

const _config = glob.sync('.tinify.config')
const _configFile = _config && _config[0]

if (!_configFile) {
  console.log(chalk.red('please build the .tinify.config file in this project.'))
  return false
}

获取所有要压缩的图片

config.entries.forEach((entry) => {
  const res = glob.sync(entry)

  if (Object.prototype.toString.call(res).slice(8, -1).toLowerCase() === 'array') {
    files = files.concat(res)
  } else {
    files = files.concat([res])
  }
})

tinify.js 脚本

node tinify.js
const fs = require('fs')
const glob = require('glob')
const tinify = require('tinify')
const inquirer = require('inquirer')
const chalk = require('chalk')

const _config = glob.sync('.tinify.config')
const _configFile = _config && _config[0]

if (!_configFile) {
  console.log(chalk.red('please build the .tinify.config file in this project.'))
  return false
}

const configContents = fs.readFileSync(_configFile, {
  encoding: 'utf8'
})

const param = function (key, contents) {
  const reg = new RegExp(`${key}\\s*=\\s*(\\S+)\\s*`, 'g')
  const data = []

  if (contents.match(reg)) {
    contents.match(reg).forEach((item) => {
      const _reg = new RegExp(`${key}\\s*=\\s*(\\S+)\\s*`)

      data.push(item.match(_reg) && item.match(_reg)[1])
    })
  }

  return data
}

/**
 * 压缩替换文件
 * @param {Array} files 所有要压缩的文件
 * @param {Number} fileIndex 当前要要压缩的文件的索引
 * @param {Number} keyIndex 当前使用的key的索引
 */
const transform = function (files, fileIndex = 0, keyIndex = 0) {
  if (!config.keys[keyIndex] || fileIndex >= files.length) return false

  const file = files[fileIndex]
  const timeStamp = new Date().getTime()
  tinify.key = config.keys[keyIndex]

  tinify.fromFile(file).toFile(file).then(() => {
    console.log(chalk.green(`${file}: transform success (${new Date().getTime() - timeStamp}ms)`))
    transform(files, fileIndex + 1, keyIndex)
  }).catch((error) => {
    if (error instanceof tinify.AccountError) {
      console.log(chalk.yellow(`${file}: change another key retransform.`))
      transform(files, fileIndex, keyIndex + 1)
    } else {
      console.log(chalk.red(`${file}: ${error}`))
    }
  })
}

const config = {
  keys: param('key', configContents),
  entries: param('entry', configContents)
}

if (config.entries.length < 1) return

let files = []

// 获取所有要压缩的文件
config.entries.forEach((entry) => {
  const res = glob.sync(entry)

  if (Object.prototype.toString.call(res).slice(8, -1).toLowerCase() === 'array') {
    files = files.concat(res)
  } else {
    files = files.concat([res])
  }
})

inquirerName = 'choose files'

inquirer.prompt({
  type: 'checkbox',
  name: inquirerName,
  choices: Array.from(new Set(files)),
  default: Array.from(new Set(files))
}).then((res) => {
  // 开始压缩文件
  transform(res[inquirerName])
})

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 3,917评论 0 5
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,142评论 1 32
  • 在现在的前端开发中,前后端分离、模块化开发、版本控制、文件合并与压缩、mock数据等等一些原本后端的思想开始...
    Charlot阅读 5,489评论 1 32
  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 5,324评论 4 31
  • 更新:Webpack4已经发布,本篇是基于Webpack3的,请注意。更正:1.package.json中使用了应...
    HermitCarb阅读 1,244评论 2 4