我明白了 如果想要学好Electron
1、事件循环机制
node 、 chrom 之间事件如何流转,如何接管 ;
2、进程通信
主进程和渲染进程 如何通信
主进程和渲染进程 彼此能力边界
3、窗口系统
系统的窗口系统 如何和chromium结合
4、组件系统
多个vue组件如何自动更新状态 数据如何流动 如何响应用户
5、存储数据系统
临时界面数据 多个界面通信数据vuex 不同进程公用数据 程序下次启动数据
6、线程能力
node提供线程 chramium 提供线程能力
7、浏览器的界面能力
css \ js 、调试器基本的这些认知和能力
8、作为一个理解 Electron的技术人 了解Electron的边界能力
比如窗口有哪些特性 能够和系统窗口的关系 能够置顶 悬浮 移动 鼠标事件 监听系统消息 用户操作及时响应
你的理解已经覆盖了 Electron 的主要知识面。可以进一步收敛成一张核心能力图:Electron 是用 Chromium 负责界面,用 Node.js 和主进程负责桌面能力,再通过 IPC 将两边连接起来。
```mermaid
flowchart TB
User["用户:鼠标、键盘、系统操作"]
subgraph OS["操作系统"]
Window["窗口管理器"]
File["文件系统"]
Native["通知、托盘、剪贴板、协议、快捷键"]
end
subgraph Main["Electron 主进程"]
EventLoop["Node.js 事件循环"]
WindowService["窗口生命周期"]
IPCMain["ipcMain"]
Service["业务服务与持久化"]
end
subgraph Renderer["Electron 渲染进程"]
Chromium["Chromium 页面与事件循环"]
Vue["Vue 组件系统"]
Vuex["Vuex 共享状态"]
CSS["HTML / CSS / JavaScript"]
IPCRenderer["预加载层 / ipcRenderer"]
end
User --> Window
Window --> Chromium
Chromium --> Vue
Vue --> Vuex
Vuex --> Vue
Vue --> IPCRenderer
IPCRenderer <--> IPCMain
IPCMain --> Service
Main <--> OS
WindowService --> Window
```
1. 事件循环
Electron 中不是只有一个事件循环,而是每个进程都有自己的循环。
主进程主要运行:
操作系统事件
→ Electron 原生层
→ Node.js 事件循环
→ JavaScript 回调
→ 创建窗口、读文件、响应 IPC
渲染进程主要运行:
鼠标/键盘事件
→ Chromium
→ DOM 事件
→ Vue 方法
→ 修改状态
→ Vue 更新页面
需要抓住一个原则:JavaScript 回调通常运行在对应进程的主线程上,不要执行长时间同步任务。
// 会阻塞当前进程事件循环
while (true) {
// 页面或主进程将失去响应
}
“接管事件”并不是替换 Chromium 或 Node 的事件循环,而是注册监听器:
button.addEventListener('click', handler);
ipcMain.on('open-file', handler);
window.on('close', handler);
底层事件到来后,事件循环在合适的时间执行这些回调。
2. 进程通信与边界
主进程负责
- 创建和管理窗口
- 操作菜单、托盘、通知和快捷键
- 访问文件系统及原生能力
- 管理应用生命周期
- 统一管理跨窗口业务
- 执行需要更高权限的操作
渲染进程负责
- 展示 HTML/CSS 页面
- Vue 组件渲染
- 响应按钮、输入框等交互
- 管理当前页面状态
- 向主进程提出能力请求
典型通信:
Vue 点击“打开文件”
→ preload 暴露安全接口
→ ipcRenderer.invoke()
→ ipcMain.handle()
→ 主进程访问文件
→ 返回结果
→ Vue 更新页面
优先使用有请求和返回值的 invoke/handle:
// preload
contextBridge.exposeInMainWorld('fileApi', {
open: fileId => ipcRenderer.invoke('file:open', fileId)
});
// main
ipcMain.handle('file:open', async (event, fileId) => {
return openFile(fileId);
});
核心安全原则是:渲染进程不能获得不受约束的 Node 权限,preload 只暴露最小能力。
3. 窗口系统
Electron 的 BrowserWindow 可以理解为:
操作系统原生窗口
└── Chromium WebContents
└── HTML / CSS / Vue 页面
外层窗口由 Windows、macOS 或 Linux 管理;内部内容由 Chromium 绰制。
窗口可以控制:
- 大小、位置和最小尺寸
- 最大化、最小化、全屏
- 置顶、悬浮、透明
- 有框或无边框
- 是否接收鼠标事件
- 显示、隐藏和聚焦
- 多显示器位置
- 父子窗口、模态窗口
- 关闭前确认
- 页面加载和崩溃恢复
例如:
win.setAlwaysOnTop(true);
win.setPosition(x, y);
win.setIgnoreMouseEvents(true);
但窗口能力存在平台差异。例如透明、阴影、全屏、置顶层级,在三个系统上的行为可能不完全一致。
4. Vue 组件与状态系统
Vue 最核心的公式是:
状态 → 页面
用户操作 → 修改状态 → 页面自动更新
单个组件内部状态:
data
→ template 读取
→ 用户点击
→ methods 修改 data
→ Vue 重新渲染受影响部分
父子组件之间:
父组件 -- props --> 子组件
父组件 <-- events -- 子组件
多个页面共享状态时使用 Vuex:
组件 dispatch Action
→ Action 请求接口或编排业务
→ commit Mutation
→ Mutation 修改 State
→ Getter/computed 得到新数据
→ 所有相关组件自动更新
Vuex 是渲染进程内的内存状态,不是天然的跨进程数据库,也不能保证应用重启后继续存在。
5. 存储系统
需要按生命周期区分:
| 数据类型 | 推荐位置 | 生命周期 |
|---|---|---|
| 弹窗开关、输入内容 | Vue data |
组件销毁前 |
| 当前页面共享数据 | Vuex | 渲染进程退出前 |
| 多窗口实时共享数据 | 主进程服务 + IPC | 应用退出前 |
| 用户偏好 | localStorage/配置文件 | 下次启动仍存在 |
| 大量结构化数据 | SQLite | 长期存在 |
| 图片、视频和缓存 | 文件系统 | 清理前存在 |
| 登录凭证 | 系统安全存储 | 按安全策略存在 |
必须明确:
Vuex ≠ 持久化
localStorage ≠ 跨进程状态中心
IPC ≠ 数据库
比较稳定的架构是:
主进程保存权威业务状态
→ IPC 通知各窗口
→ 每个窗口更新自己的 Vuex
→ Vue 组件自动更新
6. 线程能力
Electron 首先是多进程架构,然后才是每个进程内部的多线程。
Electron
├── 主进程
├── 渲染进程 A
├── 渲染进程 B
├── GPU 进程
├── Utility/网络等辅助进程
└── 每个进程内部的若干线程
Node.js 可以使用:
- 异步 I/O
- libuv 线程池
worker_threads- 子进程
Chromium 自己管理:
- UI/渲染主线程
- 合成线程
- 网络与辅助线程
- GPU 相关进程或线程
业务代码不应该随意直接控制 Chromium 内部线程。耗时计算使用 Worker;独立、易崩溃或高风险任务可以使用独立进程。
7. 浏览器界面能力
需要掌握的基本面:
- HTML:结构和语义
- CSS:布局、层叠、定位和动画
- JavaScript:事件、异步、数据转换
- DOM:页面节点和事件传播
- 网络:HTTP、Cookie、缓存、跨域
- DevTools:Elements、Console、Network、Performance、Memory
- Vue Devtools:组件树、props、状态
- 性能:重排、重绘、长任务和内存泄漏
调试时要先确认问题属于哪一层:
按钮没有响应
├── 元素是否被遮挡?
├── DOM 事件是否触发?
├── Vue 方法是否调用?
├── IPC 是否发送?
├── 主进程是否收到?
├── 底层服务是否成功?
└── 结果是否返回并更新状态?
8. Electron 的能力边界
Electron 很适合:
- 复杂桌面业务界面
- 多窗口应用
- 文件管理和网络通信
- 托盘、通知、快捷键
- 音视频、下载、上传
- Web 技术与原生能力结合
Electron 本身不天然解决:
- 强安全隔离
- 超低内存占用
- 重度实时计算
- 硬实时响应
- 所有平台行为完全一致
- 数据永久可靠
- 任意系统能力直接可用
遇到 Electron API 不够时,通常通过以下方式扩展:
Electron API
→ Node.js 系统 API
→ 原生 Node Addon / FFI
→ 独立原生进程
→ C++/系统服务
你做业务时最需要形成的核心思维是:
1. 当前代码运行在哪个进程?
2. 这个进程拥有什么权限?
3. 操作是否会阻塞事件循环?
4. 数据的唯一权威来源在哪里?
5. 数据需要保持多久?
6. 多个窗口如何收到状态变化?
7. 页面关闭、进程崩溃后如何恢复?
8. Windows、macOS、Linux 行为是否一致?
只要每个功能都能回答这八个问题,基本就不是在“会用 Electron API”,而是在真正理解 Electron 桌面应用架构。


评论(0)