Electron 的核心概念

Electron 是一个基于 Chromium 和 Node.js 的框架,用于构建跨平台的桌面应用程序。它将 Chromium 的渲染引擎与 Node.js 的后端能力结合,使开发者能用 HTML、CSS 和 JavaScript 开发桌面应用。

主进程与渲染进程

Electron 应用分为主进程(Main Process)和渲染进程(Renderer Process)。主进程负责管理应用生命周期、创建窗口和与操作系统交互。渲染进程负责展示页面内容,每个窗口对应一个渲染进程。

// 主进程示例
const { app, BrowserWindow } = require('electron');

let mainWindow;

app.on('ready', () => {
  mainWindow = new BrowserWindow({ width: 800, height: 600 });
  mainWindow.loadFile('index.html');
});

进程间通信

Electron 提供 ipcMainipcRenderer 模块实现主进程和渲染进程的通信。

// 主进程
const { ipcMain } = require('electron');
ipcMain.on('message-from-renderer', (event, arg) => {
  console.log(arg);
  event.reply('reply', 'pong');
});

// 渲染进程
const { ipcRenderer } = require('electron');
ipcRenderer.send('message-from-renderer', 'ping');
ipcRenderer.on('reply', (event, arg) => {
  console.log(arg); // 输出 'pong'
});

原生 API 集成

Electron 提供 API 访问系统功能,如文件系统、对话框、系统托盘等。

// 显示文件选择对话框
const { dialog } = require('electron');
dialog.showOpenDialog({
  properties: ['openFile']
}).then(result => {
  console.log(result.filePaths);
});

打包与分发

使用 electron-builderelectron-packager 打包应用为可执行文件。

# 安装 electron-builder
npm install electron-builder --save-dev

# 配置 package.json
{
  "build": {
    "appId": "com.example.app",
    "win": {
      "target": "nsis"
    }
  }
}

# 打包
npx electron-builder

实际案例:简易 Markdown 编辑器

以下是一个简易 Markdown 编辑器的实现:

主进程 (main.js)

const { app, BrowserWindow, ipcMain } = require('electron');
const fs = require('fs');
const path = require('path');

let mainWindow;

app.on('ready', () => {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
      contextIsolation: false
    }
  });
  mainWindow.loadFile('index.html');
});

ipcMain.on('save-file', (event, { content, filePath }) => {
  fs.writeFile(filePath, content, (err) => {
    event.reply('save-reply', err ? err.message : 'File saved');
  });
});

渲染进程 (index.html)

<!DOCTYPE html>
<html>
<head>
  <title>Markdown Editor</title>
  <script src="renderer.js"></script>
</head>
<body>
  <textarea id="editor" style="width:100%; height:90%"></textarea>
  <button id="save">Save</button>
  <div id="status"></div>
</body>
</html>

渲染进程逻辑 (renderer.js)

const { ipcRenderer } = require('electron');
const { dialog } = require('electron').remote;

document.getElementById('save').addEventListener('click', () => {
  const content = document.getElementById('editor').value;
  dialog.showSaveDialog({
    title: 'Save Markdown',
    filters: [{ name: 'Markdown', extensions: ['md'] }]
  }).then(result => {
    if (!result.canceled && result.filePath) {
      ipcRenderer.send('save-file', {
        content: content,
        filePath: result.filePath
      });
      ipcRenderer.on('save-reply', (event, message) => {
        document.getElementById('status').innerText = message;
      });
    }
  });
});

调试与开发工具

Electron 应用可以像网页一样使用 Chrome 开发者工具调试。

// 在主进程中打开开发者工具
mainWindow.webContents.openDevTools();

安全最佳实践

  • 启用 contextIsolationnodeIntegration 为 false(默认)
  • 使用 sandbox 选项限制渲染进程权限
  • 验证所有 IPC 消息
  • 禁用 enableRemoteModule(默认禁用)
new BrowserWindow({
  webPreferences: {
    contextIsolation: true,
    nodeIntegration: false,
    sandbox: true
  }
});

性能优化

  • 使用 webFrame.setZoomFactor 限制缩放
  • 启用硬件加速
  • 使用 BrowserWindowbackgroundThrottling 选项
  • 考虑使用 offscreen 渲染
app.commandLine.appendSwitch('enable-accelerated-2d-canvas', 'true');

以上内容涵盖了 Electron 的主要知识点和实际应用案例,从基础概念到高级功能,包括进程通信、原生API集成、打包分发和安全实践等关键方面。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐