Electron实战:从零搭建一个跨平台桌面应用(附完整代码)

张开发
2026/4/16 21:59:47 15 分钟阅读

分享文章

Electron实战:从零搭建一个跨平台桌面应用(附完整代码)
Electron实战从零搭建跨平台桌面应用的完整指南如果你是一名前端开发者想要将自己的Web技能扩展到桌面应用领域Electron可能是最理想的选择。这个开源框架让开发者能够使用熟悉的HTML、CSS和JavaScript构建跨平台的桌面应用。从VS Code到Slack许多知名应用都基于Electron开发。本文将带你从零开始完整构建一个Electron应用涵盖从环境配置到打包发布的每个环节。1. 环境准备与项目初始化开始Electron开发前你需要确保系统满足以下基本要求Node.js建议安装最新的LTS版本16.x或更高npm或yarnNode.js自带npm但yarn也是不错的选择代码编辑器VS Code是最受欢迎的选择内置对JavaScript和Electron的良好支持让我们从创建一个基础项目开始# 创建项目目录并进入 mkdir my-electron-app cd my-electron-app # 初始化npm项目 npm init -y # 安装Electron作为开发依赖 npm install --save-dev electron初始化完成后你的package.json应该包含以下关键配置{ name: my-electron-app, version: 1.0.0, main: main.js, scripts: { start: electron ., test: echo \Error: no test specified\ exit 1 }, devDependencies: { electron: ^28.0.0 } }2. 主进程与渲染进程基础Electron应用的核心架构基于两个主要概念主进程管理应用生命周期和原生操作系统交互渲染进程负责显示用户界面基于Chromium创建基础的主进程文件main.jsconst { app, BrowserWindow } require(electron) const path require(path) function createWindow() { const mainWindow new BrowserWindow({ width: 800, height: 600, webPreferences: { preload: path.join(__dirname, preload.js) } }) // 加载应用界面 mainWindow.loadFile(index.html) // 开发模式下打开开发者工具 mainWindow.webContents.openDevTools() } app.whenReady().then(() { createWindow() // macOS特有的行为当没有窗口时重新创建 app.on(activate, () { if (BrowserWindow.getAllWindows().length 0) createWindow() }) }) // 非macOS平台所有窗口关闭时退出应用 app.on(window-all-closed, () { if (process.platform ! darwin) app.quit() })创建基础的渲染进程文件index.html!DOCTYPE html html head meta charsetUTF-8 title我的Electron应用/title /head body h1欢迎使用我的Electron应用/h1 p我们正在使用Node.js span idnode-version/span, Chromium span idchrome-version/span, 和Electron span idelectron-version/span./p script srcrenderer.js/script /body /html3. 进程间安全通信Electron的安全模型要求渲染进程不能直接访问Node.js API。我们需要通过预加载脚本和进程间通信(IPC)来实现安全交互。创建preload.js文件const { contextBridge, ipcRenderer } require(electron) contextBridge.exposeInMainWorld(electronAPI, { getVersions: () ipcRenderer.invoke(get-versions), setTitle: (title) ipcRenderer.send(set-title, title), openFile: () ipcRenderer.invoke(dialog:openFile), onUpdateCounter: (callback) ipcRenderer.on(update-counter, callback) })更新main.js添加IPC处理const { ipcMain, dialog } require(electron) // 处理获取版本信息的请求 ipcMain.handle(get-versions, () { return { node: process.versions.node, chrome: process.versions.chrome, electron: process.versions.electron } }) // 处理设置窗口标题的请求 ipcMain.on(set-title, (event, title) { const webContents event.sender const win BrowserWindow.fromWebContents(webContents) win.setTitle(title) }) // 处理打开文件对话框的请求 ipcMain.handle(dialog:openFile, async () { const { canceled, filePaths } await dialog.showOpenDialog({ properties: [openFile] }) if (!canceled) { return filePaths[0] } })创建renderer.js文件使用这些APIdocument.addEventListener(DOMContentLoaded, async () { const versions await window.electronAPI.getVersions() document.getElementById(node-version).innerText versions.node document.getElementById(chrome-version).innerText versions.chrome document.getElementById(electron-version).innerText versions.electron // 示例设置窗口标题 document.querySelector(h1).addEventListener(click, () { window.electronAPI.setTitle(新标题) }) // 示例打开文件对话框 const openFileBtn document.createElement(button) openFileBtn.textContent 选择文件 openFileBtn.addEventListener(click, async () { const filePath await window.electronAPI.openFile() if (filePath) { alert(已选择文件: ${filePath}) } }) document.body.appendChild(openFileBtn) })4. 原生功能集成Electron提供了丰富的原生API让我们能够创建更接近原生应用的用户体验。4.1 系统菜单const { Menu } require(electron) const template [ { label: 文件, submenu: [ { label: 新建窗口, click: () { createWindow() } }, { type: separator }, { label: 退出, role: quit } ] }, { label: 编辑, submenu: [ { role: undo }, { role: redo }, { type: separator }, { role: cut }, { role: copy }, { role: paste } ] }, { label: 视图, submenu: [ { role: reload }, { role: forceReload }, { role: toggleDevTools }, { type: separator }, { role: resetZoom }, { role: zoomIn }, { role: zoomOut }, { type: separator }, { role: togglefullscreen } ] } ] const menu Menu.buildFromTemplate(template) Menu.setApplicationMenu(menu)4.2 系统托盘const { Tray, nativeImage } require(electron) const path require(path) let tray null app.whenReady().then(() { const icon nativeImage.createFromPath(path.join(__dirname, icon.png)) tray new Tray(icon) const contextMenu Menu.buildFromTemplate([ { label: 显示, click: () mainWindow.show() }, { label: 隐藏, click: () mainWindow.hide() }, { type: separator }, { label: 退出, click: () app.quit() } ]) tray.setToolTip(我的Electron应用) tray.setContextMenu(contextMenu) })4.3 原生通知const { Notification } require(electron) function showNotification(title, body) { new Notification({ title, body }).show() }5. 应用打包与分发开发完成后我们需要将应用打包成可执行文件。electron-builder是最流行的打包工具。首先安装依赖npm install --save-dev electron-builder然后在package.json中添加构建配置{ build: { appId: com.example.myapp, productName: 我的Electron应用, win: { target: nsis, icon: build/icon.ico }, mac: { target: dmg, icon: build/icon.icns }, linux: { target: AppImage, icon: build/icon.png } } }添加构建脚本{ scripts: { build: electron-builder, build:win: electron-builder --win, build:mac: electron-builder --mac, build:linux: electron-builder --linux } }运行构建命令npm run build构建完成后你会在dist目录下找到打包好的应用安装包。6. 性能优化与最佳实践为了确保Electron应用运行流畅需要注意以下几点懒加载资源不要一次性加载所有资源优化IPC通信减少进程间通信的频率和数据量避免阻塞渲染进程将耗时操作放到主进程或Worker中合理管理窗口不用的窗口及时销毁使用现代前端框架如React、Vue或Angular// 示例使用Web Worker处理耗时任务 const worker new Worker(worker.js) worker.postMessage({ data: largeData }) worker.onmessage (event) { console.log(Worker result:, event.data) }7. 安全注意事项Electron应用的安全至关重要以下是一些关键点保持依赖更新定期运行npm audit检查漏洞禁用Node.js集成在渲染进程中保持nodeIntegration: false启用上下文隔离设置contextIsolation: true使用内容安全策略(CSP)限制资源加载来源验证IPC消息不信任来自渲染进程的任何输入!-- 示例设置内容安全策略 -- meta http-equivContent-Security-Policy contentdefault-src self; script-src self; img-src self data:;8. 进阶功能探索掌握了基础后你可以进一步探索Electron的更多能力自动更新使用electron-updater实现应用自动更新原生模块集成C编写的Node.js原生模块自定义协议注册类似app://的自定义协议多窗口管理实现复杂的多窗口应用架构系统集成深度集成操作系统功能// 示例注册自定义协议 const { protocol } require(electron) protocol.registerFileProtocol(app, (request, callback) { const url request.url.substr(6) callback({ path: path.join(__dirname, url) }) })Electron为Web开发者打开了桌面应用开发的大门。通过合理利用其丰富的API和跨平台能力你可以构建出功能强大、体验优秀的桌面应用。记住良好的架构设计、性能优化和安全实践是开发高质量Electron应用的关键。

更多文章