electron基础

进程简介

electron有一个mian主进程和多个渲染进程(渲染进程至少有一个)
其中主进程与渲染进程需要preload进行通信。

preload是渲染进程与主进程进行通信的桥梁
主进程:控制应用生命周期,负责创建渲染进程,仅有一个。
渲染进程:每个窗口对应一个独立进程,支持Node.js和DOM API,数量可动态扩展。

ipc与webContents通信

renderer渲染进程通过ipc主动与主进程进行通信;

ipcRenderer.send(channel, ...args) 是异步的,用于从渲染进程向主进程发送消息。它发送消息后不会等待主进程的响应,而是立即返回,适合在不需要等待主进程响应的情况下发送消息。

ipcRenderer.invoke(channel, ...args) 是同步的,也是用于从渲染进程向主进程发送消息,但是它会等待主进程返回响应。它会阻塞当前进程,直到收到主进程的返回值或者超时。

ipcRenderer.sendSync(channel, ...args) 是用于从渲染进程向主进程发送消息,但是它是一个异步的方法,可以方便地在渲染进程中等待主进程返回 Promise 结果。相对于 send 和 sendSync,它更适合处理异步操作,例如主进程返回 Promise 的情况。

mian主进程通过webContents主动与renderer渲染进程进行通信

MessagePort可以实现渲染进程与渲染进程通信,不需要中间桥梁

preload:

  1. contextBridge - 安全桥接:

    contextBridge.exposeInMainWorld(),它把底层API包装成渲染进程可以直接调用的方法。

    安全性:只暴露我们需要的API,避免暴露整个Node.js环境

    可控性:我们可以对API进行包装和验证

    类型安全:可以为暴露的API提供TypeScript类型定义

  2. ipcRenderer - 进程间通信

    ipcRenderer是渲染进程用来与主进程通信的模块:

    ipcRenderer.invoke() - 发送请求并等待响应(异步)

    ipcRenderer.on() - 监听主进程发送的消息

    ipcRenderer.send() - 发送消息给主进程(不等待响应)

  3. 通信流程

    整个通信流程是这样的:

    渲染进程 → preload → ipcRenderer → 主进程 → ipcMain → 底层API

    底层API → ipcMain → 主进程 → ipcRenderer → preload → 渲染进程

mian主进程API

requestSingleInstanceLock() 单实例锁

单例锁(Singleton Lock)的实现主要用于确保应用程序在系统上只有一个实例运行。这对于桌面应用程序来说非常有用,尤其是在用户可能通过多种方式(如直接打开文件、从快捷方式等)启动应用程序时。

单实例锁的核心价值

在桌面应用开发中,多实例运行常常带来意想不到的问题:

配置文件冲突:多个进程同时读写设置导致数据损坏

文件锁定竞争:同一文件被多个窗口编辑造成内容覆盖

系统资源浪费:重复加载大型绘图组件导致内存占用激增

Mian主进程的index.ts根文件注册如下命令

html 复制代码
app.commandLine.appendSwitch('disable-site-isolation-trials')

作用:禁用 Chromium 的站点隔离功能

用途:提升性能,特别是在资源受限的环境中

html 复制代码
app.commandLine.appendSwitch('wm-window-animations-disabled')

作用:禁用窗口管理器的动画效果

用途:提升应用程序的响应速度,减少视觉延迟

html 复制代码
app.commandLine.appendSwitch('disable-web-security')

作用:关闭同源策略(Same-Origin Policy)

用途:允许跨域请求,便于开发和测试

html 复制代码
app.commandLine.appendSwitch('no-sandbox')

作用:关闭 Chromium 的沙盒安全机制

用途:解决在某些 Linux 环境或 Docker 容器中的兼容性问题

html 复制代码
app.commandLine.appendSwitch('high-dpi-support', 'true')

作用:优化高分辨率显示器的显示效果

用途:确保在高 DPI 屏幕上文字和界面元素清晰显示

相关推荐
bearpping5 小时前
Nginx 配置:alias 和 root 的区别
前端·javascript·nginx
maosheng11465 小时前
RHCSA的第一次作业
linux·运维·服务器
@大迁世界5 小时前
07.React 中的 createRoot 方法是什么?它具体如何运作?
前端·javascript·react.js·前端框架·ecmascript
wifi chicken6 小时前
Linux 端口扫描及拓展
linux·端口扫描·网络攻击
旺仔.2916 小时前
Linux 信号详解
linux·运维·网络
放飞梦想C6 小时前
CPU Cache
linux·cache
颜酱6 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
Hoshino.417 小时前
基于Linux中的数据库操作——下载与安装(1)
linux·运维·数据库
霍理迪7 小时前
Vue的响应式和生命周期
前端·javascript·vue.js