Electron:当 Web 技术统治桌面

你正在用的编辑器,可能比你想象的重得多。

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 生成? → pdfmakejspdf
  • Excel 操作? → exceljsxlsx
  • HTTP 请求? → axiosky
  • 图表? → echartschart.jsd3
  • 机器学习? → tensorflow/tfjs(是的,浏览器里跑 AI)

这些在 Web 时代积累的工具财富,让 Electron 应用的开发速度远超任何需要从零搭建功能的主流语言框架。

3.3 跨平台:一次编写,三端运行

同一套代码,可以打包为:

平台 输出格式
Windows .exe(NSIS / Squirrel)
macOS .dmg / .app
Linux .AppImage / .deb / .rpm

Electron 提供的 electron-builderelectron-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 做到了这一点。这本身就是一种成功。

相关推荐
德福危险1 小时前
从盲打xss到到模板注入:unix靶机渗透之Tempus_fugit4
前端·unix·xss
JavaGuide1 小时前
又一个画图 Skill 开源,再见手动画 draw.io!
前端·后端·github
城事漫游Molly1 小时前
用AI提炼研究问题与假设的完整提示词——从模糊想法到精准RQ/Hypothesis,AI辅助精化全流程
人工智能·机器学习·prompt·ai for science·博士生必读·应用语言学·研究问题
AI刀刀1 小时前
豆包智能体对话导出后,如何构建长期归档与高效检索体系?
android·人工智能·word·excel·ai导出鸭
workflower1 小时前
室内外配送机器人-应用路径
人工智能·机器学习·设计模式·矩阵·自动化
Token炼金师1 小时前
生产化的鸿沟:流式、缓存、可观测、红蓝对抗、限流降级与评测 —— 工程化六渡
人工智能·llm·可观测性·红蓝对抗·缓存策略·限流降级·评测体系
DMD1681 小时前
AI海外外贸部:AI正在重新定义企业海外市场开发模式
大数据·人工智能·数字化转型·ai技术开发
PhotonixBay1 小时前
共聚焦成像核心原理:针孔、PSF与三维形貌测量技术
人工智能·测试工具·算法
橘子星1 小时前
MCP协议深度解析:从代码实例看跨进程工具调用
人工智能