4、窗口与生命周期(Electron)

章节目标

  • 掌握BrowserWindow基础Api能力,以及如何使用它进行窗口创建、配置。
  • 掌握应用常用的生命周期基本知识

1、窗口创建概念

在 Electron 中,BrowserWindow模块用于创建和控制应用窗口。每个 BrowserWindow实例代表一个应用窗口,可以在其中加载 HTML 内容。

2、BrowserWindow 重要配置选项

  • width / height:窗口的初始宽高
  • minWidth / minHeight:窗口的最小宽高限制
  • webPreferences:窗口的网页功能设置
    • preload:预加载脚本路径
    • contextIsolation:是否启用上下文隔离(安全相关)
    • nodeIntegration:是否集成 Node.js(安全相关)
    • webSecurity: 是否开启内容安全策略

3、创建窗口基础代码如下

// BrowserWindow,electron提供的窗口创建api
import { BrowserWindow } from 'electron'

export function createMainWindow() {
  const mainWindow = new BrowserWindow({
    width: 1100,
    height: 760,
    minWidth: 900,
    minHeight: 600,
    webPreferences: {
      preload: __dirname + '/preload.js',// 预加载
      contextIsolation: true,// 上下文环境隔离
      nodeIntegration: false, // 渲染进程对node直接访问能力
      webSecurity: true,// CSP 内容安全策略
    }
  })
  // 该窗口加载的网页
  mainWindow.loadFile('index.html')
  // 监听窗口关闭事件
  mainWindow.on('closed', () => { 
    mainWindow = null 
  })
  return win
}

4、生命周期事件

Electron 应用的生命周期由一系列事件组成,开发者可以监听这些事件并在适当的时候执行相应的操作。

4.1、核心生命周期事件

  1. app.whenReady()

    • 触发时机:Electron 完成初始化时触发
    • 用途:在这个事件后创建窗口、注册事件监听器等
  2. window-all-closed

    • 触发时机:所有窗口都关闭时触发
    • 用途:通常用于退出应用(macOS 除外)
  3. activate

    • 触发时机:应用被激活时触发(在 macOS 上常见)
    • 用途:当应用在 dock 中被点击时重新创建窗口
  4. will-quit

    • 触发时机:应用即将退出时触发
    • 用途:清理资源、保存数据等

4.2、生命周期事件示例代码

一般而言,app.whenReady周期函数,是主进程启动窗口的必备周期函数,在这个函数执行完毕,会进行 createWindow 操作。

// 应用准备就绪后创建主窗口
app.whenReady().then(() => {
  createMainWindow()
  // 其他初始化操作...
})

// 所有窗口关闭时的处理
app.on('window-all-closed', () => {
  // 在 macOS 上,应用程序菜单栏通常保持活动状态
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

// 在 macOS 上,当点击 dock 图标且没有其他窗口打开时重新创建窗口
app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) {
    createMainWindow()
  }
})

// 应用即将退出时的清理工作
app.on('will-quit', () => {
  // 清理快捷键等
  unregisterAllShortcuts()
})

5、开启开发者工具

// 一般而言,在开发环境中,进行开启,方便我们进行网页调试。
win.webContents.openDevTools()

关于本专栏

本专栏的所有内容和代码,github地址:https://github.com/techLaoLi/electron-tutorial
关于作者,前大厂技术专家,现大前端技术负责人,公众号:老李说技术。 欢迎大家的关注。

### Electron 应用程序生命周期详解 Electron 提供了一套完整的生命周期管理机制,允许开发者在不同阶段执行特定的操作。以下是关于 Electron 生命周期的关键点: #### 1. **初始化准备** 当应用程序启动时,`app` 模块会触发一系列事件来表示当前的状态变化。第一个重要的事件是 `will-finish-launching`,它标志着应用程序即将完成其初始加载过程[^1]。 ```javascript const { app } = require('electron'); // 当应用几乎完成了启动准备工作时触发 app.on('will-finish-launching', () => { console.log('Application is about to finish launching.'); }); ``` #### 2. **主进程中的 ready 状态** 紧接着,`ready` 事件会被触发,这表明所有的资源都已经加载完毕,并且可以安全地创建浏览器窗口或其他组件[^3]。 ```javascript // 当所有模块都已加载并准备好运行时触发 app.on('ready', () => { const { BrowserWindow } = require('electron'); let mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true } }); mainWindow.loadURL('https://example.com'); // 加载网页内容 }); ``` #### 3. **激活失活状态** 随着用户的操作,可能会发生窗口被激活或者失去焦点的情况。此时可以通过监听 `activate` 和 `browser-window-blur` 来响应这些行为[^2]。 ```javascript // macOS 下特别重要;当 Dock 图标点击时触发 app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) createWindow(); }); // 单个窗口失去焦点时调用 mainWindow.on('blur', function() { console.log('The window has lost focus.'); }); ``` #### 4. **关闭前确认** 为了给用户提供保存数据的机会或者其他清理工作,在窗口真正关闭之前通常需要处理 `before-quit` 或者 `close` 这样的预关闭信号。 ```javascript // 整个应用正要退出的时候发出此通知 app.on('before-quit', event => { // 可能阻止默认动作以便询问用户是否真的想离开 event.preventDefault(); dialog.showMessageBox(null, { type: 'question', buttons: ['Yes', 'No'], title: 'Confirm Exit', message: 'Are you sure you want to exit?' }).then(result => { if (result.response === 0){ app.quit(); } }); }); ``` #### 5. **最终终止** 最后一步就是实际的退出流程,由 `quit` 方法显式调用来结束整个应用实例。 ```javascript function quitApp(){ app.quit(); } ``` 以上便是从启动至完全停止的一个典型 Electron 应用生命周期概述及其对应的主要回调函数说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老李说技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值