
你正在用的编辑器,可能比你想象的重得多。
VS Code,全世界最流行的代码编辑器之一,启动它的时候,你在运行什么?
Chromium(渲染进程) + Node.js(主进程) + 一个轻量的原生 Shell。这三样东西组合在一起,就是 Electron。
这个组合在过去十年里,被无数次批评"太重""太慢""吃内存",却依然支撑起了 VS Code、QQ、腾讯文档、Discord、Slack、Figma(早期版本)等无数你每天都在用的应用。
这不是偶然。这是生态选择的结果。
一、为什么会有 Electron?
2013 年,GitHub 的工程师 Cheng Zhao(赵子承)做了一个实验:如果把 Chromium 的渲染引擎和 Node.js 运行时绑在一起,前端工程师是不是就能用 HTML/CSS/JS 写出真正的桌面应用?
答案是:是的。
这个实验后来成了 Atom Editor 的底层框架,再后来被剥离出来,成了独立的 Electron。
Electron 解决的核心问题是:桌面应用最贵的成本不是运行时,而是人。 如果能用前端工程师直接开发桌面应用,而不是去培养 C++/Qt/WPF 工程师,这个成本差足以抵消运行时的一点额外开销。
这个逻辑到今天依然成立。
二、技术原理:两进程架构
理解 Electron,先理解它的进程模型。
2.1 两个进程,一个使命
Electron 应用由两个核心进程构成:
主进程(Main Process)
运行在 Node.js 环境中,是整个应用的"操作系统层"。它负责:
- 创建和管理应用窗口(BrowserWindow)
- 处理系统级操作(系统托盘、菜单、对话框、全局快捷键)
- 管理应用生命周期(启动、退出、后台运行)
- 与操作系统 API 交互(文件系统、通知、剪贴板)
主进程在整个应用生命周期中只有一个实例。
渲染进程(Renderer Process)
运行在 Chromium 环境中,每个窗口( BrowserWindow)对应一个渲染进程。渲染进程负责:
- 渲染 UI 界面(HTML/CSS/JS)
- 处理用户交互事件
- 运行 Web 代码
渲染进程之间默认完全隔离,数据不共享。
[主进程] ←→ [渲染进程 A] [渲染进程 B] [渲染进程 C]
Node.js Chromium Chromium Chromium
2.2 进程间通信:IPCBridge
两个进程之间通过 IPC(Inter-Process Communication) 通信。主进程暴露"命令"(Handler),渲染进程通过 ipcRenderer.invoke('channel-name', ...args) 调用。
javascript
// 主进程
import { ipcMain } from 'electron'
ipcMain.handle('read-file', async (event, filePath) => {
const fs = require('fs/promises')
return await fs.readFile(filePath, 'utf-8')
})
// 渲染进程
const content = await window.electronAPI.readFile('/path/to/file')
这种架构天然隔离了"危险操作"(文件系统、网络请求)和"用户界面",渲染进程的崩溃不会导致整个应用崩溃(除非主进程出问题)。
2.3 预加载脚本:安全桥梁
直接让渲染进程调用 Node.js API 是危险的(XSS 风险)。Electron 通过预加载脚本(Preload Script) 解决这个问题:
javascript
// preload.js
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('electronAPI', {
readFile: (path) => ipcRenderer.invoke('read-file', path),
writeFile: (path, content) => ipcRenderer.invoke('write-file', path, content),
})
渲染进程只能通过 window.electronAPI 这个受控的桥梁访问主进程能力,而无法直接访问 Node.js 或操作系统 API。
三、生态优势:为什么开发者选择 Electron?
3.1 前端技术栈的完整复用
这是 Electron 最核心的价值。对于已经有前端能力的团队:
你已有的: React / Vue / Svelte + TypeScript + npm 包生态 + Webpack / Vite
Electron 可以直接用: ✅ 全部 ✅
不需要学习 Qt(C++)、不需要学习 .NET(WPF)、不需要学习 Swift(macOS 原生开发)。一个写惯 Vue 的前端工程师,通过 Electron 开发桌面应用,上手时间可以压缩到一周以内。
3.2 npm 生态:全球最大的包仓库
npm 上有超过 200 万个包,这些包绝大多数可以直接在 Electron 的渲染进程中使用------不需要任何适配。
你需要:
- PDF 生成? →
pdfmake、jspdf - Excel 操作? →
exceljs、xlsx - HTTP 请求? →
axios、ky - 图表? →
echarts、chart.js、d3 - 机器学习? →
tensorflow/tfjs(是的,浏览器里跑 AI)
这些在 Web 时代积累的工具财富,让 Electron 应用的开发速度远超任何需要从零搭建功能的主流语言框架。
3.3 跨平台:一次编写,三端运行
同一套代码,可以打包为:
| 平台 | 输出格式 |
|---|---|
| Windows | .exe(NSIS / Squirrel) |
| macOS | .dmg / .app |
| Linux | .AppImage / .deb / .rpm |
Electron 提供的 electron-builder 和 electron-forge 两个打包工具,将这个过程压缩到几条命令:
bash
electron-builder --win --mac --linux
当然,三端体验一致不代表三端交互规范一致------macOS 的菜单栏在顶部,Windows 在窗口内;右键菜单在两端的交互习惯也不同。这些差异需要开发者做平台适配,但这是"锦上添花",而不是"必须从零开始"。
3.4 开发体验
Electron 的开发体验在主流桌面框架中几乎无对手:
- 热更新(HMR):渲染进程支持完整的热模块替换,改 UI 代码秒级生效
- DevTools:直接用 Chromium 的开发者工具调试,和 Web 开发完全一样
- Source Map:生产环境的崩溃可以精确映射到源码行
- 日志系统 :
electron-log等工具提供开箱即用的日志记录
四、真实案例:VS Code 是怎么用 Electron 的?
最能代表 Electron 能力上限的应用是 VS Code。
VS Code 的成功证明了 Electron 能支撑起极其复杂的桌面应用。它的架构实践值得深入分析:
多窗口管理
VS Code 的每个标签页、每个面板都是一个独立的渲染进程,由主进程统一协调。这意味着一个标签页崩溃不会影响整个编辑器,同时渲染进程可以充分利用多核 CPU。
原生能力集成
VS Code 的左侧文件树、终端、调试面板,并非纯 Web 实现,而是通过 Electron 的原生 API 与系统深度集成:
shell.openPath()打开系统文件管理器desktopCapturer.getSources()实现屏幕录制(调试工具)- 原生上下文菜单、右键行为
性能优化
VS Code 团队在 Electron 基础上做了大量定制优化:
- 使用
browserWindow.setBackgroundThrottling()暂停空闲渲染 - 虚拟化长列表(文件树、行号显示)
- 增量语法高亮(而不是全量重绘)
这说明:Electron 本身不是性能瓶颈,怎么用才是。
五、被误解的"性能问题"
5.1 Electron 真的很慢吗?
性能对比需要分场景讨论:
| 场景 | Electron 表现 | Native 对比 |
|---|---|---|
| 启动时间 | 1-3 秒(包含 Chromium 启动) | 0.1-0.5 秒 |
| 内存占用(基础) | 约 150-300 MB | 约 20-50 MB |
| UI 响应速度 | 几乎与 Native 无差别 | 基准 |
| CPU 密集任务 | 受 Chromium 限制 | Native 更优 |
Electron 的"慢"主要体现在两点:启动时间 和基础内存占用。
但这两个指标对现代应用的实际影响被严重高估了:
- 用户感知到的是"这个应用打开之后用起来是否流畅",而不是"启动时间多了 1 秒"
- 内存占用在 8GB+ 内存的电脑上几乎不是问题(除非同时开 10 个 Electron 应用)
- VS Code 证明了,一个经过精心优化的 Electron 应用,流畅度可以与原生应用无异
5.2 "内存泄漏"是 Electron 的问题吗?
很多人抱怨 Electron 应用"越用越卡,内存越占越多"。这通常是应用代码的问题,而不是 Electron 框架的问题:
- 渲染进程中的 JavaScript 事件监听器未清理
- 大型对象(如图片、表格数据)被持续持有而未释放
- WebSocket/轮询连接未正确关闭
VS Code 的内存占用长期稳定,说明 Electron 应用完全可以做到内存可控。
六、Tauri 崛起:Electron 的竞争对手
6.1 Tauri 是什么?
Tauri 是一个用 Rust + WebView 构建桌面应用的框架,由 Tauri Programme 组织开发。它的最新版本是 v2.11.5(2026-07-01)。
与 Electron 不同,Tauri 不捆绑 Chromium 运行时,而是使用各平台的 WebView:
- Windows:用 WebView2(Edge Chromium 内核,已预装在 Windows 10+)
- macOS:用 WKWebView(Safari 内核)
- Linux:用 WebKitGTK
6.2 数字对比
| 指标 | Electron v43 | Tauri v2 |
|---|---|---|
| GitHub Stars | 121,921 | ~75,000 |
| 发布周期 | 每 2 周一个版本 | 每 4-8 周一个版本 |
| 生态成熟度 | 极高(8年+积累) | 快速成长(5年) |
| 插件生态 | 丰富 | 快速扩充 |
| 学习曲线 | 低(前端工程师友好) | 中(需了解 Rust) |
| 应用包体积 | 约 100-300 MB | 约 3-20 MB |
| 基础内存占用 | 约 150-300 MB | 约 20-50 MB |
6.3 核心差异分析
Electron 的优势:
- 不依赖平台 WebView,系统兼容性更好(WebView2 在旧版 Windows 上缺失)
- npm 生态的完整复用------200 万个包直接使用
- 开发者社区更大,踩坑有更多现成答案
- Chromium 特性完整支持(如 WebRTC、PWA Service Worker)
Tauri 的优势:
- 包体积极小(10-20 MB 安装包 vs 300 MB+)
- 内存占用更低,更接近原生应用体验
- Rust 后端性能更强(适合计算密集型任务)
- 安全模型更细粒度(权限系统)
6.4 谁应该选谁?
选 Electron 当:
- 你有前端团队,需要快速交付
- 需要深度 Chromium 特性(WebRTC、Service Worker、PWA)
- 需要复用的 npm 依赖很多
- 目标是 Windows + macOS + Linux 三端兼容
选 Tauri 当:
- 对安装包体积有严格要求(如需要小体积分发)
- 应用需要强安全隔离
- 后端逻辑复杂,适合用 Rust 编写
- 团队有 Rust 经验或愿意学习
两者的共同结论:Tauri 的崛起不是 Electron 的终点。两者定位有重叠但不完全一致,Electron 依然是"前端团队做桌面应用"的首选,Tauri 则更适合"追求极致性能和安全"的应用场景。
七、开发 Electron 应用的最佳实践
7.1 架构设计
模块化进程职责:
javascript
// main/index.ts --- 主进程入口
import { app, BrowserWindow, Menu } from 'electron'
import { createWindow } from './windows'
import { setupIPC } from './ipc'
import { createAppMenu } from './menu'
app.whenReady().then(() => {
setupIPC()
createAppMenu()
createWindow()
})
渲染进程只负责 UI,Node.js 能力全部通过 IPC 暴露给主进程。 这样即使渲染进程被攻击,攻击者也拿不到系统级的控制权。
7.2 性能优化三板斧
① 懒加载窗口
不要一次性创建所有窗口,需要时再创建:
javascript
// 主进程
ipcMain.handle('open-settings', () => {
if (!settingsWindow || settingsWindow.isDestroyed()) {
settingsWindow = new BrowserWindow({
width: 600,
height: 400,
parent: mainWindow,
modal: true,
show: false
})
settingsWindow.loadURL('https://app/settings')
settingsWindow.once('ready-to-show', () => settingsWindow.show())
}
})
② 启用浏览器内置缓存
在 WebPreferences 中启用磁盘缓存,减少重复网络请求:
javascript
const win = new BrowserWindow({
webPreferences: {
webSecurity: true,
enableBlinkFeatures: 'Cache',
cache: true
}
})
③ 渲染进程崩溃隔离
捕获渲染进程崩溃,不影响整个应用:
javascript
win.webContents.on('render-process-gone', (event, details) => {
if (details.reason !== 'clean-exit') {
// 记录崩溃日志,上报监控系统
log.error('Renderer crashed:', details)
// 可选:尝试重启渲染进程
}
})
7.3 安全检查清单
- 渲染进程无法直接访问 Node.js(
nodeIntegration: false) - 上下文隔离已启用(
contextIsolation: true) - 所有主进程 API 通过 preload 脚本的 contextBridge 暴露
-
webSecurity未被禁用 - 外部链接使用
shell.openExternal()并验证 URL 协议 - CSP(Content Security Policy)已配置
7.4 打包优化
使用 electron-builder 时,通过配置减少安装包体积:
json
{
"build": {
"appId": "com.example.myapp",
"productName": "MyApp",
"asar": true,
"npmRebuild": false,
"linux": {
"target": ["AppImage", "deb"]
},
"mac": {
"target": ["dmg", "zip"],
"category": "public.app-category.developer-tools"
},
"win": {
"target": ["nsis"],
"artifactName": "${productName}-${version}-Setup.${ext}"
}
}
}
八、未来趋势
8.1 Electron 的演进方向
Electron 正在向更轻量、更安全的方向进化:
- 减少捆绑依赖:Electron 43 开始,进一步压缩了内置模块体积
- 更细粒度的安全权限:未来版本将支持更精细的渲染进程权限控制
- 更好的 macOS 集成:对 Apple Silicon 的优化,对 macOS 新 API 的支持
- Web GPU 支持:在 Chromium 中解锁 GPU 计算能力
8.2 桌面应用格局的新常态
2026 年的桌面应用市场,呈现出"三极并存"的格局:
| 框架 | 定位 | 代表应用 |
|---|---|---|
| Electron | 前端友好,快速交付 | VS Code, QQ, Discord, Slack |
| Tauri | 轻量高效,Rust 加持 | Zed Editor, Figma 新版 |
| Flutter Desktop | 跨平台原生渲染 | Figma 新版桌面端, Ubuntu Store 应用 |
三者各有生存空间,不存在一个框架"杀死"另一个的局面。
结语
Electron 教会行业一件事:桌面应用开发的瓶颈,从来不在运行时,而在人。
当 VS Code 成为全球开发者离不开的工具,当 QQ 通过 Electron 实现了 Windows/macOS/Linux 三端的体验统一,当无数创业团队用 Electron 快速将产品从 0 变成 1------这些事实本身,就是对"Electron 是否可用"这个问题最有力的回答。
批评 Electron"吃内存"很容易,但很少有人意识到,一个前端团队用 Electron 三个月交付的产品,如果选择 Qt 或 WPF 可能需要一年。
工具的价值,不在于它本身有多轻,而在于它能否让正确的人以正确的速度做出正确的东西。
Electron 做到了这一点。这本身就是一种成功。