Electron:构建跨平台桌面应用的现代方法

环境搭建与Hello World

main.js (主进程)

const { app, BrowserWindow } = require('electron')function createWindow () {// 创建一个新的浏览器窗口const mainWindow = new BrowserWindow({width: 800, // 窗口宽度height: 600, // 窗口高度webPreferences: {nodeIntegration: true, // 允许Node.js集成contextIsolation: false, // 如果使用了contextBridge,则应设为trueenableRemoteModule: true // 是否启用remote模块}})// 加载index.html文件mainWindow.loadFile('index.html')// 打开开发者工具// mainWindow.webContents.openDevTools()
}// 当Electron完成初始化并准备好创建浏览器窗口时调用此方法
app.whenReady().then(() => {createWindow()app.on('activate', function () {// 在macOS上,当点击dock图标并且没有其他窗口打开时,// 通常在应用程序中重新创建一个窗口。if (BrowserWindow.getAllWindows().length === 0) createWindow()})
})// 关闭所有窗口时退出应用
app.on('window-all-closed', function () {// 在macOS上,除非用户按下Cmd + Q明确退出,// 否则应用程序及其菜单栏将保留在后台。if (process.platform !== 'darwin') app.quit()
})

index.html (渲染进程)

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Hello World!</title><!-- 引入样式 --><link rel="stylesheet" href="styles.css">
</head>
<body><h1>Hello World!</h1><script>// 这里可以写渲染进程的JavaScript代码console.log('This is from renderer process.');</script>
</body>
</html>

styles.css (样式)

body {margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;font-family: Arial, sans-serif;background-color: #f0f0f0;
}
h1 {color: #333;
}

主进程与渲染进程通信示例

假设我们要从渲染进程发送一条消息给主进程,并由主进程处理后回复。

main.js 添加以下代码:

const { ipcMain } = require('electron')// 监听来自渲染进程的消息
ipcMain.on('asynchronous-message', (event, arg) => {console.log(arg) // 打印接收到的消息event.sender.send('asynchronous-reply', 'pong') // 回复消息给渲染进程
})
index.html 中的JavaScript部分添加:javascript
const { ipcRenderer } = require('electron')document.getElementById('sendBtn').addEventListener('click', () => {ipcRenderer.send('asynchronous-message', 'ping') // 发送消息给主进程
})// 监听主进程的回复
ipcRenderer.on('asynchronous-reply', (event, arg) => {console.log(arg) // 打印接收到的回复
})

窗口管理与菜单

窗口管理示例

创建新窗口

在main.js中,可以定义一个函数来创建新的窗口:

function createNewWindow() {const newWindow = new BrowserWindow({width: 400,height: 300,webPreferences: {nodeIntegration: true,contextIsolation: false,enableRemoteModule: true}})newWindow.loadFile('newWindow.html')
}

并在某个事件中调用这个函数,比如在主窗口中点击按钮触发新窗口的创建。

菜单示例

创建一个简单的菜单:

main.js

const { Menu } = require('electron')const template = [{label: 'File',submenu: [{label: 'Open',accelerator: 'CmdOrCtrl+O',click() { /* 执行打开文件的逻辑 */ }},{label: 'Save',accelerator: 'CmdOrCtrl+S',click() { /* 执行保存文件的逻辑 */ }},{ type: 'separator' },{ role: 'quit' }]},// 其他菜单项...
]const menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(menu)

文件系统操作

读取文件示例

const fs = require('fs')fs.readFile('path/to/your/file.txt', 'utf8', (err, data) => {if (err) {console.error(err)return}console.log(data)
})

保存文件示例

fs.writeFile('path/to/your/newfile.txt', 'Hello Electron!', err => {if (err) throw errconsole.log('The file has been saved!')
})

打包与分发

使用electron-builder进行打包:

首先安装electron-builder

npm install --save-dev electron-builder

然后在package.json中配置打包信息:

{"name": "your-app-name","version": "1.0.0","build": {"appId": "com.yourcompany.yourapp","mac": {"category": "public.app-category.developer-tools"},"win": {"target": ["nsis"]}}
}

最后,运行打包命令:

# 打包为macOS应用
npm run build -- -m# 打包为Windows应用
npm run build -- -w

自动更新

首先,安装electron-updater

npm install --save-dev electron-updater

在main.js中引入并配置自动更新:

const { autoUpdater } = require('electron-updater')autoUpdater.checkForUpdatesAndNotify()autoUpdater.on('update-available', () => {dialog.showMessageBox({title: 'Update available',message: 'A new version is available. It will be downloaded in the background.'})
})autoUpdater.on('update-downloaded', () => {dialog.showMessageBox({title: 'Update ready',message: 'The update has been downloaded. It will be installed on restart.'}).then(() => {autoUpdater.quitAndInstall()})
})

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/40499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安全攻防】网络安全中的序列化与反序列

1.序列化与反序列化 首先要了解序列化与反序列化的定义&#xff0c;以及序列化反序列化所用到的基本函数。 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化&#xff0c;相当于游戏中的存档。 PHP中的序列化函数serialize() **serialize()**函数用于序列化对…

VScode使用ssh连接服务器

VScode是一款有丰富插件的编译器&#xff0c;非常好用&#xff01;除非你不会用&#xff0c;因为太过繁琐或着频繁出错导致想把电脑砸了&#xff1b; 插件选择 ssh 配置文件 Host myblablaHostName xxx.xx.xxx.xxxUser username用户名一般是服务器上创建有什么用户名&#xf…

【Vue】使用html、css实现鱼骨组件

文章目录 组件测试案例预览图 组件 <template><div class"context"><div class"top"><div class"label-context"><div class"label" v-for"(item, index) in value" :key"index">…

ubuntu22sshd服务保持连接的设置

专栏总目录 一、服务端 &#xff08;一&#xff09;打开配置文件 vi /etc/ssh/sshd_config &#xff08;二&#xff09;更改选项 将相关选项配置如下 ClientAliveInterval 60 ClientAliveCountMax 0 TCPKeepAlive yes 修改完毕后&#xff0c;依次点击esc按键、w、q按键回车…

深入探讨JavaScript中的队列,结合leetcode全面解读

前言 队列作为一种基本的数据结构&#xff0c;为解决许多实际问题提供了有效的组织和处理方式&#xff0c;对于提高系统的稳定性、可靠性和效率具有重要作用&#xff0c;所以理解队列是很重要的。 本文深入探讨JavaScript中的队列这种数据结构,结合leetcode题目讲解 题目直达…

在线快速升级nginx

备份现有配置文件和二进制文件&#xff1a; #压缩备份 sudo tar -czvf /usr/sbin/nginx1.21.4_backup.tar.gz /usr/sbin/nginx1.21.4/sudo cp /usr/sbin/nginx1.21.4/conf/nginx.conf /usr/sbin/nginx1.21.4/conf/nginx.conf.bak sudo cp /usr/sbin/nginx1.21.4/sbin/nginx /us…

一、Prometheus和Grafana搭建

一、服务端Prometheus二进制安装 https://prometheus.io/下载过慢可使用迅雷下载 tar -zxvf prometheus-2.53.0.linux-amd64.tar.gz启动 ./prometheus --config.fileprometheus.yml将其配置为系统服务&#xff1a; vim /usr/lib/systemd/system/prometheus.service[Unit] D…

DolphinScheduler部署安装or基础介绍(一)

DolphinScheduler概述 Apache DolphinScheduler是一个分布式、易扩展的可视化DAG工作流任务调度平台。致力于解决数据处理流程中错综复杂的依赖关系&#xff0c;使调度系统在数据处理流程中开箱即用 DolphinScheduler核心架构 DolphinScheduler的主要角色如下&#xff1a; Ma…

Google Earth Engine(GEE)——ui.Slider的使用设置1-100的滑块

简介 ui.Slider是一个用户界面控件,用于选择一个值或一个范围。它通常呈现为一个滑块,用户可以通过拖动滑块来选择一个特定的值。Slider可以水平或垂直显示,并且可以自定义外观和样式。 Slider通常具有以下几个重要的属性: - minValue:设置Slider的最小值。 - maxValue…

2024攻防演练:亚信安全推出MSS/SaaS短期定制服务

随着2024年攻防演练周期延长的消息不断传出&#xff0c;各参与方将面临前所未有的挑战。面对强大的攻击队伍和日益严格的监管压力&#xff0c;防守单位必须提前进行全面而周密的准备和部署。为应对这一形势&#xff0c;亚信安全特别推出了为期三个月的MSS/SaaS短期订阅方案。该…

一站式配套,全方位服务升级——全力打造企业新家园

国际数字影像产业园通过完善配套设施和优化服务&#xff0c;为入园企业提供了高效、便捷、专业的服务支持&#xff0c;助力企业实现快速发展和转型升级。同时&#xff0c;园区的数字化和智能化发展策略也为整个数字影像产业的繁荣发展提供了有力支撑。 一、完善配套设施 1、高…

社交相亲的智能匹配:现代APP如何重塑婚恋交友

在数字化时代&#xff0c;婚恋交友方式正经历着一场革命。现代社交相亲APP利用智能匹配技术&#xff0c;为用户提供个性化的推荐&#xff0c;重塑了传统的婚恋交友模式。 一、现代婚恋交友的挑战 传统婚恋交友方式存在诸多限制&#xff0c;如地理距离、社交圈子的局限性&…

程序包lombok不存在,解决办法。

当前方法是针对于代码没有报错&#xff0c;本身有lombok jar包的情况 1.找到本地maven仓库中的已经下载好的lombok包&#xff0c;删掉。 2. 直接刷新maven&#xff0c;会重新下载lombok jar包&#xff0c;此时再启动项目时就可以正常运行了。

UE4_材质基础_切线空间与法线贴图

学习笔记&#xff0c;不喜勿喷&#xff0c;侵权立删&#xff0c;祝愿大家生活越来越好&#xff01; 一、切线空间 在《OpenGL基础11&#xff1a;空间》中提到了观察空间、裁剪空间、世界空间等。切线空间和它们一样&#xff0c;都属于坐标空间 上面就是一个…

[Linux安全运维] Linux命令相关

Linux命令相关 文件操作命令 相关操作说明ls列出当前目录的文件和子目录cd切换到指定目录pwd显示当前工作目录的路径mkdir创建新目录rmdir删除空目录rm删除文件或目录cp复制文件或目录mv移动或重命名文件或目录touch创建一个新的空文件cat显示文件内容more分页显示文件内容le…

Python 文档字符串(DocStrings)是个啥??

背景 最近在开发过程中&#xff0c;突然发现还有一个东西叫做文档字符串的玩意&#xff0c;原来函数的注释还能这么用&#xff1f;&#xff1f;python再次刷新了我的认知。以前函数注释我都是写在函数之前&#xff0c;现在看来&#xff0c;是我的代码不够规范了。正确的方式应…

Lesson 46 Can you ... ?

Lesson 46 Can you … ? 词汇 lift v. 拿起&#xff0c;搬起 n. 电梯&#xff08;直梯&#xff09; 用法&#xff1a;1. lift … up 拎起……    例句&#xff1a;我可以拎起那只小猫。       I can lift that cat up.    2. take a lift    例句&#xff1a…

如何在Docker容器中,修改MySQL密码

如果MySQL运行在Docker容器中&#xff0c;修改MySQL密码的方法稍有不同。以下是如何在Docker中修改MySQL密码的步骤&#xff1a; 方法1&#xff1a;使用MySQL命令行工具 1. 找到MySQL容器的ID或者名字&#xff1a; docker ps 2. 进入MySQL容器&#xff1a; docker exec -i…

SQL Server中设置端口号

在SQL Server中设置端口号可以通过SQL Server配置管理器进行。以下是具体步骤&#xff1a; 使用SQL Server 配置管理器设置端口 打开SQL Server配置管理器&#xff1a; 在Windows开始菜单中搜索“SQL Server 配置管理器”&#xff0c;然后打开它。 配置SQL Server网络配置&…

mongodb在windows环境安装部署

一、mongodb 1.释义 MongoDB 是一种开源的文档型 NoSQL 数据库管理系统&#xff0c;使用 C 编写&#xff0c;旨在实现高性能、高可靠性和易扩展性。MongoDB 采用了面向文档的数据模型&#xff0c;数据以 JSON 风格的 BSON&#xff08;Binary JSON&#xff09;文档存储&#x…