Electron 是一个使用 HTML、CSS 和 JavaScript 构建跨平台桌面应用的开源框架。它将 Chromium 和 Node.js 合并到同一个运行时环境中,并提供丰富的原生 API,使开发者能够使用纯 Web 技术开发功能强大的桌面应用,支持 Windows、macOS 和 Linux 三大平台。
版本推荐:截至 2026 年 9 月,当前稳定版为 Electron 44.x,基于 Chromium 152 和 Node.js 24.x。新项目建议使用最新稳定版,并启用上下文隔离和沙箱化。
Electron 的核心架构由三大部分组成,它们协同工作以实现桌面应用开发能力:
┌─────────────────────────────────────────────────────────────────┐
│ Electron 应用 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ 主进程 (Main) │ │ 渲染进程 (Renderer) │ │
│ ├─────────────────────┤ ├─────────────────────┤ │
│ │ • Node.js 环境 │ IPC │ • Chromium 环境 │ │
│ │ • 完整系统权限 │◄────►│ • Web 页面渲染 │ │
│ │ • 原生 API 调用 │ │ • HTML/CSS/JS │ │
│ │ • 窗口管理 │ │ • DOM API │ │
│ │ • 应用生命周期 │ │ • 有限的 Node API │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │ │ │
├───────────┼──────────────────────────────┼──────────────────────┤
│ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 底层技术栈 │ │
│ ├─────────────────────────────────────────────────────┤ │
│ │ • Chromium: UI 渲染引擎 │ │
│ │ • Node.js: 系统交互能力 │ │
│ │ • Native APIs: 操作系统原生功能 │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘| 组件 | 说明 | 作用 |
|---|---|---|
| Chromium | Google 开源的浏览器内核 | 提供强大的 UI 渲染能力,相当于没有地址栏和标签页的精简版 Chrome 浏览器 |
| Node.js | JavaScript 运行时环境 | 提供文件读写、网络请求、调用系统命令等底层操作能力,突破浏览器沙箱限制 |
| Native APIs | Electron 提供的原生 API | 允许访问操作系统原生功能,如创建窗口、定义菜单、显示系统通知、操作剪贴板等 |
Electron 采用多进程架构,主要包含两种进程:
main.js)运行的进程,拥有完整的 Node.js 环境,负责管理应用生命周期、创建窗口、处理原生系统交互进程间通过 IPC (Inter-Process Communication) 进行通信,确保安全性和稳定性
一次编写,即可运行在 Windows、macOS、Linux 三大平台,大幅降低多平台开发和维护成本。
突破浏览器沙箱限制,提供完整的系统访问能力:
| 能力类别 | 具体功能 |
|---|---|
| 文件系统 | 文件读写、目录管理、文件监听 |
| 系统集成 | 系统托盘、桌面通知、剪贴板、Dock/任务栏 |
| 窗口管理 | 多窗口、无边框窗口、透明窗口、始终置顶 |
| 原生菜单 | 应用菜单、上下文菜单、系统菜单集成 |
| 硬件访问 | 摄像头、麦克风、蓝牙、USB 设备 |
| 网络功能 | HTTP 请求、WebSocket、原生 net 模块 |
内置 Chromium 浏览器支持最新的 Web 标准(HTML5、CSS3、ES6+),开发者无需考虑浏览器兼容性问题。
对于音视频编解码、图形图像处理等计算密集型任务,可通过 Node.js C++ 扩展实现,与原生应用性能相当。
| 不足之处 | 具体表现 | 缓解方案 |
|---|---|---|
| 应用体积大 | 压缩打包后至少 40MB+ | 使用增量更新、代码压缩、按需下载资源 |
| 内存占用高 | Chromium 本身资源消耗较大 | 优化渲染策略、减少后台进程、使用 WebAssembly |
| 开发复杂度 | 需要理解多进程架构和 IPC 通信 | 熟练掌握官方文档、遵循最佳实践 |
| 版本更新快 | 紧跟 Chromium 版本可能导致兼容性问题 | 谨慎升级、充分测试、使用稳定版本 |
| 安全风险 | Node.js 集成带来潜在安全隐患 | 启用上下文隔离、禁用 nodeIntegration、验证 IPC 消息 |
Electron 遵循 SemVer 语义化版本规范,版本号格式为 主版本号.次版本号.修订号:
Electron 采用快速发布策略以同步 Chromium 更新:
| 版本类型 | 更新频率 | 稳定性 | 适用场景 |
|---|---|---|---|
| Stable | 每 2-3 个月 | 高 | 生产环境推荐使用 |
| Beta | 每周 | 中 | 测试新功能、提前适配 |
| Nightly | 每天 | 低 | 开发实验、问题排查 |
# 查看所有可用版本
npm view electron versions
# 安装指定版本
npm install electron@28.0.0 --save-dev
# 安装最新稳定版
npm install electron@latest --save-dev
# 安装 beta 版本
npm install electron@beta --save-dev推荐做法:
| Electron 版本 | Node.js 版本 | Chromium 版本 | 支持状态 |
|---|---|---|---|
| 44.x | 24.x | 152 | ✅ 最新 |
| 43.x | 24.x | 150 | ✅ 受支持 |
| 42.x | 24.x | 148 | ✅ 受支持 |
| 41.x | 24.x | 146 | ⚠️ EOL |
| 40.x | 24.x | 144 | ❌ 已停止 |
完整版本支持计划请查看 Electron Support
学习优秀开源项目是提升实战能力的最佳途径:
桌面端应用开发技术 Tauri、NW.js、Flutter、Electron
| 框架 | 核心技术栈 | 架构模式 | 生态与社区 | 适用场景 | 安全性 | 安装包体积 |
|---|---|---|---|---|---|---|
| Electron | JavaScript/HTML/CSS + Chromium + Node.js | 主进程 + 渲染进程 | 非常成熟,拥有庞大的社区和丰富的插件 | 功能丰富、需要快速迭代的跨平台应用,尤其适合 Web 开发者 | 需自行关注 Chromium 漏洞,谨慎处理外部内容和 Node.js API | 较大,内置 Chromium 和 Node.js 运行时 |
| Tauri | Rust + WebView (系统提供) | 前端 + Rust 核心后端 | 快速成长,势头迅猛,灵活性高 | 对性能、安全性和体积要求高的应用,适合 Rust 开发者 | Rust 语言天生具有内存安全优势,沙箱模型更严格 | 极小,利用系统 WebView,无需捆绑浏览器内核 |
| NW.js | JavaScript/HTML/CSS + Chromium + Node.js | 单一进程/混合进程模式 | 相对较小,早期与 Electron 类似 | 与 Electron 类似,但对 Node.js 集成更深入 | 与 Electron 类似,需关注 Chromium 的安全问题 | 较大,同样需要集成 Chromium |
| Flutter | Dart + Skia (自绘引擎) | Dart VM + C++ 引擎 | 迅速崛起,由 Google 强力支持 | 追求原生性能和 UI 一致性的移动、桌面及 Web 应用 | Dart 是类型安全的语言,自绘引擎减少了部分 Web 漏洞风险 | 较小,Skia 引擎和 AOT 编译提供了良好的性能和体积控制 |
IDE 与开发工具
数据库与管理工具
社交与通讯
多媒体与娱乐
金融与交易
其他专业工具
在开始 Electron 开发之前,确保你的开发环境满足以下要求:
| 要求项 | 最低版本 | 推荐版本 |
|---|---|---|
| Node.js | 18.x | 20.x LTS 或更高 |
| npm | 8.x | 最新稳定版 |
| 操作系统 | Windows 10+, macOS 12+, Ubuntu 22.04+ | 最新稳定版 |
| 内存 | 4GB | 8GB+ |
| 磁盘空间 | 5GB | 10GB+ |
💡 提示: 推荐使用 nvm (macOS/Linux) 或 nvm-windows 管理 Node.js 版本
由于 Electron 依赖包较大(约 100MB+),国内用户建议配置镜像源以加速下载。
# 配置 npm 淘宝镜像
npm config set registry https://registry.npmmirror.com
# 配置 Electron 二进制包镜像
npm config set electron_mirror https://npmmirror.com/mirrors/electron/
# 配置 Electron Builder 镜像(打包工具)
npm config set electron_builder_binaries_mirror https://npmmirror.com/mirrors/electron-builder-binaries/在终端配置文件(~/.bashrc、~/.zshrc 或系统环境变量)中添加:
# npm 镜像
export npm_config_registry=https://registry.npmmirror.com
# Electron 镜像
export ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/
# Electron Builder 镜像
export ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/在项目根目录创建或编辑 .npmrc 文件:
registry=https://registry.npmmirror.com
electron_mirror=https://npmmirror.com/mirrors/electron/
electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/| 镜像名称 | 地址 | 适用场景 |
|---|---|---|
| 淘宝镜像 | https://registry.npmmirror.com | 国内开发推荐 |
| 腾讯镜像 | https://mirrors.cloud.tencent.com/npm/ | 备选方案 |
| 华为镜像 | https://mirrors.huaweicloud.com/repository/npm/ | 备选方案 |
| 官方源 | https://registry.npmjs.org | 国外或需要最新版本 |
安装并配置好环境后,可以快速创建第一个 Electron 应用:
# 创建项目目录
mkdir my-electron-app && cd my-electron-app
# 初始化项目
npm init -y
# 安装 Electron
npm install electron --save-dev
# 启动应用(需要先创建 main.js 入口文件)
npm start📖 下一步: 参考 04-第一个应用 学习如何编写完整的 Electron 应用代码
A: 使用国内镜像源加速下载:
# 方法1: 临时使用
ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ npm install electron --save-dev
# 方法2: 永久配置(推荐)
npm config set electron_mirror https://npmmirror.com/mirrors/electron/A: 尝试以下解决方案:
# macOS/Linux: 使用 sudo(不推荐)
sudo npm install electron --save-dev
# 更好的方案: 修复 npm 权限
sudo chown -R $(whoami) ~/.npm
sudo chown -R $(whoami) /usr/local/lib/node_modulesA: 使用 nvm 切换到兼容的 Node.js 版本:
# 查看本地已安装的 Node.js 版本
nvm list
# 安装并切换到 Node.js 18
nvm install 18
nvm use 18
# 验证版本
node -v # 应显示 v18.x.x
npm -vA: 打包后的应用会包含 Electron 的二进制文件,运行时不需要单独依赖 Electron npm 包。因此只在开发阶段需要,作为开发依赖安装。
A: 建议遵循以下原则:
A: 主要区别在于:
\,macOS/Linux 使用正斜杠 /(建议使用 path.join() 自动处理)A: 优化建议:
A: 优化策略:
win.destroy() 释放资源A: 遵循 Electron 安全最佳实践:
// main.js
const mainWindow = new BrowserWindow({
webPreferences: {
// 启用上下文隔离(Electron 12+ 默认启用)
contextIsolation: true,
// 禁用 Node.js 集成(推荐)
nodeIntegration: false,
// 启用沙箱
sandbox: true,
// 预加载脚本
preload: path.join(__dirname, 'preload.js')
}
})关键安全措施:
contextIsolationnodeIntegrationpreload.js 安全暴露 APIA: 多层防护策略:
<!-- index.html -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">// preload.js - 验证 IPC 通道白名单
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('electronAPI', {
send: (channel, data) => {
const validChannels = ['toMain']
if (validChannels.includes(channel)) {
ipcRenderer.send(channel, data)
}
}
})使用 electron forge 或 electron-builder 都可以打包 electron 应用。
如果使用脚手架时,一般脚手架已经做好了打包配置,下面是介绍使用 electron-vite 脚手架开发的 electron 完成打包操作,它在内部使用 electron-builder 扩展进行打包操作。
electron-builder.yml 是打包的配置文件。
下面对常用配置项说明
${productName} 读取${productName} 指 electron-builder.yml 配置文件中的 productName 值${name} 指package.json 中的 name 值${version} 指 package.json 中的 version 值打包图标等文件定义
asar 是一种将多个文件合并成一个文件的类 tar 风格的归档格式。 Electron 可以无需解压整个文件,即可从其中读取任意文件内容。可加快 require 速度,由于文件整合到一个 asar 文件,所以安装也会变快
该配置项用于设置哪些文件从 asar 中解压缩
相对于应用目录的 glob 模式 ,它指定在复制文件以创建包时要包含的文件
NSIS (Nullsoft Scriptable Install System) 是一个专业开源的制作 windows 安装程序的工具,下面对属性做个说明
配置项中的 dmg 是苹果系统的安装配置
使用软件的自动更新可以非常容易的对用户进行交付,使用自动更新可以修复软件的问题,让用户体验到最新的功能。自动更新过程是自动下载的,软件会向用户发送更新通知,用户确认后就可以自动安装软件的新版本了
electron 自动更新使用是非常简单的,下面我们来学习自动更新。
自动更新需要使用 electron-updater 结合 electron-builder 包完成
pnpm add electron-updater打包生成的安装程序不要有空格,如果有空格需要使用 - 连接
自动更新需要在 package.json 文件中添加 repository 配置段,指向到你的更新文件地址
{
"name": "camera",
"version": "1.0.0",
"repository": "https://github.com/houdunwang/camera",
...
}下面创建脚本 autoUpdater.ts 并在主进程文件中引入
import { is } from '@electron-toolkit/utils'
import { BrowserWindow, dialog, shell } from 'electron'
import { autoUpdater } from 'electron-updater'
//关闭自动下载更新,改为用户确认后再下载
autoUpdater.autoDownload = false
//退出时不自动安装更新
autoUpdater.autoInstallOnAppQuit = false
export default (win: BrowserWindow) => {
//检查是否有更新
if (!is.dev) autoUpdater.checkForUpdates()
//有新版本时
autoUpdater.on('update-available', (_info) => {
dialog
.showMessageBox({
type: 'warning',
title: '更新提示',
message: '有新版本发布了',
buttons: ['更新', '取消'],
cancelId: 1
})
.then((res) => {
if (res.response == 0) {
//开始下载更新
autoUpdater.downloadUpdate()
}
})
})
//没有新版本时
autoUpdater.on('update-not-available', (_info) => {
// dialog.showMessageBox({
// type: 'info',
// message: `你已经是最新版本`
// })
})
//更新下载完毕
autoUpdater.on('update-downloaded', (_info) => {
//退出并安装更新
autoUpdater.quitAndInstall()
})
//更新发生错误
autoUpdater.on('error', (_info) => {
dialog
.showMessageBox({
type: 'warning',
title: '更新提示',
message: '软件更新失败',
buttons: ['网站下载', '取消更新'],
cancelId: 1
})
.then((res) => {
if (res.response == 0) {
shell.openExternal('https://github.com/houdunwang/camera/releases')
}
})
})
// 监听下载进度
autoUpdater.on('download-progress', (progress) => {
win.webContents.send('downloadProgress', progress)
})
}如果你想将下载进度展示给用户,需要在 autoUpdater.ts 中设置监听脚本,即在有下载事件发生时,触发渲染进程事件
// 监听下载进度
autoUpdater.on('download-progress', (progress) => {
win.webContents.send('downloadProgress', progress)
})然后在 preload.js 预加载脚本中配置渲染进程事件
contextBridge.exposeInMainWorld('api', {
//下载进度条
downloadProgress: (callback: (progress: any) => {}) => {
ipcRenderer.on('downloadProgress', (_event, progress) => {
callback(progress)
})
}
})然后写个 vue 组件展示下载界面,有以下几个特点说明下
<script setup lang="ts">
import { ref } from 'vue'
//下载进度条
const progress = ref<any>(null)
window.api.downloadProgress((_progress: any) => {
progress.value = _progress
})
</script>
<template>
<main
class="p-5 w-screen h-screen absolute z-30 flex flex-col justify-center shadow-inner bg-gray-100"
v-if="progress"
>
<div class="flex justify-center">
<img
src="../assets/xj.jpg"
alt=""
class="w-[80px] h-[80px] object-cover rounded-full shadow-md"
/>
</div>
<h1 class="py-3 text-center font-bold opacity-60 text-sm font-mono">下载更新包</h1>
<div class="">
<el-progress
:text-inside="true"
:stroke-width="26"
:percentage="parseInt(progress.percent)"
/>
</div>
<div class="mt-5 flex justify-center">
<a
href="https://github.com/houdunwang/camera/releases"
target="_blank"
class="bg-violet-600 py-2 px-4 rounded-md text-white text-sm hover:bg-violet-500"
>官网下载</a
>
</div>
</main>
</template>下面我们使用 Github 的 actions 将项目进行自动打包编译。修改 package.json 设置编译命令
{
"name": "houdunren-camera",
"version": "1.0.5",
"homepage": "https://www.houdunren.com",
"repository": "https://github.com/houdunwang/camera",
"scripts": {
"build:win": "npm run build && electron-builder --win --config --publish never",
"build:mac-x86": "npm run build && electron-builder --mac --config --publish never",
"build:mac-arm64": "npm run build && electron-builder --arm64 --mac --config --publish never",
"build:linux": "npm run build && electron-builder --linux --config --publish never"
},
} 首先在项目根目录创建文件 .github/workflows/build.yml
name: Build App
# permissions:
# contents: write
on:
push:
tags:
- v*
jobs:
release:
name: build and release electron app
runs-on: ${{ matrix.os }}
if: startsWith(github.ref, 'refs/tags/')
strategy:
fail-fast: false
matrix:
os: [windows-latest, macos-latest, ubuntu-latest]
steps:
- name: Check out git repository
uses: actions/checkout@v3.0.0
- name: Install Node.js
uses: actions/setup-node@v3.0.0
with:
node-version: 16
- name: Install Dependencies
run: |
npm i -g pnpm
pnpm install
- name: Build Electron App for windows
if: matrix.os == 'windows-latest'
run: pnpm run build:win
env:
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
- name: Build Electron App for macos
if: matrix.os == 'macos-latest'
run: |
pnpm run build:mac-x86
pnpm run build:mac-arm64
env:
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
# - name: Build Electron App for linux
# if: matrix.os == 'ubuntu-latest'
# run: |
# pnpm run build:linux-x86
# pnpm run build:linux-arm64
# env:
# GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
- name: Cleanup Artifacts for Windows
if: matrix.os == 'windows-latest'
run: |
npx del-cli "dist/*" "!dist/*.exe" "!dist/*.zip" "!dist/*.yml"
- name: Cleanup Artifacts for MacOS
if: matrix.os == 'macos-latest'
run: |
npx del "dist/*" "!dist/(*.dmg|*.zip|latest*.yml)"
- name: Cleanup Artifacts for Linux
if: matrix.os == 'ubuntu-latest'
run: |
npx del "dist/*" "!dist/(*.AppImage|latest*.yml)"
- name: upload artifacts
uses: actions/upload-artifact@v3.0.0
with:
name: ${{ matrix.os }}
path: dist
- name: release
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
files: 'dist/**'
env:
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }} 然后在 Github 你的项目中点击 Settings

然后点击 Actions/General
然后修改 Workflow 为读写权限

使用 wallpaper 扩展包操作,如果和 electron 结合使用,就不能使用高版本的 wallpaper,因为旧版本 Electron 不支持 ESM,但高版本的 wallpaper 使用 ESM
pnpm add wallpaper@v5.0.1下面是请求远程图片,并设置为壁纸的主进程代码
import { IpcMainEvent, ipcMain } from 'electron'
import { createWriteStream } from 'fs'
import fetch from 'node-fetch'
import { pipeline } from 'node:stream'
import { promisify } from 'node:util'
import { resolve } from 'path'
import wallpaper from 'wallpaper'
ipcMain.on('setWallpaper', async (event: IpcMainEvent, url: string) => {
const localFile = resolve(__dirname, '../../wallpaper/' + url.split('/').pop())
const streamPipeline = promisify(pipeline)
const response = await fetch(url)
if (!response.ok) throw new Error(`unexpected response ${response.statusText}`)
await streamPipeline(response.body!, createWriteStream(localFile))
wallpaper.set(localFile, { screen: 'all', scale: 'auto' })
})