图片压缩工具 | Electron应用配合 commander 提供命令行调用功能

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}`))
}
相关推荐
恋猫de小郭9 小时前
Flutter Zero 是什么?它的出现有什么意义?为什么你需要了解下?
android·前端·flutter
崔庆才丨静觅15 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby606116 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了16 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅16 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅16 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅17 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment17 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅17 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊17 小时前
jwt介绍
前端