electron 命令行参数的踩坑

vite + vue + ts + electron

想要为 electron 编译出来的程序加上命令行参数的控制,比如 app port address, 来让 app 在 port 端口上开启,并获得配置中心 address 的相关信息。

以下是 npm run dev 的插件配置

javascript 复制代码
export const ElectronDevPlugin = (): Plugin => {
    return {
        name: "electron-dev",
        configureServer(server) {
            server?.httpServer?.once("listening", () => {
                build()  // 编译 cjs 文件,可以忽视
                const addressInfo = server.httpServer?.address() as AddressInfo
                const IP = `http://localhost:${addressInfo.port}`
                // 用 electron 来编译 vue 生成的 dist
                var process = spawn(electron.toString(), ["dist/background.cjs", IP])
                fs.watchFile("src/background.ts", () => {
                    process.kill()
                    build()
                    process = spawn(electron.toString(), ["dist/background.cjs", IP])
                })
            })
        }
    }
}

spawn(electron.toString(), ["dist/background.cjs", IP]) 这一步本质上是调用了electron.exe dist/background.cjs IP 这段命令,导致一开始认为 electron.exe 的编译程序可以直接传入命令行参数,并通过process.argv的方式来获得传入的 IP 信息

以下是background.ts中的代码

arduino 复制代码
app.whenReady().then(() => {
    const win = new BrowserWindow({
        height: 600,
        width: 800,
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
            webSecurity: false,
        }
    }) 

    if (process.argv[2]) {
        win.loadURL(process.argv[2])
    } else {
        win.loadFile("index.html")
    }
})

这段代码其实就是将 electron.exe dist/background.cjs IP 编译时传入的 IP(process.argv[2]) 当作 app 的界面的源信息。

但在后来的测试之中发现,electron.exe 本身只支持两种参数 options 和 path

因此如果传入第三个参数进去的话,electron.exe 就会直接退出(不是你至少给个报错啊)

但是就像之前的 npm run dev 的插件代码中写的,直接使用 electron.exe 编译的话,是可以获取到 IP 的参数的,所以那段插件代码本质上是将 dist/background.cjs 填在了 path 的位置,而后边的 IP 则是靠着 electron 对命令行的监控不严混进去的(electron 允许最多两个参数),最终在 background.ts 之中被 process.argv 捕获,结果就导致了 electron 编译的时候好像可以传递命令行参数的错觉。

所以,如果 electron 编译后的程序想要传递命令行参数的话,应该直接在编译完成之后的 release 文件之中使用 ./app port address 来运行,然后如果 npm run dev 的插件采用的也是需要 process.argv 来进行一些操作的话,那么就需要将 npm run dev 对于 process.argv 的处理和 ./app 本身对于 process.argv 分开。

目前想到的要么就是 release 的时候直接从代码上换成另一套处理,要么就是 npm run dev 运行自己的脚本来进行手动的编译。

相关推荐
三声三视2 小时前
Electron 鸿蒙 PC 上关了子窗口,主窗口也卡死不动——我翻了 Chromium 源码才找到一行注释
electron·harmonyos·鸿蒙
随风一样自由1 天前
【前端+跨端技术新格局】Tauri vs Electron 完整性能对比(2026实测数据+底层原理)
前端·javascript·electron
Hyyy1 天前
每天一个知识点 —— Electron
electron
TrisighT2 天前
Electron 鸿蒙 PC 上点关闭就真退出了?我花了两天才把“最小化到托盘“做稳
electron·harmonyos
TrisighT3 天前
Electron 鸿蒙 PC 上做本地搜索,Fuse.js 比 SQLite 快 6 倍——但我愣是选了最慢的方案
electron·sqlite·harmonyos
薛定谔的猫-菜鸟程序员3 天前
从零构建一个“悬浮式“实时聊天室:Electron + Vue 3 + WebSocket + SQLite 全栈实践
vue.js·websocket·electron
TrisighT4 天前
Electron 鸿蒙 PC 上点外链唤醒应用,我试了 6 种写法只有 1 种能跑
前端·electron·harmonyos
TrisighT4 天前
Electron 跑鸿蒙 PC 上,这 4 个 API 的行为跟 Windows 完全不一样——但文档一行都没写
windows·electron·harmonyos
mCell9 天前
【锐评】桌面端技术营销:别拿跑分当工程判断
前端·rust·electron
TrisighT9 天前
Electron鸿蒙PC上写日志文件,我被权限和路径坑了两次
electron·harmonyos