Electron 基础教程:从环境搭建到第一个桌面应用
Electron 作为一款流行的跨平台桌面应用开发框架,让开发者能够使用 HTML、CSS 和 JavaScript 这些前端技术栈,快速构建在 Windows、macOS 和 Linux 上运行的桌面应用。无论是 VS Code、Slack 还是 Discord,背后都离不开 Electron 的支撑。本文将从零基础出发,带大家掌握 Electron 的核心概念,完成环境搭建并开发第一个桌面应用。
一、Electron 核心原理:为什么能 “用前端写桌面应用”?
在学习实操前,我们需要先理解 Electron 的核心逻辑 —— 它并非 “将网页打包成桌面程序”,而是通过 “主进程 + 渲染进程” 的架构,打通了前端技术与操作系统的交互通道:
主进程(Main Process) | 控制应用生命周期(启动、关闭、窗口管理),负责与操作系统交互(如文件读写、系统通知) | Node.js 环境,可调用 Electron 提供的系统级 API(如
、
) |
渲染进程(Renderer Process) | 负责应用的 UI 展示,本质是一个 “带 Node.js 能力的浏览器窗口” | 前端技术栈(HTML/CSS/JS),可通过
与主进程通信,也能使用 Node.js 模块 |
简单来说:主进程是 “后台管家”,负责管理窗口和系统交互;渲染进程是 “前台界面”,负责展示页面和用户交互,二者通过 IPC(进程间通信) 机制传递数据,共同构成一个完整的桌面应用。
二、环境搭建:3 步准备开发环境
Electron 依赖 Node.js(需 v14 及以上版本),因此第一步需确保本地已安装 Node.js(可通过 node -v 命令检查,未安装可从 Node.js 官网 下载)。
步骤 1:初始化项目目录
新建一个文件夹(如 my-first-electron-app),打开终端进入该目录,执行以下命令初始化 Node.js 项目(一路回车默认配置即可):
bash
npm init
执行完成后,目录下会生成 package.json 文件,用于管理项目依赖和配置。
步骤 2:安装 Electron 依赖
在项目目录下执行以下命令,安装 Electron 作为开发依赖:
bash
npm install electron --save-dev
安装完成后,package.json 中会新增 devDependencies 字段,包含 Electron 的版本信息。
步骤 3:配置启动脚本
打开 package.json 文件,找到 scripts 字段,将其修改为:
json
"scripts": {
"start": "electron ."
}
这一步的作用是:通过 npm start 命令,告诉 Node.js 以 Electron 环境运行当前目录(. 代表当前目录)的代码。
三、开发第一个 Electron 应用:窗口与界面
一个最小化的 Electron 应用需要 3 个核心文件:
main.js:主进程入口文件,负责创建窗口和管理应用生命周期;index.html:渲染进程的 UI 页面,即应用的可视化界面;package.json:项目配置文件,指定主进程入口。
1. 编写主进程文件(main.js)
在项目根目录新建 main.js,粘贴以下代码(关键代码已加注释):
javascript
// 1. 引入 Electron 核心模块
const { app, BrowserWindow } = require('electron');
const path = require('path'); // Node.js 内置路径模块,用于处理文件路径
// 2. 定义创建窗口的函数
function createWindow() {
// 创建一个浏览器窗口(渲染进程)
const mainWindow = new BrowserWindow({
width: 800, // 窗口宽度
height: 600, // 窗口高度
webPreferences: {
// 允许渲染进程使用 Node.js 模块(默认关闭,按需开启)
nodeIntegration: true,
// 关闭上下文隔离(与 nodeIntegration 配合使用,确保渲染进程能访问 Node.js)
contextIsolation: false
}
});
// 3. 加载应用的 UI 页面(渲染进程入口)
mainWindow.loadFile('index.html');
// 可选:打开开发者工具(类似浏览器 F12,方便调试 UI)
mainWindow.webContents.openDevTools();
}
// 4. 监听应用的“就绪”事件(Electron 初始化完成后触发)
app.whenReady().then(() => {
createWindow(); // 初始化完成后创建窗口
// 处理 macOS 特殊逻辑:关闭所有窗口后,点击 dock 图标重新打开窗口
app.on('activate', function () {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
// 5. 监听应用的“关闭”事件(处理不同系统的退出逻辑)
app.on('window-all-closed', function () {
// Windows 和 Linux:所有窗口关闭后退出应用
// macOS:应用关闭窗口后仍驻留 dock,需手动退出
if (process.platform !== 'darwin') app.quit();
});
2. 编写渲染进程 UI(index.html)
在项目根目录新建 index.html,编写应用的界面(和普通网页完全一致):
html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>我的第一个 Electron 应用</title>
<style>
/* 简单的样式美化 */
body {
margin: 0;
padding: 20px;
font-family: Arial, sans-serif;
text-align: center;
}
h1 {
color: #2c3e50;
}
button {
padding: 10px 20px;
font-size: 16px;
background: #3498db;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background: #2980b9;
}
</style>
</head>
<body>
<h1>Hello Electron!</h1>
<p>这是我用 HTML/CSS/JS 写的桌面应用</p>
<!-- 测试按钮:点击后触发 JS 逻辑 -->
<button id="testBtn">点击我</button>
<script>
// 渲染进程中的 JS(和普通网页 JS 一致,还能调用 Node.js 模块)
const btn = document.getElementById('testBtn');
btn.addEventListener('click', () => {
// 这里可以写任何前端逻辑,比如调用 Node.js 的 fs 模块读取文件
alert('按钮被点击啦!');
});
</script>
</body>
</html>
3. 运行应用
回到终端,在项目目录下执行以下命令,启动 Electron 应用:
bash
npm start
此时会弹出一个桌面窗口,显示 index.html 中的内容,点击按钮会触发弹窗 —— 这就是你的第一个 Electron 应用!
四、核心进阶:主进程与渲染进程通信(IPC)
前面提到,主进程负责系统交互(如文件读写),渲染进程负责 UI,二者需要通过 IPC 通信传递数据。下面通过一个 “读取本地文件” 的案例,演示 IPC 的使用。
1. 主进程:监听渲染进程的请求(main.js 新增代码)
在 main.js 中引入 ipcMain 模块,并监听渲染进程的 “读取文件” 请求:
javascript
// 在 main.js 顶部引入 ipcMain
const { app, BrowserWindow, ipcMain } = require('electron');
const fs = require('fs'); // Node.js 内置文件模块,用于读写文件
// ... 其他代码(createWindow 等)保持不变 ...
// 监听渲染进程发送的 "read-file" 事件
ipcMain.handle('read-file', async (event, filePath) => {
try {
// 读取文件内容(Node.js fs 模块)
const content = fs.readFileSync(filePath, 'utf8');
return { success: true, content }; // 返回成功结果给渲染进程
} catch (error) {
return { success: false, error: error.message }; // 返回错误信息
}
});
2. 渲染进程:发送请求并接收结果(index.html 新增代码)
在 index.html 中引入 ipcRenderer 模块,添加 “选择文件” 按钮,并编写发送 IPC 请求的逻辑:
html
<!-- 在 index.html 的 body 中新增按钮和结果展示区域 -->
<input type="file" id="fileSelector" style="margin-top: 20px;"/>
<div id="fileContent" style="margin-top: 20px; text-align: left; padding: 0 20px;"></div>
<script>
// 引入 ipcRenderer(渲染进程专用)
const { ipcRenderer } = require('electron');
const fileSelector = document.getElementById('fileSelector');
const fileContent = document.getElementById('fileContent');
// 监听文件选择事件
fileSelector.addEventListener('change', async (e) => {
const filePath = e.target.files[0].path; // 获取选择的文件路径
// 向主进程发送 "read-file" 请求,并传递文件路径
const result = await ipcRenderer.invoke('read-file', filePath);
// 展示结果
if (result.success) {
fileContent.innerHTML = `<strong>文件内容:</strong><br>${result.content}`;
} else {
fileContent.innerHTML = `<strong>读取失败:</strong>${result.error}`;
}
});
// ... 之前的按钮点击逻辑保持不变 ...
</script>
再次运行 npm start,选择一个本地文本文件(如 .txt),就能看到文件内容在应用中展示 —— 这就是 IPC 通信的核心用法:渲染进程发送请求,主进程处理并返回结果。
五、应用打包:将代码变成可执行文件
开发完成后,需要将代码打包成对应系统的可执行文件(如 Windows 的 .exe、macOS 的 .app)。这里推荐使用 electron-packager 工具,操作简单且跨平台。
步骤 1:安装 electron-packager
bash
npm install electron-packager --save-dev
步骤 2:配置打包脚本
在 package.json 的 scripts 中添加打包命令(以 Windows 为例,其他系统可修改 --platform 参数):
json
"scripts": {
"start": "electron .",
"package:win": "electron-packager . MyElectronApp --platform=win32 --arch=x64 --out=dist"
}
参数说明:
.:打包当前目录;MyElectronApp:打包后的应用名称;--platform=win32:目标系统(win32=Windows,darwin=macOS,linux=Linux);--arch=x64:目标架构(64 位);--out=dist:打包后的文件输出到dist目录。
步骤 3:执行打包命令
bash
npm run package:win
打包完成后,dist 目录下会生成 MyElectronApp-win32-x64 文件夹,其中的 MyElectronApp.exe 就是可直接运行的桌面应用。
六、总结与下一步学习方向
通过本文,你已经掌握了 Electron 的核心基础:
- 理解 “主进程 + 渲染进程” 的架构;
- 完成环境搭建并开发第一个窗口应用;
- 实现主进程与渲染进程的 IPC 通信;
- 将应用打包成可执行文件。
如果想进一步深入,可以学习这些方向:
- 应用菜单与快捷键:通过
Menu模块自定义应用菜单(如顶部菜单栏); - 系统功能集成:调用 Electron API 实现通知(
Notification)、托盘图标(Tray)、剪贴板(clipboard)等; - 性能优化:解决 Electron 应用体积大、内存占用高的问题(如代码分割、禁用不必要的模块);
- 高级打包工具:使用
electron-builder生成安装包(如.msi、.dmg),支持自动更新。
Electron 的生态非常丰富,结合前端技术栈的灵活性,你可以开发出功能强大的跨平台桌面应用。动手实践是最好的学习方式,快去扩展你的第一个应用吧!
g.hxqdjy.com
5.hxqdjy.com
79.hxqdjy.com
duet.mengkaigroup.com
hjuk.mengkaigroup.com
381.mengkaigroup.com
fg44fg265.mengkaigroup.com
afyi17.mengkaigroup.com
o17km.tongdaolzw.com
oxmvz.tongdaolzw.com
58c94.tongdaolzw.com
hb0b2.tongdaolzw.com
rfqz7.tongdaolzw.com
7gblq.tongdaolzw.com
dvy0o.tongdaolzw.com
ucprn.tongdaolzw.com
v2jl2.tongdaolzw.com
ekzen.tongdaolzw.com
6hv7n.tongdaolzw.com
ws6nb.tongdaolzw.com
