Electron
Electron 适合放在“前端团队想把 Web 技术直接带到桌面端”的那条线上看。它把 Chromium、Node.js 和桌面系统能力放在同一个框架里,让 HTML、CSS、JavaScript 不只跑在浏览器里,也能打包成真正的桌面应用。
很多团队第一次做桌面端,最终都会在 Electron 和 Tauri 之间做选择。Electron 更成熟,也更重。优点和代价都很明显。
一句话先讲清楚
Electron 不是“给网页套个窗口”这么简单。
它更像是:
- 用 Chromium 渲染界面
- 用 Node.js 和 Electron 主进程控制系统能力
- 用 preload 和 IPC 把渲染层与系统层连起来
- 最后打包成 macOS、Windows、Linux 的桌面应用
官方的 Why Electron 页面讲得很直接:Electron 把 Chromium、Node.js 以及接入原生能力的方式放在同一个框架里,目标就是构建功能完整的桌面应用。
适合什么场景
- 已经有成熟的 Web 前端团队,希望进入桌面端
- 应用本身就是复杂富客户端,而不是简单工具页
- 需要稳定的跨平台桌面交付能力
- 可以接受安装包体积偏大这件事
不太适合什么场景
- 对安装包体积极度敏感
- 只是想做一个很轻量的系统小工具
- 团队很难持续维护桌面端安全边界
Electron 的核心结构
官方文档里最重要的两个概念就是:
main processrenderer process
1. Main process
主进程只有一个,负责:
- 应用生命周期
- 窗口创建
- 原生菜单、托盘、对话框
- 文件系统、系统级能力协调
import { app, BrowserWindow } from 'electron'
import path from 'node:path'
function createWindow() {
const win = new BrowserWindow({
width: 1200,
height: 800,
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
})
win.loadURL('http://localhost:5173')
}
app.whenReady().then(() => {
createWindow()
})
2. Renderer process
每个窗口通常会有自己的 renderer process。它本质上就是一个 Chromium 页面环境,所以前端页面、组件、路由、状态管理基本都在这里。
这也是 Electron 对前端团队最友好的地方: 大部分界面层工作,看起来就像平时写 Web 应用。
3. Preload
真正决定 Electron 项目质量高不高的,经常不是页面本身,而是 preload 写得怎么样。
preload 的作用是:
- 运行在更高权限的上下文里
- 负责把安全、有限、可控的 API 暴露给 renderer
- 避免页面层直接拿到危险的 Node/Electron 能力
import { contextBridge, ipcRenderer } from 'electron'
contextBridge.exposeInMainWorld('desktop', {
openFile: () => ipcRenderer.invoke('dialog:openFile')
})