前端桌面开发之Electron 常用

简介:

Electron是一个开源的跨平台桌面应用程序开发框架,允许开发者使用前端 Web 技术(HTML、CSS 和 JavaScript)来构建桌面应用程序

基本原理
Electron 使用 Chromium 渲染引擎来显示 Web 内容,同时结合 Node.js 来提供对操作系统的访问和控制。这使得开发者能够使用 Web 技术来构建桌面应用程序,同时还能够利用底层操作系统的功能。
主要特点

  1. 跨平台: Electron 应用程序可以在多个操作系统(如 Windows、macOS、Linux)上运行,因为它们在不同平台上共享相同的核心代码。
  2. 前端技术: 开发者可以使用熟悉的前端技术,如 HTML、CSS 和 JavaScript,来构建用户界面。
  3. Node.js 集成: 通过 Node.js,开发者可以在应用程序中使用 JavaScript 来处理文件系统、网络通信、操作系统 API 等等。
  4. 自定义性: 开发者可以通过使用原生的 Web 技术和样式,创建非常定制化的用户界面。
  5. 社区支持: 有一个活跃的社区,提供了大量的插件和库,以帮助开发者构建更强大、更高效的应用程序。

核心组件

  1. 主进程(Main Process): 这是应用程序的主要控制中心,运行 Node.js 环境,负责管理和控制所有的渲染进程和窗口。
  2. 渲染进程(Renderer Process): 每个 Electron 窗口对应一个独立的渲染进程,它们运行在 Chromium 渲染引擎中,负责显示用户界面。
  3. 主窗口(Main Window): 主窗口是应用程序的主界面,通常是一个 Chromium 窗口,用来显示 Web 内容。
  4. 系统托盘图标(Tray): 允许在桌面右下角显示小图标,提供应用程序的快速访问和交互。

开发流程

  1. 使用 HTML、CSS 和 JavaScript 创建用户界面。
  2. 在主进程中使用 Node.js 进行应用程序的逻辑控制。
  3. 通过与底层操作系统 API 进行交互,实现文件操作、网络通信等功能。
  4. 使用 Electron 打包工具将应用程序打包成特定平台的可执行文件。

Electron安装

  1. 下载node.js
  2. npm install electron 这边建议去百度一下教程或者直接看 https://www.csev.cn/code-2/electron/2024032869.html/

这里记得安装:

electron:electron核心包
cross-env:cross-env 是一个用于设置跨平台环境变量的工具。它可以在 Windows、Linux 和 macOS 等操作系统上提供一致的环境变量设置方式,使得在不同平台上运行脚本时能够保持一致的行为。
electron-builder:electron-builder 是一个用于打包、构建和部署 Electron 应用程序的强大工具
npm i electron cross-env electron-builder

Electron常用API详解

BrowserWindow创建窗口-配置

创建窗口时可以配置很多自定义配置,下面是一些常用配置及解析:

width 和 height:用于设置窗口的初始宽度和高度。
x 和 y:控制窗口的初始位置,以屏幕坐标为基准。
fullscreen:布尔值,指定窗口是否以全屏模式启动。
resizable:布尔值,控制用户是否可以调整窗口大小。
minWidth 和 minHeight:指定窗口的最小宽度和最小高度。
maxWidth 和 maxHeight:指定窗口的最大宽度和最大高度。
frame:布尔值,指定是否显示窗口的外部框架(包括标题栏和控制按钮)。
title:用于设置窗口的标题。
icon:指定窗口的图标文件路径。
backgroundColor:用于设置窗口的背景颜色。
webPreferences:用于配置窗口的 Web 集成选项,例如启用 Node.js、预加载脚本等。
nodeIntegration:指定是否在渲染进程中启用 Node.js 集成,允许在渲染进程中使用 Node.js API。
contextIsolation:启用上下文隔离,将渲染进程的环境与主进程隔离开来,以提高安全性。
preload:指定一个预加载的 JavaScript 文件的路径,该文件在渲染进程运行之前加载。
devTools:指定是否允许在窗口中打开开发者工具。
webSecurity:指定是否启用同源策略,限制页面对其他源的请求。
alwaysOnTop:布尔值,控制窗口是否始终保持在顶部。
fullscreenable:布尔值,指定窗口是否可以进入全屏模式。
show:布尔值,指定创建窗口后是否立即显示。
transparent:布尔值,指定窗口是否支持透明度。
parent 和 modal:用于实现模态窗口的行为。
closable:布尔值,指定用户是否可以关闭窗口。
focusable:布尔值,指定窗口是否可以获得焦点。
minimizable 和 maximizable:控制窗口是否可以最小化和最大化。
skipTaskbar:布尔值,控制窗口是否在任务栏中显示。

参考上面解释-代码:

 

const { BrowserWindow } = require('electron');

const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    x: 100,
    y: 100,
    fullscreen: false,
    resizable: true,
    minWidth: 400,
    minHeight: 300,
    frame: true,
    title: 'My Electron App',
    icon: '/path/to/icon.png',
    backgroundColor: '#ffffff',
    webPreferences: {
        nodeIntegration: true,
        contextIsolation: false,
        preload: 'path/to/preload.js',
        devTools: true,
        webSecurity: true
    },
    alwaysOnTop: false,
    fullscreenable: true,
    show: true,
    transparent: false,
    closable: true
});

mainWindow.loadFile('index.html');

窗口常用事件:

窗口用window.on来监听事件,可以在这些事件触发时做一切操作例如下面一些常用事件:

close
触发时机:窗口即将关闭时触发,但实际关闭前。
作用:允许执行一些在窗口关闭前的清理操作,或者阻止窗口关闭。
closed
触发时机:窗口已经关闭时触发。
作用:通常用于释放资源或执行一些在窗口关闭后的最终操作。
resize
触发时机:窗口大小发生变化时触发。
作用:允许在窗口大小变化时执行一些操作。
move
触发时机:窗口位置发生变化时触发。
作用:允许在窗口位置变化时执行一些操作。
focus
触发时机:窗口获得焦点时触发。
作用:允许在窗口获得焦点时执行一些操作。
blur
触发时机:窗口失去焦点时触发。
作用:允许在窗口失去焦点时执行一些操作。
minimize
触发时机:窗口被最小化时触发。
作用:允许在窗口最小化时执行一些操作。
maximize
触发时机:窗口被最大化时触发。
作用:允许在窗口最大化时执行一些操作。
unmaximize
触发时机:窗口从最大化状态恢复时触发。
作用:允许在窗口从最大化状态恢复时执行一些操作。
ready-to-show
触发时机:当窗口完成初始化并且准备好显示时触发。
作用:允许在窗口已准备好显示之后执行一些操作。这通常在窗口加载内容后并准备好显示时触发,用于控制窗口的显示时机。
show
触发时机:当窗口被显示时触发。
作用:允许在窗口显示时执行一些操作。
hide
触发时机:当窗口被隐藏时触发。
作用:允许在窗口隐藏时执行一些操作。
enter-full-screen
触发时机:当窗口进入全屏模式时触发。
作用:允许在窗口进入全屏模式时执行一些操作。
leave-full-screen
触发时机:当窗口离开全屏模式时触发。
作用:允许在窗口离开全屏模式时执行一些操作。

代码:

// main.js

const { app, BrowserWindow } = require('electron');
let mainWindow;

function createMainWindow() {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true
    }
  });

  // 加载你的 HTML 文件
  mainWindow.loadFile('index.html');

  // 事件: 关闭
  mainWindow.on('close', (event) => {
    // 允许或阻止窗口关闭
    // event.preventDefault();
    // 执行清理操作
  });

  // 事件: 关闭后
  mainWindow.on('closed', () => {
    // 释放资源或执行最终操作
    mainWindow = null;
  });

  // 事件: 调整大小
  mainWindow.on('resize', () => {
    // 在窗口调整大小时执行操作
  });

  // 事件: 移动
  mainWindow.on('move', () => {
    // 在窗口移动时执行操作
  });

  // 事件: 获得焦点
  mainWindow.on('focus', () => {
    // 在窗口获得焦点时执行操作
  });

  // 事件: 失去焦点
  mainWindow.on('blur', () => {
    // 在窗口失去焦点时执行操作
  });

  // 事件: 最小化
  mainWindow.on('minimize', () => {
    // 在窗口最小化时执行操作
  });

  // 事件: 最大化
  mainWindow.on('maximize', () => {
    // 在窗口最大化时执行操作
  });

  // 事件: 还原
  mainWindow.on('unmaximize', () => {
    // 在窗口从最大化状态还原时执行操作
  });

  // 事件: 准备好显示
  mainWindow.on('ready-to-show', () => {
    // 在窗口准备好显示后执行操作
    mainWindow.show();
  });

  // 事件: 显示
  mainWindow.on('show', () => {
    // 在窗口显示时执行操作
  });

  // 事件: 隐藏
  mainWindow.on('hide', () => {
    // 在窗口隐藏时执行操作
  });

  // 事件: 进入全屏模式
  mainWindow.on('enter-full-screen', () => {
    // 在窗口进入全屏模式时执行操作
  });

  // 事件: 离开全屏模式
  mainWindow.on('leave-full-screen', () => {
    // 在窗口离开全屏模式时执行操作
  });
}

 

窗口常用属性

win.id - 窗口的唯一ID。
win.webContents - 包含窗口网页内容的BrowserWindowProxy对象。
win.devToolsWebContents - 用于开发者工具窗口的webContents。
win.minimizable - 是否允许最小化窗口,默认为true。
win.maximizable - 是否允许最大化窗口,默认为true。
win.fullScreenable - 是否允许全屏窗口,默认为true。
win.resizable - 是否允许改变窗口大小,默认为true。
win.closable - 是否允许关闭窗口,默认为true。
win.movable - 是否允许移动窗口,默认为true。
win.alwaysOnTop - 是否永远置顶,默认为false。
win.modal - 是否为模态窗口,默认为false。
win.title - 窗口标题。
win.defaultWidth/Height - 窗口默认宽高。
win.width/height - 窗口当前宽高。
win.x/y - 窗口左上角坐标。

窗口常用方法

win.loadURL(url)- 加载指定URL到窗口中,通常用于加载本地文件或远程网页。
win.webContents.send(channel, ...args)- 在窗口之间发送异步消息。channel 是一个字符串,用于标识消息的类型,...args 是要传递的参数。
win.show()- 显示窗口,通常与 hide() 方法配合使用。
win.hide()- 隐藏窗口。
win.close()- 关闭窗口
win.minimize()- 最小化窗口
win.maximize()- 最大化窗口
win.restore()- 恢复窗口大小和位置。
win.setSize(width, height[, animate])- 设置窗口的宽度和高度。
win.setPosition(x, y[, animate])- 设置窗口的位置。
win.getTitle()- 获取窗口的标题。
win.setTitle(title)- 设置窗口的标题。
win.setMenu(menu)- 设置窗口的菜单。
win.setResizable(resizable)- 设置窗口是否可以改变大小。
win.setAlwaysOnTop(flag[, level[, relativeLevel]])- 将窗口置顶。
win.setMenu(null)- 隐藏窗口的菜单栏。
win.setProgressBar(progress)- 设置窗口的任务栏进度条。
win.focus()- 将窗口置于前台并获得焦点。
win.isVisible()- 返回窗口是否可见。
win.isFullScreen()- 返回窗口是否全屏。
win.isMaximized()- 返回窗口是否最大化。
win.webContents.executeJavaScript(code[, userGesture])- 在窗口的渲染进程中执行一段 JavaScript 代码。
win.openDevTools([options])- 打开开发者工具。

创建右下角系统托盘

右下角系统托盘electron的系统托盘使用tray这个api实现,下面是封装的专门处理系统托盘的文件:

const { app, Tray, Menu } = require('electron')
const path = require('path')
const { getMainWindow, mainWindowIsExist } = require('./windows/mainWindow')

let tray = null
const iconPath = path.resolve(__dirname, './assets/logo.png')  //获取托盘图标路径

function initTray() {
    tray = new Tray(iconPath)

    const contextMenu = Menu.buildFromTemplate([          //electron的方法用来创建一个菜单
        {
            label: '打开应用', click: () => {
                mainWindowIsExist() && getMainWindow().show()
            }
        },
        { label: '退出应用', click: () => { app.quit() } },
    ])
    
    tray.setToolTip('Harbour') // 设置鼠标悬停时显示的提示信息
    tray.setContextMenu(contextMenu) //将使用Menu.buildFromTemplate创建出的菜单设置为托盘菜单
    
    tray.on('click', () => {
        mainWindowIsExist() && getMainWindow().show()    //点击托盘的时候触发的事件鳄梨

其他需要详细了解可以参考:

 

作者:Harbour
链接:https://juejin.cn/post/7277799192961925172
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
版权声明:
作者:89391311
链接:http://www.csev.cn/code-2/electron/20240504323.html/
来源:测试分享
版权声明:本文欢迎任何形式转载,转载时完整保留本声明信息(包含原文链接、原文出处、原文作者、版权声明)即可。本文后续所有修改都会第一时间在原始地址更新。
THE END
根据我国《计算机软件保护条例》第十七条规定:“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。本站资源仅供个人学习交流,请于下载后 24 小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享
二维码
打赏
< <上一篇
下一篇>>
文章目录
关闭
目 录