• Edwin's Blog
  • 首页
  • 文章
  • 分类
  • 项目
  • 关于

Electron

Electron

Electron Basic Knowledge Points

2025-09-25

electronframework

定义

Electron 是由 GitHub 开发的开源框架,使用 Web 技术 (JavaScript、HTML、CSS) 构建跨平台桌面应用(支持 Windows、macOS、Linux)

Electron 将 Chromium 和 Node.js 嵌入到了一个二进制文件中,因此它允许你仅需一个代码仓库,就可以撰写支持 Windows、macOS 和 Linux 的跨平台应用

适用场景

跨平台桌面应用、Web 应用转桌面应用、轻量级工具类软件(如 VS Code、Slack)

核心架构

  • Chromium:跨平台渲染技术栈,提供网页渲染能力,负责 UI 展示
  • Node.js:提供系统底层 API 访问(如文件系统、操作系统交互)

主进程与渲染进程对比

项目主进程 (Main Process)渲染进程 (Renderer Process)
角色应用入口,管理生命周期、原生交互(菜单/对话框)每个窗口独立,负责渲染 HTML/CSS/JS 界面
环境完整 Node.js 环境Chromium 浏览器环境(默认无 Node.js 访问权限)
安全限制无限制,可调用系统 API默认隔离,需通过预加载脚本暴露 API
通信机制使用 ipcMain 接收/处理消息使用 ipcRenderer 发送/接收消息

关键点

•​​ 进程隔离

  • 主进程与渲染进程独立运行,通过 IPC (进程间通信) 交互

•​​ 安全规范

  • 渲染进程默认禁用 Node.js(nodeIntegration: false),避免 XSS 攻击导致系统漏洞
  • 可以通过特定的机制 (IPC, Preload Script) 与主进程通信以获取系统能力

文件结构

index.html (渲染进程界面)

  • 标准 HTML 结构

main.ts (主进程)

  • 主进程入口文件,加载 HTML 文件、处理应用生命周期事件

preload.js (渲染进程脚本)

  • 在渲染进程加载前运行,作为连接渲染进程和主进程的桥梁,提供安全可控的 API
  • 预加载脚本包含在浏览器窗口加载网页之前运行的代码。 其可访问 DOM 接口和 Node.js 环境,并且经常在其中使用 contextBridge 接口将特权接口暴露给渲染器

import { app, BrowserWindow, shell, ipcMain } from "electron";

app:
  这个模块控制着您应用程序的事件生命周期。
  常用事件: ready, window-all-closed, activate, before-quit, will-quit。
  常用方法: app.quit(), app.getPath(name) (获取系统路径), app.getName(), app.getVersion(), app.isPackaged

BrowserWindow:
  这个模块创建和管理 app 的窗口
  构造函数选项 (new BrowserWindow({...})):
    width, height: 窗口尺寸。
    x, y: 窗口位置。
    frame: 是否显示窗口边框和标题栏。
    show: 创建时是否立即显示。
    webPreferences: 配置网页功能的关键选项 (见下)。
  实例方法: win.loadURL(), win.loadFile(), win.close(), win.show(), win.hide(), win.maximize(), win.minimize(), win.isMaximized(), win.webContents (访问 WebContents 对象)
  实例事件: closed, focus, blur, resize, move

进程间通信 IPC (Inter-Process Communication)

Electron 提供了 ipcMain 和 ipcRenderer 模块,用于 主进程 和 渲染进程 之间的通信。这种通信方式基于事件和消息的机制。

  • 在主进程中,使用 ipcMain 模块来监听和处理来自渲染进程的消息。
  • 在渲染进程中,使用 ipcRenderer 模块来发送消息给主进程,并监听主进程的回复。
通信方向常用方法特点典型应用场景
渲染进程 → 主进程(单向)ipcRenderer.send / ipcMain.on异步,不等待回复发送通知、触发动作(如日志记录,触发无需返回值的操作)
渲染进程 ↔ 主进程(双向)ipcRenderer.invoke / ipcMain.handle异步,返回 Promise,现代推荐方式文件操作、数据库查询、复杂计算等异步任务
主进程 → 渲染进程(单向)webContents.send / ipcRenderer.on主进程主动向特定窗口发送消息通知状态更新、推送数据
主进程 → 渲染进程event.reply在主进程的 ipcMain.on 监听器中,回复特定渲染进程的请求响应 ipcRenderer.send 的请求
渲染进程 ↔ 渲染进程通过主进程转发主进程作为中介简单实现不同窗口间的通信
渲染进程 ↔ 渲染进程MessagePort API更高效的直接通信方式,支持传输大量数据需要高性能、低延迟的渲染进程间数据交换
  1. 为什么需要 IPC ?
  • 主进程和渲染进程是独立的进程,需要一种机制来传递消息和数据。
  • 渲染进程需要请求主进程执行特权操作 (如读写文件、显示原生对话框)。
  • 主进程需要通知渲染进程更新 UI 或传递数据
  1. 主要模块
  • ipcMain (在主进程中使用)
  • ipcRenderer (在渲染进程或 preload 脚本中使用)
  • contextBridge (在 preload 脚本中使用,用于安全暴露 API)
  1. 通信模式
  • 渲染进程 -> 主进程 (单向)
    • 渲染进程 (preload 或 renderer): ipcRenderer.send(channel, ...args)
    • 主进程: ipcMain.on(channel, (event, ...args) => { ... })
  • 渲染进程 -> 主进程 -> 渲染进程 (双向异步,请求/响应)
    • 渲染进程 (preload 或 renderer): const result = await ipcRenderer.invoke(channel, ...args)
    • 主进程: ipcMain.handle(channel, async (event, ...args) => { ...; return result; })
  • 主进程 -> 渲染进程 (单向)
    • 主进程 (需要 webContents 对象): win.webContents.send(channel, ...args)
    • 渲染进程 (preload 或 renderer): ipcRenderer.on(channel, (event, ...args) => { ... })

Electron IPC 通信功能类别说明

功能类别具体描述对应案例或方法
系统级操作调用操作系统原生 API,管理窗口、对话框、菜单、系统托盘等。打开文件对话框、更改窗口标题、更新菜单状态、托盘图标交互等。
文件系统访问在主进程中使用 Node.js 的 fs 模块进行文件读写、创建、删除等。读取配置文件、保存用户数据、管理项目文件、选择文件夹并获取路径。
数据请求与响应渲染进程向主进程请求数据,主进程处理后将结果返回。从数据库或本地存储中查询数据、获取应用配置信息、获取系统状态(如 CPU 占用率)。
状态同步与通知主进程主动向渲染进程发送消息,通知其状态变化或更新 UI。向所有窗口广播消息、通知渲染进程主题已改变需更新界面、通知长任务(如文件下载、图像处理)的实时进度。
高性能数据传输使用 MessagePort 或传输大型数据时优化性能,避免阻塞。流式传输大型文件或二进制数据、使用 Transferable 对象减少拷贝开销。
错误与日志处理主进程收集渲染进程的错误和日志,进行统一处理或上报。渲染进程将捕获的异常发送给主进程记录到文件、主进程监控子进程状态并在异常退出时通知渲染进程。

集成 vite

Electron 打包工具

  • electron-builder
  • electron-forge
  • electron-packager
工具名称主要特点打包输出格式适用场景学习/配置复杂度
electron-builder功能全面、支持自动更新、多平台构建、丰富的安装程序定制选项、应用签名Windows: .exe (NSIS), .msi
macOS: .dmg, .zip
Linux: .AppImage, .deb, .rpm
需要正式分发、自动更新、多平台支持、定制安装流程的项目中等偏上,配置项较多
electron-packager轻量、简单、快速、灵活性高各平台的可执行文件及其依赖(需手动分发或压缩)快速打包测试、内部使用、需要高度定制打包流程的项目较低,命令行参数简单
electron-forge集成了开发、构建、打包、发布的全套工作流,预置模板依赖其内部集成的打包器(通常是 electron-builder 或 electron-packager)希望快速开始新项目、需要一体化开发体验的开发者中等,概念较多

Electron Forge

Electron Forge 是一个处理 Electron 应用程序打包与分发的一体化工具

npm install --save-dev @electron-forge/cli

Table Of Content

  • 定义
  • 适用场景
  • 核心架构
  • 主进程与渲染进程对比
  • 文件结构
  • 进程间通信 IPC (Inter-Process Communication)
    • Electron IPC 通信功能类别说明
    • 集成 vite
    • Electron 打包工具
  • Electron Forge
ShareShareShareShare
© 桂ICP备2022007988号
© 2025 Implement By Edwin WB Li