UNPKG

@mora/tinypng

Version:

基于 tinypng 封装的一个支持 `nodejs`、`命令行`和`webpack`的图片压缩工具

88 lines (87 loc) 5.45 kB
#!/usr/bin/env node "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var cli = require("mora-scripts/libs/tty/cli"); var table = require("mora-scripts/libs/tty/table"); var clog = require("mora-scripts/libs/sys/clog"); var prettyBytes_1 = require("mora-common/util/prettyBytes"); var path = require("path"); var fs = require("fs-extra"); var helper_1 = require("./helper"); var tinypng_1 = require("./tinypng"); var color = clog.format; cli({ usage: 'tinypng [options] <file1, file2, file3, ...>', version: require('../package.json').version, desc: [ color("%c\u914D\u7F6E\u6587\u4EF6\u793A\u4F8B\uFF08\u914D\u7F6E\u6587\u4EF6\u4E2D\uFF0C\u5982\u679C\u662F\u76F8\u5BF9\u76EE\u5F55\uFF0C\u5219\u662F\u76F8\u5BF9\u4E8E\u5F53\u524D\u914D\u7F6E\u6587\u4EF6\u6240\u5728\u7684\u6587\u4EF6\u5939\u7684\u76EE\u5F55\uFF09\n {\n \"tokens\": [\"...\", \"...\"], %c\u5FC5\u9700\u8BBE\u7F6E%c\n \"cacheDir\": \"/path/to/another/directory\", %c\u63A8\u8350\u8BBE\u7F6E\uFF0C\u5E76\u4E14\u52A0\u5165 git \u7248\u672C\u63A7\u5236%c\n \"recordFile\": \"/path/to/some/file\", %c\u63A8\u8350\u8BBE\u7F6E\uFF0C\u5E76\u4E14\u4E0D\u8981\u52A0\u5165 git \u7248\u672C\u63A7\u5236%c\n \"backupDir\": \"/path/to/backup/directory\",\n \"outputDir\": \"/path/to/output/directory\",\n \"proxy\": \"http://user:pass@192.168.0.1:8080\",\n \"resize\": {\n \"method\": 'fit' | 'scale' | 'cover'\n \"width\": number\n \"height\": number\n }\n }", 'gray', 'red', 'reset.gray', 'green', 'reset.gray', 'green', 'reset.gray') ] }) .options({ 'config': '<string> 配置文件路径,默认是在『当前目录』、『package.json目录』、『用户 home 目录』中第一次出现的: ./tinypng-config.js 或 tinypng-config.json 文件', 'b | backupDir': '<string> 备份目录,源文件会保存在这里,压缩后的文件会覆盖原源文件【命令行程序专有的配置】', 'o | outputDir': '<string> 输出目录, 源文件不会改变,压缩后的文件会保存在此;"backupDir""outputDir" 只需要设置一个即可,优先使用 "outputDir"【命令行程序专有的配置】', 'c | cacheDir': '<string> 缓存 tinypng 处理后的文件,避免重复处理,节省 api 调用次数', 't | tokens': '<string> tinypng 需要使用的 token,多个 token 请用逗号分隔,可以在官网 https://tinypng.com/ 用邮箱注册即可得到', 'r | recordFile': '<string> 记录文件,记录 token 使用或过期情况,给系统用的,对用户无意义,推建设置', 'p | proxy': '<string> 使用 tinypng 可能要翻墙,可以在此设置代理', 'resize': '<string> resize 图片,参数格式: "method|width|height",注意:使用了此选项不会对图片压缩', 'quiet': '<bool> 不输出 tinypng 压缩进度信息,但仍然会输出压缩结果' }) .parse(function (res) { var config = helper_1.getConfig(res); if (!config._.length) { return this.error('No input files'); } if ((!config.tokens || !config.tokens.length) && !config._.every(function (file) { return helper_1.isSvgFile(file); })) { return this.error('No available tokens'); } var tinypng = new tinypng_1.default({ tokens: config.tokens, recordFile: config.recordFile, cacheDir: config.cacheDir, proxy: config.proxy, resize: config.resize }); var tableDataMap = {}; var callback = function () { var head = [['File', 'Original Size', 'Tinified Size', 'Tinified Rate'].map(function (l) { return color("%c" + l, 'white.bold'); })]; var data = head.concat(config._.map(function (file) { return tableDataMap[file]; })); console.log(); console.log(table(data.map(function (list) { return list.map(function (item) { return ' ' + item; }); }))); console.log(); }; var cwd = process.cwd(); helper_1.runProgressTasks(config._.map(function (file) { return function (done) { var key = path.relative(cwd, file); var srcBuffer = fs.readFileSync(file); var original = srcBuffer.length; tinypng.tiny(file) .then(function (destBuffer) { var tinified = destBuffer.length; var rate = Math.round((original - tinified) * 100 / original); tableDataMap[file] = [key, prettyBytes_1.default(original), prettyBytes_1.default(tinified), color("%c" + (rate + '%'), rate > 50 ? 'red' : rate > 25 ? 'yellow' : rate > 0 ? 'green' : 'gray')]; if (config.outputDir) { helper_1.writeFileSync(path.join(config.outputDir, path.basename(key)), tinified < original ? destBuffer : srcBuffer); } else { if (config.backupDir) { helper_1.writeFileSync(path.join(config.backupDir, key).replace(/\.\./g, '.'), srcBuffer); } if (tinified < original) { helper_1.writeFileSync(file, destBuffer); } } done(file); }) .catch(function (e) { tableDataMap[file] = [key, prettyBytes_1.default(original), '--', '--']; console.error(e); done(file); }); return file; }; }), callback, { indent: ' ', quiet: config.quiet === true }); });