图片压缩工具 | 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}`))
}
相关推荐
猪八戒1.015 分钟前
onenet接口
开发语言·前端·javascript·嵌入式硬件
程序猿小蒜18 分钟前
基于Spring Boot的宠物领养系统的设计与实现
java·前端·spring boot·后端·spring·宠物
合作小小程序员小小店18 分钟前
web网页开发,在线%食堂管理%系统,基于Idea,html,css,jQuery,java,ssm,mysql。
java·前端·mysql·html·intellij-idea·jquery
h***839324 分钟前
JavaScript开源
开发语言·javascript·ecmascript
人工智能训练31 分钟前
Windows中如何将Docker安装在E盘并将Docker的镜像和容器存储在E盘的安装目录下
linux·运维·前端·人工智能·windows·docker·容器
Z***258037 分钟前
JavaScript虚拟现实案例
开发语言·javascript·vr
90后小陈老师41 分钟前
用户管理系统 07 项目前端初始化 | 新手实战 | 期末实训 | Java+SpringBoot+Vue
java·前端·spring boot
小溪彼岸1 小时前
一键切换Cluade、Codex供应商配置,CC Switch你值得一试
前端
2501_916008891 小时前
API接口调试全攻略 Fiddler抓包工具、HTTPS配置与代理设置实战指南
前端·ios·小程序·https·fiddler·uni-app·webview
Halo_tjn1 小时前
Set集合专项实验
java·开发语言·前端·python