OPEN-IMAGE-TINY,一个基于 Electron + VUE3 的图片压缩工具,项目开源地址:https://github.com/0604hx/open-image-tiny
功能描述
应用程序的命令行调用功能允许用户通过终端(如Windows的CMD/PowerShell或Linux/macOS的Terminal)直接输入命令与程序交互,无需图形界面。
关于 commander
Commander 是 Node.js 最流行的命令行工具库,用于快速构建 CLI 应用程序。它提供了声明式语法、参数解析、帮助生成等特性,简化命令行开发。
示例代码:
js
const { program } = require('commander');
program
.name('my-cli')
.description('一个示例CLI工具')
.version('1.0.0');
program
.command('greet <name>')
.option('-c, --capitalize', '大写输出')
.action((name, options) => {
let output = options.capitalize ? name.toUpperCase() : name;
console.log(`Hello, ${output}!`);
});
program.parse(); // 解析命令行输入
代码实现
我们在 electron 应用启动时,判断命令行参数的个数,如果超过正常启动的范围,则视为命令行方式调用。
js
// electron/main.js
const handleCli = require('./cli')
if(process.argv.length > (app.isPackaged?1:2)){
(async ()=>{
//处理命令行
await handleCli()
setTimeout(app.quit, 200)
})();
}
else{
//创建 GUI 窗口
}
js
// electron/cli.js
const pkg = require('../package.json')
const { Command } = require("commander")
const pc = require('picocolors')
const { splitImageVertical, convertFormat } = require('./tool')
const toInt = v=>parseInt(v)
module.exports = async()=>{
const cli = new Command()
cli.command("convert <file>")
.alias("c")
.description(`转换图片格式(支持 ${pc.green("JPG/PNG/WEBP/AVIF")})`)
.option("-q, --quality [number]", "下载文件", toInt, 100 )
.option("-t, --target [string]", "目标格式", "WebP")
.option("--resize [string]", "裁剪方式,width=按宽度、height=按高度")
.option("--resizeValue [number]", "裁剪大小/单位px", toInt)
.option("-r, --rotate [number]", "旋转角度", toInt)
.action(async (/**@type {String} */file, /**@type {import('./tool').ConvertConfig} */ps)=>{
await convertFormat(file, null, ps)
})
cli.command("split <file>")
.alias("s")
.description("垂直切割图片")
.option("-h, --height [number]", "切割高度/单位px", toInt, 1000)
.option("-f, --fit [boolean]", "高度不足时自动填充", true)
.option("-c, --color [string]", "填充高度", "#ffffff")
.action(async (/**@type {String} */file, /**@type {import('./tool').SplitConfig} */ps)=>{
await splitImageVertical(file, ps)
})
cli
.name(pkg.name)
.description(pkg.description)
.version(pkg.version)
.parseAsync()
.catch(e=>console.error(`${pc.red("命令行执行出错:")}${e}`))
}
