Electron 常用 API 全面指南

5 阅读4分钟

Electron 常用 API 全面指南

Electron 提供了丰富的 API 来构建跨平台桌面应用程序。以下是 Electron 中最常用和最重要的 API 分类详解:

1. 应用生命周期管理

app 模块 (主进程)

const { app } = require('electron')

// 应用事件
app.on('ready', () => {
  console.log('应用已准备好')
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit()
})

app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow()
})

// 应用控制
app.quit() // 退出应用
app.exit(0) // 立即退出并返回状态码

// 应用信息
console.log(app.getName()) // 应用名称
console.log(app.getVersion()) // 应用版本
console.log(app.getPath('userData')) // 获取各种系统路径

2. 窗口管理

BrowserWindow 模块 (主进程)

const { BrowserWindow } = require('electron')

// 创建窗口
const win = new BrowserWindow({
  width: 800,
  height: 600,
  webPreferences: {
    nodeIntegration: true,
    contextIsolation: false,
    preload: path.join(__dirname, 'preload.js')
  }
})

// 窗口操作
win.loadURL('https://electronjs.org') // 加载URL
win.loadFile('index.html') // 加载本地文件
win.show() // 显示窗口
win.hide() // 隐藏窗口
win.close() // 关闭窗口
win.maximize() // 最大化
win.minimize() // 最小化
win.restore() // 从最小化恢复

// 窗口事件
win.on('closed', () => { win = null })
win.on('focus', () => console.log('窗口获得焦点'))

3. 进程间通信 (IPC)

ipcMain (主进程) 和 ipcRenderer (渲染进程)

主进程:

const { ipcMain } = require('electron')

// 监听渲染进程消息
ipcMain.on('renderer-event', (event, arg) => {
  console.log('收到渲染进程消息:', arg)
  event.reply('main-reply', 'pong')
})

// 处理异步请求
ipcMain.handle('get-data', async () => {
  return await fetchDataFromDB()
})

渲染进程:

const { ipcRenderer } = require('electron')

// 发送消息
ipcRenderer.send('renderer-event', 'ping')

// 接收回复
ipcRenderer.on('main-reply', (event, arg) => {
  console.log('收到主进程回复:', arg)
})

// 调用主进程方法
const data = await ipcRenderer.invoke('get-data')

4. 原生对话框

dialog 模块 (主进程)

const { dialog } = require('electron')

// 文件对话框
dialog.showOpenDialog({
  properties: ['openFile', 'multiSelections'],
  filters: [
    { name: 'Images', extensions: ['jpg', 'png', 'gif'] },
    { name: 'All Files', extensions: ['*'] }
  ]
}).then(result => {
  if (!result.canceled) {
    console.log('选择的文件:', result.filePaths)
  }
})

// 保存对话框
dialog.showSaveDialog({
  title: '保存文件',
  defaultPath: '/path/to/default.extension'
})

// 消息对话框
dialog.showMessageBox({
  type: 'info',
  title: '提示',
  message: '操作已完成',
  buttons: ['确定', '取消']
})

5. 系统托盘

Tray 模块 (主进程)

const { Tray, Menu } = require('electron')
const path = require('path')

let tray = new Tray(path.join(__dirname, 'icon.png'))

const contextMenu = Menu.buildFromTemplate([
  { label: '显示', click: () => win.show() },
  { label: '退出', click: () => app.quit() }
])

tray.setToolTip('我的应用')
tray.setContextMenu(contextMenu)

// 点击托盘图标事件 (Windows/Linux)
tray.on('click', () => win.show())

6. 菜单系统

Menu 模块 (主进程)

const { Menu } = require('electron')

// 应用菜单模板
const template = [
  {
    label: '文件',
    submenu: [
      { 
        label: '打开',
        accelerator: 'CmdOrCtrl+O',
        click: () => openFile()
      },
      { type: 'separator' },
      { role: 'quit' }
    ]
  },
  {
    label: '编辑',
    submenu: [
      { role: 'undo' },
      { role: 'redo' },
      { type: 'separator' },
      { role: 'cut' },
      { role: 'copy' },
      { role: 'paste' }
    ]
  }
]

const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)

7. 文件系统操作

fs 模块 (主进程)

const fs = require('fs')
const fsPromises = require('fs').promises

// 同步读取文件
try {
  const data = fs.readFileSync('/path/to/file', 'utf8')
  console.log(data)
} catch (err) {
  console.error(err)
}

// 异步读取文件
fsPromises.readFile('/path/to/file', 'utf8')
  .then(data => console.log(data))
  .catch(err => console.error(err))

// 写入文件
fs.writeFile('/path/to/file', '内容', err => {
  if (err) throw err
  console.log('文件已保存')
})

8. 系统通知

Notification 模块 (主进程或渲染进程)

const { Notification } = require('electron')

// 主进程或渲染进程中
new Notification({
  title: '通知标题',
  body: '通知内容',
  silent: false,
  icon: '/path/to/icon.png'
}).show()

9. 剪贴板操作

clipboard 模块 (主进程或渲染进程)

const { clipboard } = require('electron')

// 写入剪贴板
clipboard.writeText('要复制的文本')

// 读取剪贴板
const text = clipboard.readText()
console.log('剪贴板内容:', text)

// 图片操作
const image = clipboard.readImage()
const pngData = image.toPNG() // 获取PNG格式的Buffer

10. 网络监控

net 模块 (主进程)

const { net } = require('electron')

// 发起HTTP请求
const request = net.request('https://api.example.com/data')
request.on('response', (response) => {
  console.log(`状态码: ${response.statusCode}`)
  
  response.on('data', (chunk) => {
    console.log(`收到数据: ${chunk}`)
  })
  
  response.on('end', () => {
    console.log('请求完成')
  })
})
request.end()

11. 电源监控

powerMonitor 模块 (主进程)

const { powerMonitor } = require('electron')

powerMonitor.on('suspend', () => {
  console.log('系统即将进入睡眠状态')
})

powerMonitor.on('resume', () => {
  console.log('系统已从睡眠状态恢复')
})

powerMonitor.on('on-ac', () => {
  console.log('系统正在使用交流电源')
})

powerMonitor.on('on-battery', () => {
  console.log('系统正在使用电池电源')
})

12. 全局快捷键

globalShortcut 模块 (主进程)

const { globalShortcut } = require('electron')

app.on('ready', () => {
  // 注册全局快捷键
  globalShortcut.register('CommandOrControl+X', () => {
    console.log('快捷键被触发')
  })
})

app.on('will-quit', () => {
  // 注销所有快捷键
  globalShortcut.unregisterAll()
})

13. 屏幕信息

screen 模块 (主进程)

const { screen } = require('electron')

// 获取所有显示器信息
const displays = screen.getAllDisplays()
console.log('可用显示器:', displays)

// 主显示器
const primaryDisplay = screen.getPrimaryDisplay()
console.log('主显示器:', primaryDisplay)

// 光标位置
const point = screen.getCursorScreenPoint()
console.log('当前光标位置:', point)

14. 协议处理

protocol 模块 (主进程)

const { protocol } = require('electron')

// 注册自定义协议
protocol.registerFileProtocol('myapp', (request, callback) => {
  const url = request.url.substr(8) // 去掉 'myapp://'
  callback({ path: path.join(__dirname, url) })
})

// 拦截标准协议
protocol.interceptFileProtocol('file', (request, callback) => {
  // 自定义文件协议处理
})

15. 调试工具

debugger 模块 (主进程)

const { BrowserWindow } = require('electron')

const win = new BrowserWindow()

// 启用远程调试
win.webContents.openDevTools()

// 调试命令
win.webContents.debugger.attach()
win.webContents.debugger.sendCommand('Network.enable')
win.webContents.debugger.on('message', (event, method, params) => {
  if (method === 'Network.responseReceived') {
    console.log('收到网络响应:', params)
  }
})

16. 自动更新

autoUpdater 模块 (主进程)

const { autoUpdater } = require('electron-updater')

autoUpdater.on('update-available', () => {
  console.log('发现新版本')
})

autoUpdater.on('update-downloaded', () => {
  autoUpdater.quitAndInstall()
})

// 检查更新
autoUpdater.checkForUpdatesAndNotify()

17. 系统主题

nativeTheme 模块 (主进程或渲染进程)

const { nativeTheme } = require('electron')

// 检查暗黑模式
console.log('暗黑模式启用:', nativeTheme.shouldUseDarkColors)

// 监听主题变化
nativeTheme.on('updated', () => {
  console.log('主题变化:', nativeTheme.shouldUseDarkColors ? '暗黑' : '明亮')
})

18. 安全相关

session 模块 (主进程)

const { session } = require('electron')

// 默认session
const defaultSession = session.defaultSession

// 设置权限
defaultSession.setPermissionRequestHandler((webContents, permission, callback) => {
  if (permission === 'notifications') {
    callback(false) // 拒绝通知权限
  } else {
    callback(true)
  }
})

// 清除缓存
defaultSession.clearCache().then(() => {
  console.log('缓存已清除')
})

19. 子进程管理

使用 Node.js 的 child_process 模块

const { exec, spawn } = require('child_process')

// 执行简单命令
exec('ls -l', (error, stdout, stderr) => {
  if (error) throw error
  console.log(stdout)
})

// 生成长时间运行的进程
const pythonProcess = spawn('python', ['script.py'])

pythonProcess.stdout.on('data', (data) => {
  console.log(`Python输出: ${data}`)
})

pythonProcess.stderr.on('data', (data) => {
  console.error(`Python错误: ${data}`)
})

20. 性能监控

app 模块的指标方法

const { app } = require('electron')

// 获取内存使用情况
console.log('内存使用:', app.getAppMetrics())

// 获取GPU信息
app.getGPUFeatureStatus()
app.getGPUInfo('complete').then(info => {
  console.log('GPU信息:', info)
})