图片压缩工具 | 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}`))
}
相关推荐
markyankee10110 分钟前
JavaScript 作用域与闭包详解
前端·javascript
gufs镜像10 分钟前
Swift学习总结——使用Playground
前端·ios·面试
高冷的小明10 分钟前
React-Find 一款能快速在网页定位到源码的工具,支持React19.x/next 15
前端·javascript·react.js
parade岁月11 分钟前
从浏览器存储到web项目中鉴权的简单分析
前端·后端
默默地写代码22 分钟前
微信小程序 新版canvas绘制名片
前端·javascript·微信小程序
weixin_4565881523 分钟前
【web 安全】从 HTTP 无状态到现代身份验证机制
前端·web安全·http
BillKu27 分钟前
Element Plus 对话框 el-dialog 和 抽屉 el-drawer 的使用注意项(使用 div 包裹)
javascript·vue.js·elementui
luckymiaow27 分钟前
「从零到一打造现代桌面应用:基于 Electron + Vite + Vue3 + TypeScript 的高效开发模板」
前端·vue.js
layman052828 分钟前
Vue 中的配置代理
前端·javascript·vue.js
BillKu34 分钟前
Vue3 + TypeScript 中 hook 优化记录
开发语言·javascript·typescript