Electron基础(二) 进程通信的ipcMain、contextBridge、ipcRenderer

1.什么是ipcMain

在 Electron 中,ipcMain是一个非常重要的模块,它负责处理从渲染器进程(即 Web 页面)发送到主进程(即 Electron 应用的后台进程)的进程间通信(IPC,Inter-Process Communication)消息。简而言之,ipcMain是主进程中用于监听和处理来自渲染器进程的 IPC 消息的一个接口。

Electron 应用的架构通常分为两部分:主进程和渲染器进程。主进程负责创建和管理窗口、处理系统事件、调用系统 API 等,而渲染器进程则负责渲染 HTML、CSS 和 JavaScript,与用户进行交互。由于安全原因,Electron 限制了渲染器进程直接访问系统资源的能力,因此,当渲染器进程需要与主进程通信以执行某些任务(如打开文件对话框、最小化窗口、关闭应用等)时,就需要使用 IPC 机制。

// 主进程 main.js 中const { app, BrowserWindow, ipcMain } = require('electron');  function createWindow() {  const win = new BrowserWindow({  width: 800,  height: 600,  webPreferences: {  nodeIntegration: true, // 注意:出于安全考虑,通常不建议启用 nodeIntegration  contextIsolation: false, // 当启用 nodeIntegration 时,通常也需要设置 contextIsolation 为 false(但不推荐这样做)  enableRemoteModule: true // 在新版本的 Electron 中,enableRemoteModule 默认为 false,并且不推荐使用  // 更好的做法是使用 contextBridge 和 preload 脚本来安全地暴露 API  }  });  // 监听渲染器进程发送的 'ping' 消息  ipcMain.on('ping', (event, arg) => {  console.log(`Received ping from renderer process: ${arg}`);  // 回复渲染器进程  event.reply('pong', `Pong from main process: ${arg}`);  });  win.loadFile('index.html');  
}  app.whenReady().then(createWindow);
// 渲染进程 preload.js预加载脚本,暴露 APIconst { ipcRenderer } = require('electron');  // 发送 'ping' 消息到主进程  
ipcRenderer.send('ping', 'Hello from renderer');  // 监听主进程的回复  
ipcRenderer.on('pong', (event, arg) => {  console.log(`Received pong from main process: ${arg}`);  
});

2.什么是contextBridge

contextBridge在Electron框架中扮演着至关重要的角色,其主要作用是在渲染器进程(通常是Web页面)和主进程之间安全地暴露API。具体来说,contextBridge通过创建一个单向的、只能从主进程到渲染器进程的桥接,实现了两个进程之间的安全通信。以下是contextBridge作用的详细解析:

1. 安全通信

  • 单向桥接:contextBridge确保了API的暴露是单向的,即从主进程到渲染器进程,从而避免了渲染器进程直接访问Node.js的API,这有助于防止潜在的安全问题。
  • 隔离上下文:Electron的contextIsolation特性(当启用时)将渲染器进程的上下文与Node.js环境隔离开来,以防止恶意脚本访问敏感API。contextBridge在这种隔离的上下文中提供了一个安全的桥梁,允许开发者在保持隔离的同时,将必要的API暴露给渲染器进程。

2. API暴露

  • 暴露有限API:开发者可以通过contextBridge.exposeInMainWorld方法将特定的方法和属性从主进程暴露到渲染器进程的window对象上。这样,渲染器进程中的JavaScript代码就可以安全地调用这些API,而无需直接访问Node.js环境。
  • 参数检查和过滤:在暴露API时,开发者可以在exposeInMainWorld的回调函数中添加参数检查和过滤逻辑,以确保传递给主进程的数据是合法和安全的。

3. 示例用法

// 在 preload.js 中  
const { contextBridge, ipcRenderer } = require('electron');  contextBridge.exposeInMainWorld('electronAPI', {  send: (channel, data) => {  // 在这里可以进行一些参数检查  ipcRenderer.send(channel, data);  },  invoke: async (channel, data) => {  // 在这里可以进行一些参数检查  return await ipcRenderer.invoke(channel, data);  }  
});  // 在渲染器进程的 JavaScript 中  
window.electronAPI.send('some-channel', 'some-data');  
const result = await window.electronAPI.invoke('some-channel', 'some-data');

3.什么是ipcRenderer

ipcRenderer 是 Electron 框架中用于渲染器进程(通常是 Web 页面)与主进程之间进行进程间通信(IPC, Inter-Process Communication)的模块。它允许渲染器进程发送同步或异步消息到主进程,并接收主进程的响应。

在 Electron 应用中,主进程负责控制整个应用的生命周期,包括窗口的创建和管理、系统事件的监听等,而渲染器进程则负责页面的渲染和与用户的交互。由于安全原因,渲染器进程不能直接访问系统资源或执行某些敏感操作,这些操作需要通过 IPC 机制与主进程通信来完成。

ipcRenderer模块提供了一系列的方法来实现这一通信机制,包括:(

  • ipcRenderer.send(channel, ...args):发送一个同步消息到主进程,并通过 channel 标识消息的类型,...args  是传递给主进程的参数。这个方法不会等待主进程的响应。
  • ipcRenderer.sendSync(channel , ...args):发送一个同步消息到主进程,并等待主进程的响应。这个方法会阻塞渲染器进程的 JavaScript 线程,直到收到主进程的响应或发生错误。
  • ipcRenderer.invoke(channel , ...args):发送一个异步消息到主进程,并返回一个 Promise。当主进程处理完消息并返回结果时,Promise 会被解析。这个方法提供了一种更现代、基于 Promise 的方式来处理异步 IPC 调用。
  • ipcRenderer.on(channel , listener):监听指定 channel 上的消息。当主进程通过相同的 channel发送消息到渲染器进程时,会触发相应的监听器函数。
  • ipcRenderer.removeListener(channel, listener):移除之前通过 ipcRenderer.on添加的监听器。

在渲染器进程中,你可以通过 require('electron').ipcRenderer 来访问 ipcRenderer 模块。然后,你可以使用上述方法来与主进程进行通信。

需要注意的是,由于 ipcRenderer 允许渲染器进程与主进程进行通信,因此在使用时需要特别小心,以避免潜在的安全风险。确保你只对可信的源暴露 IPC 通道,并在接收消息时进行适当的验证和清理。

此外,从 Electron 5 开始,为了提高安全性,Electron 引入了 contextIsolation和 preload 脚本的概念。启用 contextIsolation 后,渲染器进程的上下文将被隔离,无法直接访问 Node.js 的 API。相反,你应该使用 preload 脚本作为桥梁,在其中使用 contextBridge 将安全的 API 暴露给渲染器进程。这样,ipcRenderer 就成为了在 preload脚本中安全暴露给渲染器进程的重要工具。

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

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

相关文章

使用HTTP代理注意的点

“在网络世界中,HTTP代理扮演着桥梁的角色,帮助用户匿名访问网站、加速网页加载、绕过地区限制等。然而,不当或不安全地使用HTTP代理也可能带来一系列问题。以下是在使用HTTP代理时需要注意的几个关键点。” 一、选择可靠的代理服务商 首先&…

鹰眼应急实时三维重建装备,高质量交付中!

在《2024年地方应急管理科技信息化任务书》的指导和应急管理万亿国债支撑下,全国各地正积极推进应急管理现代化建设,全力提升“数据汇聚服务能力、监测预警能力、指挥调度能力、支撑保障能力”四项应急管理能力。 制定标准化流程规范,保障交…

[Leetcode 47][Medium]-全排列 II-回溯(全排列问题)

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 和上一道Leetcode46相比,有变化的地方是要排除重复组合的情况。那么在组合问题中去除重复组合的方法是先对数组进行排序,然后在回溯函数中判断当前元素与上一个元素是否相同,若相同…

DDS(Data Distribution Service)的数据状态分布和管理简单介绍

1. 数据中心模型 在 DDS 中,数据分发是基于数据中心模型的,而不是消息中心模型。数据中心模型强调数据本身的存在和状态变化,而消息中心模型主要关注消息的传递。通过使用数据中心模型,DDS 可以有效地跟踪每个话题的状态&#xf…

系统架构师考试学习笔记第三篇——架构设计高级知识(11)软件可靠性基础知识

本章知识点: 第11课时主要学习软件可靠性基本概念、建模、管理、设计、测试和评价等内容。本课时内容侧重于概念知识,根据以往全国计算机技术与软件专业技术资格(水平)考试的出题规律,考查的知识点多来源于教材,扩展内容较少。根据考试大纲,本课时知识点会涉及单项选…

赞奇科技与华为云共襄828 B2B企业节,激活数字内容“云”创作

8月28日,在2024中国国际大数据产业博览会上,第三届828 B2B企业节正式开幕,旨在融通数智供需,加速企业智改数转,助推中国数智产业实力再升级。 828 B2B企业节是全国首个基于数字化赋能的企业节,由华为联合上…

python网络爬虫(一)——网络爬虫基本原理

1.使用Beautiful Soup解析网页 通过request库已经抓取到网页源码,接下来要从源码中找到并提取数据。Beautiful Soup是python的一个库,其主要功能是从网页中抓取数据。Beautiful Soup目前已经被移植到bs4库中,也就是说在导入Beautiful Soup时需…

HarmonOS实战开发:Node-API接口适配模块加载指导

Node-API中的napi_load_module_with_info接口的功能是进行模块的加载,当模块加载出来之后,可以使用函数napi_get_property获取模块导出的变量,也可以使用napi_get_named_property获取模块导出的函数,该函数可以在新创建的ArkTs基础…

力扣239题详解:滑动窗口最大值的多种解法与模拟面试问答

在本篇文章中,我们将详细解读力扣第239题“滑动窗口最大值”。通过学习本篇文章,读者将掌握如何在数组中找到每个滑动窗口的最大值,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述 力…

SprinBoot+Vue学生选课微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…

C++使用日志库经验总结

1、log4cpp日志源文件路径设置 在 Visual Studio 中,C 项目的日志格式可以通过设置项目的属性来调整。如果你想要使用完整路径来显示诊断消息,可以在项目属性中的“C/C”选项卡下的“高级”属性页中找到“使用完整路径”(/FC)选项…

探索数字化生态平台的特色功能,开启未来新征程

在数字化浪潮席卷全球的今天,数字化生态平台正以惊人的速度崛起,成为推动经济发展与社会进步的强大引擎。那么,这些平台究竟有哪些独特的特色功能呢?让我们一同深入探索。 首先,我们要明确数字化生态平台的定义。它是利…

ParallelsDesktop19可在任何Mac上运行Windows软件

ParallelsDesktop19是一款Mac虚拟机软件,可在任何Mac上运行Windows,体验不同操作系统之间的无缝集成,并具有创新设计和增强功能,如无密码登录与TouchID、支持macOSSonoma14和增强打印选项。此外,它还支持运行更多Windo…

第二证券:大洗牌!头部券商营收、净利集体下滑

前十券商营收团体下滑,银河证券跌幅最小 新股IPO数量锐减129家至44家,国内证券市场股票基金交易量日均规划 同比下降 6.83%……关于证券公司而言,本年上半年可谓多重要素叠加冲击,成果下滑难以避免。于大多数证券公司而言&#x…

01、echart的基本使用

一 为什么使用echarts 丰富的可视化类型(柱状图、散点图、雷达图…) 多种数据格式无需转换直接使用 千万数据的前端展现移动端优化 多渲染方案,跨平台 动态数据 绚丽的特效 二echarts快速上手 方式一: 从gi thup中下载ech…

未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序

未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序 或者 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序 Language: C# Database: Access 解决方案: Microsoft.ACE.OLEDB.12.0 官方下载地址 https://www.microsoft.com/en-us/download/details.…

强化学习与深度学习的结合

强化学习与深度学习的结合 目录 一、引言 二、强化学习基础 三、深度学习基础 四、强化学习与深度学习的结合实例 五、总结 一、引言 随着人工智能技术的不断发展,强化学习已经成为了计算机科学领域的一个重要分支。而深度学习作为一种强大的机器学习方…

redroid搭建云手机学习笔记(一)

参考链接 通过Redroid搭建自己的云手机 docker安装 docker官网目前打不开了,通过官网安装的方式无法实现,这里需要借助镜像网站来实现docker的安装 参考链接:https://developer.aliyun.com/mirror/docker-ce # step 1: 安装必要的一些系统…

如何克服编程学习中的挫折感的?

你是如何克服编程学习中的挫折感的? 在编程学习的道路上,遭遇挫折感几乎是每位学习者不可避免的经历。无论是初学者在基础语法上的反复磕碰,还是进阶者在复杂算法、系统设计前的迷茫与困惑,挫折感都是成长路上的一个重要伴侣。然…

BPE - Byte Pair Encoding

动机 对于LLM,对text进行tokenize最原始的想法是每个词对应一个编号。但一旦语言变多,token list映射表就会特别大,因此需要一种数据压缩方法去减少token list size 算法 计算相邻字符的组合出现频率,频率最高(假设…