UNPKG

avg-cli

Version:

CLI tools for AVG.js

82 lines (66 loc) 2.84 kB
'use strict'; function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } const path = require('path'); const execFile = require('child_process').execFile; const cwebp = require('cwebp-bin'); const fs = require('fs-extra'); const ora = require('ora'); const getFileListByExtension = require('../utils/getFileListByExtension.js'); function execFilePromise(exec, params) { return new Promise((resolve, reject) => { execFile(exec, params, function (err) { if (err) { reject(err); } else { resolve(); } }); }); } function changeExtension(filename, ext) { const basename = filename.substr(0, filename.lastIndexOf('.')); return `${ basename }.${ ext }`; } /** * Convert all images in ./assets to webp format, * and output to ./dist/assets * * @param {string} dir project path */ module.exports = (() => { var _ref = _asyncToGenerator(function* (dir, options, onProgress) { let spinner = ora('正在优化图片...').start(); options = Object.assign({ lossless: false, quality: 90, sourceExtensions: ['png', 'jpg', 'jpeg', 'bmp'], // 目标扩展名设置目前是无效的,强制为webp+png targetExtension: 'webp' }, options); let compressOptions; if (options.lossless) { compressOptions = ['-lossless', '-z', '6']; } else { compressOptions = ['-af', '-q', options.quality]; } const fileList = yield getFileListByExtension(path.resolve(dir, 'assets'), [...options.sourceExtensions, ...options.targetExtension]); for (const file of fileList) { const originFilename = path.resolve(dir, 'assets', file); const targetFilename = path.resolve(dir, 'dist/assets', file); const webpFilename = changeExtension(path.resolve(dir, 'dist/assets', file), 'webp'); spinner.text = `正在优化图片...${ file }`; fs.ensureDirSync(path.dirname(webpFilename)); // 判断是否为 .webp 格式,若为是,直接拷贝,否则进行格式转换 if (path.extname(file) === `.${ options.targetExtension }`) { fs.copySync(originFilename, webpFilename); } else { fs.copySync(originFilename, targetFilename); yield execFilePromise(cwebp, [...compressOptions, originFilename, '-o', webpFilename]); } } spinner.succeed('优化图片'); }); return function (_x, _x2, _x3) { return _ref.apply(this, arguments); }; })();