当前位置: 首页 > news >正文

Electron + Vue2 IPC 通讯实例

项目需求, 一直在做 Electron 项目的 IPC 通讯, 顺便写一个 Electron + Vue2 实际混用示例发出来共同学习下,涵盖两种场景:


📌 场景

  1. 通知类(只告诉主进程做事,不关心返回值) → 用 send/on
    例子:渲染进程告诉主进程「用户点了检查更新」。

  2. 请求类(需要结果,像调用 API) → 用 invoke/handle
    例子:渲染进程请求主进程「获取当前版本号」。


🔹 主进程 (main.js)

import { app, BrowserWindow, ipcMain } from 'electron';let mainWindow;function createWindow() {mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true,contextIsolation: false, // Vue2 项目一般是 false}});mainWindow.loadURL('http://localhost:8080');
}// ------------------ send/on (通知类) ------------------
ipcMain.on('check-for-update', (event) => {console.log('渲染进程通知: 用户点击了检查更新按钮');// 这里可以触发更新逻辑,比如调用 autoUpdater.checkForUpdates()// 可以选择再给渲染进程发消息event.reply('update-status', { status: 'checking' });
});// ------------------ invoke/handle (请求类) ------------------
ipcMain.handle('get-app-version', async () => {console.log('渲染进程请求: 获取版本号');return app.getVersion(); // 直接返回给渲染进程
});app.whenReady().then(createWindow);

🔹 渲染进程 (Vue2 组件示例)

<template><div><button @click="checkUpdate">检查更新</button><button @click="getVersion">获取版本号</button><p>更新状态: {{ updateStatus }}</p><p>当前版本: {{ version }}</p></div>
</template><script>
const { ipcRenderer } = require('electron');export default {data() {return {updateStatus: '',version: ''};},created() {// 监听主进程返回的更新状态ipcRenderer.on('update-status', (event, data) => {this.updateStatus = data.status;});},methods: {// 只通知,不需要返回值checkUpdate() {ipcRenderer.send('check-for-update');},// 请求并等待返回值async getVersion() {this.version = await ipcRenderer.invoke('get-app-version');}}
};
</script>

🔑 运行效果

  • 点击「检查更新」 → 主进程日志输出 "用户点击了检查更新按钮",并且 UI 里的「更新状态」变成 "checking"
  • 点击「获取版本号」 → 主进程返回 app 版本号,UI 里的「当前版本」直接显示。

✅ 这样你就能在一个项目里同时用 send/on(事件通知)和 invoke/handle(请求-响应)。

这里演示了项目中的基本使用, 不过还有个小问题, 可能会重复绑定
那接下来我们就更新一步, 把 重复绑定防护写进去(避免 dev 热重载时监听器堆积)?
直接上代码


上面的混用示例加上 重复绑定防护,防止开发环境热重载或重复初始化导致 ipcMain.on 堆叠。


🔹 主进程(main.js)示例

import { app, BrowserWindow, ipcMain } from 'electron';let mainWindow;function createWindow() {mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true,contextIsolation: false, // Vue2 项目一般是 false}});mainWindow.loadURL('http://localhost:8080');
}// ------------------ send/on (通知类) ------------------
// 防止重复绑定
if (!ipcMain.listenerCount('check-for-update')) {ipcMain.on('check-for-update', (event) => {console.log('渲染进程通知: 用户点击了检查更新按钮');// 可以发送回渲染进程更新状态event.reply('update-status', { status: 'checking' });});
}// ------------------ invoke/handle (请求类) ------------------
// handle 不会重复堆叠,同一 channel 会覆盖
ipcMain.handle('get-app-version', async () => {console.log('渲染进程请求: 获取版本号');return app.getVersion();
});app.whenReady().then(createWindow);

🔹 渲染进程 (Vue2 组件示例)

<template><div><button @click="checkUpdate">检查更新</button><button @click="getVersion">获取版本号</button><p>更新状态: {{ updateStatus }}</p><p>当前版本: {{ version }}</p></div>
</template><script>
const { ipcRenderer } = require('electron');export default {data() {return {updateStatus: '',version: ''};},created() {// 防止重复绑定ipcRenderer.removeAllListeners('update-status');// 监听主进程返回的更新状态ipcRenderer.on('update-status', (event, data) => {this.updateStatus = data.status;});},methods: {// 只通知,不需要返回值checkUpdate() {ipcRenderer.send('check-for-update');},// 请求并等待返回值async getVersion() {this.version = await ipcRenderer.invoke('get-app-version');}}
};
</script>

🔑 特点

  1. send/on + 防重复

    • 主进程用 ipcMain.listenerCount('channel') 判断是否已经绑定。
    • 渲染进程用 ipcRenderer.removeAllListeners('channel') 先解绑,再绑定。
  2. invoke/handle

    • 主进程用 ipcMain.handle 覆盖旧 handler,不会重复。
    • 渲染进程用 await ipcRenderer.invoke() 获取返回值。
  3. 适合开发环境 HMR

    • 不会因为热重载或重新执行模块而导致监听器叠加。

本章完!


文章转载自:

http://W3fMrcJP.yqtry.cn
http://q0qmdVn2.yqtry.cn
http://HF8v71mi.yqtry.cn
http://PGULMItA.yqtry.cn
http://pDzFWGzy.yqtry.cn
http://UaIUDoZ9.yqtry.cn
http://o9LUR4QI.yqtry.cn
http://I5C8mfCB.yqtry.cn
http://86VPlJwa.yqtry.cn
http://MDM5NLUI.yqtry.cn
http://hBGRXf19.yqtry.cn
http://EFLgSCtw.yqtry.cn
http://cRAoNdPq.yqtry.cn
http://yXYFpBdf.yqtry.cn
http://WeJKeqFk.yqtry.cn
http://gznE6Jma.yqtry.cn
http://q7P3jg8H.yqtry.cn
http://6woYwc2M.yqtry.cn
http://BgZT1eTA.yqtry.cn
http://QN7BaEBN.yqtry.cn
http://CcIK84Sb.yqtry.cn
http://93rFOuW7.yqtry.cn
http://qoFdTjdW.yqtry.cn
http://vk1RSs2R.yqtry.cn
http://yrjCpxHa.yqtry.cn
http://o5C3kii8.yqtry.cn
http://jh7yKeo7.yqtry.cn
http://u3HubEaQ.yqtry.cn
http://puIpmmkK.yqtry.cn
http://s2XAj58f.yqtry.cn
http://www.dtcms.com/a/385965.html

相关文章:

  • 【工具代码】使用Python截取视频片段,截取视频中的音频,截取音频片段
  • 《百日战纪:最终防卫学园》体验版在Steam平台推出!
  • 服务器 IPMI 实战:从 BMC 认知到 ipmitool 命令行运维
  • Cancer Cell最新空间组学研究|香港科技大学王吉光/天坛医院江涛院士团队合作提出IDH突变型星形细胞瘤的新分类标准
  • MissionPlanner架构梳理之(十四)日志浏览
  • 搭建论坛用什么服务器好?论坛服务器配置要求
  • 两台电脑如何共享“共享文件夹”
  • 【第五章:计算机视觉-项目实战之图像分类实战】1.经典卷积神经网络模型Backbone与图像-(7)细粒度分类理论
  • vscode实现第三方包的使用,cmake结合vcpkg(跨平台)
  • RabbitMQ 常见使用场景详解:从理论到实践
  • 【QT随笔】什么是Qt元对象系统?Qt元对象系统的核心机制与应用实践
  • 紧急供应链投毒预警 | NPM生态再次遭受盗号攻击引发新一轮开源供应链投毒
  • MySQL——10、视图和用户管理
  • 热点供应链投毒预警 | 知名NPM开发者遭受邮件钓鱼引发大规模供应链投毒攻击
  • 机器学习-NLP中的微调
  • uniapp+<script setup lang=“ts“>单个时间格式转换(format)
  • 第8篇、Kafka 监控与调优实战指南
  • R 语言查看类库源码的方法
  • 理解并发编程:自旋锁、互斥锁与读写锁的解析
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频内容理解与智能预警升级
  • 腾讯元宝 Java 中的 23 种设计模式(GoF 设计模式)
  • Excel:根据数据信息自动生成模板数据(多个Sheet)
  • hibernate和mybatis的差异,以及这种类似场景的优缺点和选择
  • 设计模式之:观察者模式
  • 【pycharm】ubuntu24.04 安装配置index-tts及webdemo快速上手
  • Java 设计模式——观察者模式:从 4 种写法到 SpringBoot 进阶
  • “光敏” 黑科技:杜绝手机二维码读取时的 NFC 误触
  • AIGC(生成式AI)试用 36 -- shell脚本(辅助生成)
  • 【计算机网络 | 第17篇】DNS资源记录和报文
  • Flowise安全外网访问指南:基于cpolar的隧道配置详解