Electron主进程渲染进程间通信的方式

在 Electron 中,主进程和渲染进程之间的通信主要通过 IPC(进程间通信)机制实现。以下是几种常见的通信方式:

1. 渲染进程向主进程发送消息(单向)

渲染进程可以通过 ipcRenderer.send 向主进程发送消息,主进程通过 ipcMain.on 监听消息。

主进程代码
const { app, BrowserWindow, ipcMain } = require('electron');
const path = require('node:path');function createWindow() {const mainWindow = new BrowserWindow({webPreferences: {preload: path.join(__dirname, 'preload.js'),},});mainWindow.loadFile('index.html');
}app.whenReady().then(createWindow);ipcMain.on('message-from-renderer', (event, arg) => {console.log('Received message:', arg);// 可以通过 event.reply 向渲染进程回复event.reply('message-from-main', `Received your message: ${arg}`);
});
预加载脚本(preload.js
const { contextBridge, ipcRenderer } = require('electron');contextBridge.exposeInMainWorld('electronAPI', {sendMessage: (message) => ipcRenderer.send('message-from-renderer', message),
});
渲染进程代码(HTML/JS)
<script>window.electronAPI.sendMessage('Hello from Renderer Process!');
</script>

2. 渲染进程向主进程发送消息并等待响应(双向)

从 Electron 7 开始,推荐使用 ipcRenderer.invokeipcMain.handle 进行双向通信。

主进程代码
ipcMain.handle('dialog:openFile', async () => {const { canceled, filePaths } = await dialog.showOpenDialog();if (!canceled) {return filePaths[0];}
});
预加载脚本(preload.js
const { contextBridge, ipcRenderer } = require('electron');contextBridge.exposeInMainWorld('electronAPI', {openFile: () => ipcRenderer.invoke('dialog:openFile'),
});
渲染进程代码
window.electronAPI.openFile().then((filePath) => {console.log('Selected file:', filePath);
});

3. 主进程向渲染进程发送消息

主进程可以通过 webContents.send 向特定的渲染进程发送消息。

主进程代码
const { app, BrowserWindow, Menu } = require('electron');
const path = require('node:path');function createWindow() {const mainWindow = new BrowserWindow({webPreferences: {preload: path.join(__dirname, 'preload.js'),},});mainWindow.loadFile('index.html');const menu = Menu.buildFromTemplate([{label: app.name,submenu: [{click: () => mainWindow.webContents.send('update-counter', 1),label: 'Increment',},{click: () => mainWindow.webContents.send('update-counter', -1),label: 'Decrement',},],},]);Menu.setApplicationMenu(menu);
}app.whenReady().then(createWindow);
预加载脚本(preload.js
const { contextBridge, ipcRenderer } = require('electron');contextBridge.exposeInMainWorld('electronAPI', {onUpdateCounter: (callback) => ipcRenderer.on('update-counter', (_event, value) => callback(value)),
});
渲染进程代码
window.electronAPI.onUpdateCounter((value) => {const counter = document.getElementById('counter');const newValue = parseInt(counter.innerText, 10) + value;counter.innerText = newValue;
});

4. 渲染进程之间的通信

渲染进程之间不能直接通信,但可以通过主进程作为中介。例如,一个渲染进程向主进程发送消息,主进程再将消息转发给另一个渲染进程。

主进程代码
ipcMain.on('message-from-renderer1', (event, arg) => {// 转发消息到另一个渲染进程const otherWindow = BrowserWindow.getAllWindows().find((win) => win !== event.sender.window);if (otherWindow) {otherWindow.webContents.send('message-from-renderer1', arg);}
});
渲染进程代码(发送消息)
window.electronAPI.sendMessage('Hello from Renderer 1!');
渲染进程代码(接收消息)
window.electronAPI.onMessage((message) => {console.log('Received message from Renderer 1:', message);
});

注意事项

  • 安全性:默认情况下,渲染进程无法直接访问 Node.js 和 Electron 模块。需要通过预加载脚本(preload.js)和 contextBridge 暴露必要的 API。
  • 性能:尽量避免使用同步通信(如 ipcRenderer.sendSync),因为它会阻塞渲染进程。
  • 上下文隔离:启用上下文隔离(contextIsolation: true)可以提高应用的安全性。

通过这些方法,可以在 Electron 应用中实现主进程和渲染进程之间的高效通信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902756.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++基础知识】C++类型特征组合:`disjunction_v` 和 `conjunction_v` 深度解析

这两个模板是C17引入的类型特征组合工具&#xff0c;用于构建更复杂的类型判断逻辑。下面我将从技术实现到实际应用进行全面剖析&#xff1a; 一、基本概念与C引入版本 1. std::disjunction_v (逻辑OR) 引入版本&#xff1a;C17功能&#xff1a;对多个类型特征进行逻辑或运算…

私有知识库 Coco AI 实战(二):摄入 MongoDB 数据

在之前的文章中&#xff0c;我们介绍过如何使用《 Logstash 迁移 MongoDB 数据到 Easyseach》&#xff0c;既然 Coco AI 后台数据存储也使用 Easysearch&#xff0c;我们能否直接把 MongoDB 的数据迁移到 Coco AI 的 Easysearch&#xff0c;使用 Coco AI 对数据进行检索呢&…

sql server 与navicat测试后,连接qt

先用Navicat测试和sql的连通性&#xff0c;Navicat和sql连通之后&#xff0c;qt也能和sql连通了。 Navicat和Sqlserver Management 能连上&#xff0c;项目无法连接本地 Navicat 连接SQLServer 数据库 QT国内镜像网站 Navicat连接SqlServer的问题点 Sql Server的基本配置以及使…

2025年3月电子学会青少年机器人技术(六级)等级考试试卷-理论综合

青少年机器人技术等级考试理论综合试卷&#xff08;六级&#xff09; 分数&#xff1a;100 题数&#xff1a;30 一、单选题(共20题&#xff0c;共80分) 1. 2025年初&#xff0c;中国科技初创公司深度求索在大模型领域迅速崛起&#xff0c;其开源的大模型成为全球AI领域的焦…

spark local模式搭建运行示例

Apache Spark 是一个强大的分布式计算框架&#xff0c;但在本地模式下&#xff0c;它也可以作为一个单机程序运行&#xff0c;非常适合开发和测试阶段。以下是一个简单的示例&#xff0c;展示如何在本地模式下搭建和运行 Spark 程序。 一、环境准备 安装 Java Spark 需要 Java…

【人工智能】解锁 AI 潜能:DeepSeek 大模型迁移学习与特定领域微调的实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大型语言模型(LLMs)的快速发展,迁移学习与特定领域微调成为提升模型性能的关键技术。本文深入探讨了 DeepSeek 大模型在迁移学习中的…

视频智能分析平台EasyCVR无线监控:全流程安装指南与功能应用解析

在当今数字化安防时代&#xff0c;无线监控系统的安装与调试对于保障各类场所的安全至关重要。本文将结合EasyCVR视频监控的强大功能&#xff0c;为您详细阐述监控系统安装过程中的关键步骤和注意事项&#xff0c;帮助您打造一个高效、可靠的监控解决方案。 一、调试物资准备与…

【k8s系列7-更新中】kubeadm搭建Kubernetes高可用集群-三主两从

主机准备 结合前面的章节,这里需要5台机器,可以先创建一台虚拟机作为基础虚拟机。优先把5台机器的公共部分优先在一台机器上配置好 1、配置好静态IP地址 2、主机名宇IP地址解析 [root@localhost ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost…

【Java后端】MyBatis 与 MyBatis-Plus 如何防止 SQL 注入?从原理到实战

在日常开发中&#xff0c;SQL 注入是一种常见但危害巨大的安全漏洞。如果你正在使用 MyBatis 或 MyBatis-Plus 进行数据库操作&#xff0c;这篇文章将带你系统了解&#xff1a;这两个框架是如何防止 SQL 注入的&#xff0c;我们又该如何写出安全的代码。 什么是 SQL 注入&#…

数据分析案例:医疗健康数据分析

目录 数据分析案例:医疗健康数据分析1. 项目背景2. 数据加载与预处理2.1 加载数据2.2 数据清洗3. 探索性数据分析(EDA)3.1 再入院率概览3.2 按年龄分组的再入院率3.3 住院时长与再入院4. 特征工程与可视化5. 模型构建与评估5.1 数据划分5.2 训练逻辑回归5.3 模型评估6. 业务…

3台CentOS虚拟机部署 StarRocks 1 FE+ 3 BE集群

背景&#xff1a;公司最近业务数据量上去了&#xff0c;需要做一个漏斗分析功能&#xff0c;实时性要求较高&#xff0c;mysql已经已经不在适用&#xff0c;做了个大数据技术栈选型调研后&#xff0c;决定使用StarRocks StarRocks官网&#xff1a;StarRocks | A High-Performa…

软件设计师/系统架构师---计算机网络

概要 什么是计算机网络&#xff1f; 计算机网络是指将多台计算机和其他设备通过通信线路互联&#xff0c;以便共享资源和信息的系统。计算机网络可以有不同的规模&#xff0c;从家庭网络到全球互联网。它们可以通过有线&#xff08;如以太网&#xff09;或无线&#xff08;如W…

1.5软考系统架构设计师:架构师的角色与能力要求 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析

超简记忆要点 角色职责 需求规划→架构设计→质量保障 能力要求 技术&#xff08;架构模式/性能优化&#xff09; 业务&#xff08;模型抽象→技术方案&#xff09; 管理&#xff08;团队协作/风险控制&#xff09; 知识体系 基础&#xff1a;CAP/设计模式/网络协议案例&am…

基于STM32的汽车主门电动窗开关系统设计方案

芯片和功能模块选型 主控芯片 STM32F103C8T6:基于 ARM Cortex - M3 内核,有丰富的 GPIO 接口用于连接各类外设,具备 ADC 模块可用于电流检测,还有 CAN 控制器方便实现 CAN 总线通信。它资源丰富、成本低,适合学生进行 DIY 项目开发。按键模块 轻触按键:用于控制车窗的自…

第十三届蓝桥杯 2022 C/C++组 修剪灌木

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; P8781 [蓝桥杯 2022 省 B] 修…

6.学习笔记-SpringMVC-拦截器(P71-P74)

1.拦截器简介 拦截器的底层思想是AOP思想 2.拦截器入门案例 &#xff08;一&#xff09;制作拦截器的功能类 一般情况下&#xff0c;拦截器都是给表现层用的&#xff0c;所以创建在controller下。 &#xff08;二&#xff09;配置拦截器的执行位置 在projectinterceptor.…

GAIA-2:用于自动驾驶的可控多视图生成世界模型

25年3月来自英国创业公司 Wayze 的论文“GAIA-2: A Controllable Multi-View Generative World Model for Autonomous Driving”。&#xff08;注&#xff1a;23年9月其发布GAIA-1&#xff09; 生成模型为模拟复杂环境提供一种可扩展且灵活的范例&#xff0c;但目前的方法不足…

《算法笔记》10.4小节——图算法专题->最短路径 问题 D: 最短路径

题目描述 有n个城市m条道路&#xff08;n<1000, m<10000)&#xff0c;每条道路有个长度&#xff0c;请找到从起点s到终点t的最短距离和经过的城市名。 输入 输入包含多组测试数据。 每组第一行输入四个数&#xff0c;分别为n&#xff0c;m&#xff0c;s&#xff0c;t…

深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret

目录 深度解析 Kubernetes 配置管理&#xff1a;如何安全使用 ConfigMap 和 Secret一、目录结构二、ConfigMap 和 Secret 的创建1. 创建 ConfigMapconfig/app-config.yaml&#xff1a;config/db-config.yaml&#xff1a; 2. 创建 Secretsecrets/db-credentials.yaml&#xff1a…

数据库之mysql优化

1.引擎&#xff1a; 1.1查看引擎&#xff1a; mysql> show engines; mysql> SHOW VARIABLES LIKE %storage_engine%; mysql> show create table t1; ---查看建表信息1.2 临时指定引擎&#xff1a; mysql> create table innodb1(id int)engineinnodb; 1.3修改…