Electron 进程与 IPC 通信详解:主进程、渲染进程与 Preload

发布时间:2026/9/16 9:19:47

Electron 进程与 IPC 通信详解:主进程、渲染进程与 Preload 一、前言在使用 Electron 开发桌面应用时经常会接触到Main Process主进程Renderer Process渲染进程Preload Script预加载脚本IPCInter-Process Communication进程间通信很多刚开始学习 Electron 的开发者容易把它们理解成普通的前端线程但实际上 Electron 的核心架构是多进程模型。例如我们正在开发一个 Electron Vue 桌面应用Electron │ ├── Main Process │ │ │ ├── 创建窗口 │ ├── 文件系统 │ ├── SQLite │ ├── Node.js │ └── 系统级能力 │ ├── Preload Script │ │ │ └── 安全暴露 API │ └── Renderer Process │ ├── Vue ├── HTML ├── CSS └── 页面交互那么Vue 页面如果需要访问 SQLite、读取文件或者启动 Python 服务就不能直接操作而是需要通过 IPC 与主进程进行通信。本文就详细介绍 Electron 的进程模型以及 IPC 通信方式。二、Electron 的进程模型Electron 主要由以下几个部分组成名称作用常用 API主进程Main Process创建和管理窗口、执行系统级操作、访问 Node.js APIapp、BrowserWindow、ipcMain、globalShortcut渲染进程Renderer Process负责页面 UI 渲染和用户交互DOM、Vue、浏览器 API预加载脚本Preload Script连接主进程和渲染进程在安全环境下暴露 APIcontextBridge、ipcRenderer需要特别注意Preload 是一个脚本而不是独立的 Electron 进程。因此更准确的理解应该是┌────────────────────────────────────────────┐ │ Electron Application │ │ │ │ ┌──────────────┐ │ │ │ Main Process │ │ │ │ │ │ │ │ Node.js │ │ │ │ SQLite │ │ │ │ File System │ │ │ └──────┬───────┘ │ │ │ IPC │ │ │ │ │ ┌──────▼────────┐ │ │ │ Preload │ │ │ │ contextBridge │ │ │ └──────┬────────┘ │ │ │ │ │ ┌──────▼──────────────┐ │ │ │ Renderer Process │ │ │ │ │ │ │ │ Vue │ │ │ │ HTML / CSS / DOM │ │ │ └─────────────────────┘ │ └────────────────────────────────────────────┘三、主进程Main Process主进程是 Electron 应用的核心进程。通常一个 Electron 应用只有一个主进程。主进程主要负责创建 BrowserWindow管理应用生命周期访问 Node.js API操作文件系统操作 SQLite启动和管理 Python 服务创建系统托盘注册全局快捷键处理 IPC管理应用级状态例如import{app,BrowserWindow}fromelectronletmainWindow:BrowserWindow|nullnullfunctioncreateWindow(){mainWindownewBrowserWindow({width:1400,height:900,webPreferences:{preload:/path/to/preload.js}})}app.whenReady().then((){createWindow()})主进程可以访问 Node.jsimportfsfromnode:fsimportpathfromnode:path因此类似下面这些操作通常应该放在主进程读取文件 ↓ SQLite ↓ 启动 Python ↓ 操作系统 API ↓ 创建窗口四、渲染进程Renderer Process渲染进程主要负责 UI。如果我们使用Electron Vue 3 TypeScript那么 Vue 应用基本就是运行在渲染进程中。例如script setup langtsconsthandleClick(){console.log(点击按钮)}/scripttemplatebutton clickhandleClick保存文章/button/template渲染进程可以使用VueHTMLCSSDOMwindowlocalStorage浏览器 API但是在安全配置下不应该直接使用 Node.js API。例如不建议在 Vue 页面中直接importfsfromfs也不要让页面直接拥有完整的 Node.js 能力。原因很简单如果网页代码可以直接访问 Node.js那么一旦页面存在 XSS 等安全问题攻击者可能获得文件系统等更高权限。因此 Electron 提供了 Preload Script。五、Preload ScriptPreload 可以理解为渲染进程与主进程之间的安全桥梁。Preload 通常运行在页面加载之前并通过 contextBridge 向 Vue 暴露有限的 API。例如import{contextBridge,ipcRenderer}fromelectroncontextBridge.exposeInMainWorld(electronAPI,{getAppInfo:(){returnipcRenderer.invoke(app:getInfo)}})这样 Vue 页面就可以使用window.electronAPI.getAppInfo()但是 Vue 并没有直接获得ipcRenderer或者fs这样的底层能力。整个调用关系Vue │ │ window.electronAPI.getAppInfo() ↓ Preload │ │ ipcRenderer.invoke() ↓ Main Process │ │ ipcMain.handle() ↓ 执行具体业务六、什么是 IPCIPC 全称Inter-Process Communication也就是进程间通信。因为 Electron 的主进程和渲染进程是不同的进程所以它们不能像普通 JavaScript 函数一样直接调用。例如Vue ↓ 我要读取一个 Markdown 文件 ↓ Main Process ↓ fs.readFile() ↓ 返回 Markdown 内容 ↓ Vue中间就需要通过 IPC 传递消息。七、Electron 常见 IPC 通信方式Electron 中最常见的 IPC 通信方式主要有类型渲染进程主进程特点请求-响应ipcRenderer.invoke()ipcMain.handle()推荐单向消息ipcRenderer.send()ipcMain.on()无返回值主进程主动推送ipcRenderer.on()webContents.send()主进程主动通知八、渲染进程 → 主进程invoke / handle这是开发桌面应用时最推荐的一种方式。例如Vue ↓ invoke() ↓ Preload ↓ ipcRenderer.invoke() ↓ Main ↓ ipcMain.handle() ↓ 返回结果8.1 Main Processimport{ipcMain}fromelectronipcMain.handle(app:getInfo,async(){return{name:CSDN Auto,version:1.0.0}})8.2 Preloadimport{contextBridge,ipcRenderer}fromelectroncontextBridge.exposeInMainWorld(electronAPI,{getAppInfo:(){returnipcRenderer.invoke(app:getInfo)}})8.3 VueconstappInfoawaitwindow.electronAPI.getAppInfo()console.log(appInfo)最终得到{name:CSDN Auto,version:1.0.0}这种方式特别适合获取文章保存文章删除文章查询 SQLite创建任务获取账号读取配置因为它具有明确的请求 ↓ 处理 ↓ 返回 关系。九、渲染进程 → 主进程send / on如果不需要返回结果可以使用ipcRenderer.send()配合ipcMain.on()例如PreloadcontextBridge.exposeInMainWorld(electronAPI,{writeLog:(message:string){ipcRenderer.send(log:write,message)}})MainipcMain.on(log:write,(_event,message){console.log([Renderer],message)})Vuewindow.electronAPI.writeLog(用户点击了发布按钮)这种方式适合日志 埋点 通知 不需要返回值的操作不过对于大多数业务请求还是更推荐invoke / handle十、主进程 → 渲染进程有些时候不是 Vue 主动请求而是主进程产生了新的状态需要主动通知 Vue。例如Python 自动发布文章 ↓ 任务进度发生变化 ↓ Electron Main ↓ 通知 Vue ↓ 进度条更新这时候可以使用webContents.send()配合ipcRenderer.on()10.1 Main ProcessmainWindow.webContents.send(task:progress,{taskId:task_001,progress:60})10.2 PreloadcontextBridge.exposeInMainWorld(electronAPI,{onTaskProgress:(callback){ipcRenderer.on(task:progress,(_event,data){callback(data)})}})10.3 Vuewindow.electronAPI.onTaskProgress((data){console.log(任务进度:,data.progress)})页面就可以实时更新正在发布文章... ████████████░░░░░░░░ 60%十一、推荐的 IPC 使用原则实际开发中可以按照下面的原则设计。默认使用 invoke / handle例如查询文章 保存文章 删除文章 创建任务 查询账号 读取配置统一ipcRenderer.invoke() ↓ ipcMain.handle()主进程主动推送使用 send / on例如任务进度 Python 状态 发布日志 下载进度 窗口状态使用webContents.send() ↓ ipcRenderer.on()send / on 只用于真正的单向通知例如记录日志 发送统计信息 通知主进程刷新不要所有东西都使用send / on否则后期很容易出现发送了消息 但是不知道什么时候结束 也不知道有没有执行成功业务代码会越来越难维护。十二、推荐封装 IPC随着项目越来越大不建议把ipcMain.handle(...)全部写在main.ts里面。例如electron/ ├── ipc/ │ ├── app.ipc.ts │ ├── window.ipc.ts │ ├── article.ipc.ts │ ├── task.ipc.ts │ ├── account.ipc.ts │ └── system.ipc.ts │ ├── services/ │ ├── article.service.ts │ ├── task.service.ts │ └── account.service.ts │ └── main.ts这样main.ts │ ├── 注册 app IPC ├── 注册 article IPC ├── 注册 task IPC └── 注册 account IPC十四、最终推荐的通信架构对于一个中大型 Electron 项目我比较推荐Vue Renderer │ │ window.api │ ↓ Preload │ │ IPC ↓ Electron Main │ │ │ │ SQLite WebSocket │ │ │ ↓ │ Python Engine │ │ │ Playwright │ │ │ ↓ │ CSDN │ ↓ 本地数据其中每一层只负责自己的事情层级主要职责VueRenderer UI、交互、页面状态Preload安全暴露 APIElectron Main系统能力、数据库、进程管理Python Engine浏览器自动化、CSDN 操作SQLite本地业务数据WebSocketElectron 与 Python 双向通信十六、总结Electron 的核心并不是简单地把一个网页套进桌面窗口而是一个基于多进程架构的桌面应用框架。开发 Electron 应用时可以简单记住Renderer负责 UIPreload负责安全桥接Main负责系统能力IPC负责 Renderer ↔ Main 通信WebSocket负责 Electron ↔ Python Engine 通信业务请求优先使用ipcRenderer.invoke() ↓ ipcMain.handle()主进程主动推送状态使用webContents.send() ↓ ipcRenderer.on()而对于 CSDN Auto 这样的桌面自动化软件可以进一步采用Vue ↓ Preload ↓ IPC ↓ Electron Main ↓ WebSocket ↓ Python Engine ↓ Playwright ↓ CSDN这种架构能够很好地将 UI、桌面能力、数据存储以及自动化能力 分离开来也方便后续继续扩展 AI 写作、定时发布、多账号管理、任务队列等功能。
延伸阅读

更多相关文章

2026/9/16 9:19:47

大模型时代职业转型与实战技能指南

1. 为什么大模型正在重塑职业版图上周帮一位做HR的朋友梳理岗位JD时,突然发现近半年新增的"Prompt工程师"岗位薪资已经开到35-60k,而更让我震惊的是某制造业巨头居然在招聘"AI生产调度优化师"。这让我意识到,大模型带来的…

2026/9/16 9:19:47

车载Android串口开发实战:UART/RS232/RS485选型、协议解析与排障

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/16 9:19:47

PHP泛站群源码解析:UA识别与双模板分发机制

简介:针对搜狗搜索优化的泛站群PHP源码,面向SEO从业者与独立站长使用,解决搜狗蜘蛛抓取、长尾词首页霸屏等泛站群部署问题。程序无需采集,配置关键词和域名即可运行,并利用入口代码跳转替代传统JS跳转,支持…

2026/9/16 10:09:57

2025学术降重工具评测与NLP技术解析

1. 2025届学术写作必备:五大降重工具深度评测刚完成论文初稿的学生们最头疼的问题来了——查重率居高不下。去年帮学弟学妹们修改毕业论文时,我发现市面上自称能降重的工具五花八门,但真正有效的不到三成。经过半年实测37款工具,我…

2026/9/16 10:09:57

Node.js+Vue构建律师事务所管理系统实战

1. 项目背景与需求分析律师事务所管理系统是法律行业数字化转型的核心工具。随着案件数量激增和客户服务标准提升,传统纸质档案和Excel表格已无法满足现代律所的运营需求。我们团队基于Node.jsVue技术栈开发的这套系统,主要解决以下痛点:案件…

2026/9/16 10:09:57

STM32+L298N+MPU6050的ROS小车底盘固件实现

简介:本资源是一套面向ROS初学者与嵌入式机器人开发者的底盘控制实践代码包,聚焦小车运动控制核心环节,解决电机驱动、姿态感知、闭环调节与状态估计等关键问题。适用于STM32F103平台的ROS小车项目开发、课程设计及毕业设计实践场景&#xff…

2026/9/16 10:09:57

BDMA固件包解析:嵌入式DMA控制器ZIP封装识别与加载

简介:本资源是面向嵌入式初学者的ADSP218X处理器BDMA(块直接存储器访问)专项实践包,聚焦数字信号处理中高效数据搬运这一核心痛点,帮助学习者突破CPU频繁干预导致的性能瓶颈。压缩包共7个文件,含C语言主程序…

2026/9/16 10:04:52

高并发余额扣减实战:数据库锁、Redis缓存与Sentinel限流

高并发下怎么做余额扣减?这个问题我至少被问过十次,面试问、项目评审问、系统故障复盘也问。很多人第一反应是“用事务啊,两条update搞定”,听起来没错,但一旦压到5000 QPS,你会立刻发现数据库的InnoDB行锁…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/16 0:04:09

PHP源码部署实战:从环境配置到运行情侣游戏全攻略

简介:这是一套面向情侣互动场景的PHP完整源码,集成情侣飞行棋、真心话大冒险、情趣骰子等玩法,并内置完整分销制度,可自定义多种返佣比例,源码完全开源无加密,支持微信无感自动授权登录与第三方授权&#x…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/15 21:31:11

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码