Electron MacOS 窗口关闭优化要点

234 阅读3分钟

在使用 Electron 开发 MacOS 应用程序时,窗口关闭的优化是一个不容忽视的环节。良好的窗口关闭体验不仅能提升用户满意度,还能确保应用程序的稳定性和资源的有效管理。下面将详细介绍优化过程中的关键要点。

一、正确处理关闭事件

在 Electron 中,MacOS 的窗口关闭逻辑与其他系统有所不同。MacOS 系统通常希望应用程序在窗口关闭时保持运行状态,而不是直接退出应用。因此,我们需要正确捕获和处理close事件。

const { app, BrowserWindow } = require('electron')
let mainWindow
const isMac = process.platform ==='darwin'
app.on('ready', () => {
  mainWindow = new BrowserWindow({ width: 800, height: 600 })
  mainWindow.loadURL('https://www.example.com')
  mainWindow.on('close', (event) => {
    // 阻止默认的关闭行为
    event.preventDefault()
    // 可以在这里添加自定义逻辑,比如询问用户是否保存未保存的工作
    if(isMac) {
      app.hide()
    } else {
        mainWindow.minimize();
    }
  })
})

通过event.preventDefault(),我们可以阻止窗口直接关闭,然后根据需求隐藏窗口或者执行其他操作。这里根据系统类型进行了区分,在 MacOS 上隐藏应用,在其他系统上最小化窗口。

二、资源释放

当窗口关闭时,需要确保所有相关的资源都被正确释放。这包括但不限于网络连接、定时器、DOM 元素等。例如,如果应用程序在窗口打开期间创建了 WebSocket 连接,那么在窗口关闭时应该关闭这个连接。

let webSocket = new WebSocket('ws://example.com/socket')
mainWindow.on('close', (event) => {
  event.preventDefault()
  webSocket.close()
  if(isMac) {
    app.hide()
  } else {
      mainWindow.minimize();
  }
})

对于定时器,同样需要在窗口关闭时清除。

let timer = setInterval(() => {
  // 定时任务
}, 1000)
mainWindow.on('close', (event) => {
  event.preventDefault()
  clearInterval(timer)
  if(isMac) {
    app.hide()
  } else {
      mainWindow.minimize();
  }
})

三、应用程序退出逻辑

在 MacOS 中,用户通常通过点击菜单栏中的 “退出” 选项来关闭应用程序。由于之前在BrowserWindow中已阻止关闭事件,无法触发程序退出机制,所以我们在菜单中设置退出菜单,直接调用app.quit()来触发before - quit事件。

当尝试关闭所有窗口时,将首先发出before - quit事件。如果所有窗口都已成功关闭,则将发出will - quit事件,并且默认情况下应用程序将终止。

// 在菜单中设置退出菜单,点击调用app.quit()触发before - quit
// 假设这里有一个简单的菜单创建逻辑
const { Menu } = require('electron')
const template = [
  {
    label: '文件',
    submenu: [
      {
        label: '退出',
        click: () => {
          app.quit()
        }
      }
    ]
  }
]
const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)
app.on("before-quit", () => {
  app.exit()
})
app.on('will-quit', () => {
  // 执行一些清理操作,比如保存用户设置
  // 关闭所有打开的窗口
  mainWindow = null
})

四、性能优化

在窗口关闭过程中,尽量减少不必要的计算和操作,以提高性能。例如,避免在close事件中执行复杂的数据库查询或文件读写操作。如果有必要进行这些操作,可以将它们放在异步任务中执行。

通过以上几个关键要点的优化,可以显著提升 Electron 应用在 MacOS 系统上的窗口关闭体验,使应用更加稳定和高效。在实际开发中,还需要根据具体的业务需求和应用场景进行灵活调整。