@mora/tinypng
Version:
基于 tinypng 封装的一个支持 `nodejs`、`命令行`和`webpack`的图片压缩工具
88 lines (87 loc) • 5.45 kB
JavaScript
#!/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
});
});