快速上手electron

官方文档: https://www.electronjs.org/zh/docs/latest/

搭建项目

新建文件夹并初始化项目

mkdir my-electron-app && cd my-electron-app
npm init -y

注意:新生成的package.json的author(作者)和description(描述)字段要填写补全,不然后期打包会打不了

package.json入口文件修改为main.js,修改如下:

{"name": "electron","version": "1.0.0","description": "这是我的第一个electron项目","main": "main.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "萧寂","license": "ISC"
}

安装electron

cnpm i --save-dev electron
// 或者
npm i --save-dev electron
// 或者
yarn add --dev electron

安装过程可能会很慢,等着就行了,除非报错

package.json下面修改脚本如下,新增一个start命令

{"name": "electron","version": "1.0.0","description": "这是我的第一个electron项目","main": "main.js","scripts": {"start": "electron ."},"keywords": [],"author": "萧寂","license": "ISC","devDependencies": {"electron": "^31.2.0"}
}

根目录下新建main.js

console.log('electron start')

执行yarn run start

控制台如果有打印上面那句话则代表electron项目已经启动了,目前还没创建窗体,至此,项目创建准备已经结束

在主进程创建窗口并显示外部链接页面

main.js

const { app, BrowserWindow } = require('electron')// 当app准备好就执行创建一个窗口
app.on('ready', () => {// 创建窗口let win = new BrowserWindow({x: 100,y: 50, //窗体坐标show: true, // false为不展示窗体,默认true展示,相当于将窗口隐藏了width: 800,height: 600, //长宽// maxHeight: 600,// maxWidth: 1000, //最大宽高minHeight: 200,minWidth: 300, //最小宽高resizable: true, //是否允许缩放title: "萧寂", //标题(加上这个属性,在页面中就不要有title标签了)// icon: "./icon.png", //设置icon图标// frame: false, //只保留主体部分,不保留其他的选项卡窗口了,隐藏菜单栏// transparent: true, //将窗体完全透明化autoHideMenuBar: true, //只保留标题,不保留其他的选项卡部分,也是隐藏菜单栏意思alwaysOnTop:true, // 将窗口置顶})win.loadURL('https://xiaojiblog.netlify.app/') // 打开外部链接
})

运行yarn run start

效果图

在这里插入图片描述
支持放大全屏,也可以在上面参数里面把最大宽度高度限制放开,不设置的话就默认可以全屏

更多配置项参考:https://www.electronjs.org/zh/docs/latest/api/base-window#class-basewindow

在主进程加载并显示本地页面

根目录下创建/pages/index.html和/pages/index.css

/pages/index.html内容如下

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="./index.css">
</head><body><h1>第一个本地electron页面</h1>
</body></html>

/pages/index.css内容如下

h1{background-color: gray;color: orange;
}

修改主进程代码main.js如下

const { app, BrowserWindow } = require('electron')// 当app准备好就执行创建一个窗口
app.on('ready', () => {// 创建窗口(下面的配置在上面讲过了,这里就删掉了,只留下三个)let win = new BrowserWindow({width: 800,height: 600, //长宽autoHideMenuBar: true, //只保留标题,不保留其他的选项卡部分,也是隐藏菜单栏意思})win.on('close', () => {// 从性能考虑,应该释放窗体这个变量,删除窗体引用win = null})win.loadFile('./pages/index.html') // loadFile就是加载本地页面的,loadURL加载的是在线链接
})

运行yarn run start

效果图如下:

在这里插入图片描述

electron生命周期事件

ready:app初始化完成  //重要
dom-ready:一个窗口中的文本加载完成  //重要
did-finsh-load:导航完成时触发   //重要
window-all-closed:所有窗口都被关闭时触发  //重要
before-quit:在关闭窗口之前触发
will-quit:在窗口关闭并且应用退出时触发
quit:当所有窗口被关闭时触发
close:当窗口关闭时触发,此时应删除窗口引用

main.js代码

const { app, BrowserWindow } = require("electron")
const createWindow = () => {// 创建窗口let win = new BrowserWindow({width: 800,height: 600,})//当前窗口显示的页面win.loadFile("index.html")// 这个webContents对象可以控制dom元素加载事件win.webContents.on('did-finish-load', () => {console.log('3333->did-finish-load')})win.webContents.on('dom-ready', () => {console.log('2222->dom-ready')})// 窗口关闭win.on('close', () => {console.log('8888->close')// 从性能考虑,应该释放窗体这个变量,删除窗体引用win = null})
}// 生命周期
// 通过on监听事件
app.on('ready', () => {console.log("1111->ready")createWindow()
})app.on("window-all-closed", () => {// 如果监听了window-all-closed这个事件,需要在事件里面主动退出应用,没有监听事件的话默认会直接退出应用// 但如果监听了此事件,但没有退出操作的话,后续的567生命周期也不会执行console.log("4444->window-all-closed")//退出应用app.quit()
})app.on("before-quit", () => {console.log("5555->before-quit")
})app.on("will-quit", () => {console.log("6666->will-quit")
})app.on("quit", () => {console.log("7777->quit")
})

从打开窗体到关闭窗体打印结果如下

在这里插入图片描述

打开控制台调试工具

在当前窗口按下ctrl+shift+i

效果图:
在这里插入图片描述

刷新页面

按下ctrl+r

启动项目遇到的两个警告

1.自动填充问题,在vscode终端打印的警告内容,官方未做处理,electron开发者回复不影响开发可以先忽略,警告内容如下:

[892:0714/014647.854:ERROR:CONSOLE(1)] "Request Autofill.enable failed. {"code":-32601,"message":"'Autofill.enable' wasn't found"}", source: devtools://devtools/bundled/core/protocol_client/protocol_client.js (1)
[892:0714/014647.854:ERROR:CONSOLE(1)] "Request Autofill.setAddresses failed. {"code":-32601,"message":"'Autofill.setAddresses' wasn't found"}", source: devtools://devtools/bundled/core/protocol_client/protocol_client.js (1)

2.在窗口的ctrl+shift+i的控制台,会有个warning的报错,是关于(Insecure Content-Security-Policy)的,是内容安全的警告,解决方式如下:

在html页面上新增一个meta标签,内容如下

<meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;">

然后再次启动项目就会发现警告没了

完善窗口关闭行为

在Windows和Linux上,关闭所有窗口通常会完全退出一个应用程序。

但是在mac上,关闭所有窗口并不会完全退出程序,因此这里需要对mac电脑进行一个判断

官方介绍: https://www.electronjs.org/zh/docs/latest/tutorial/quick-start#%E7%AE%A1%E7%90%86%E7%AA%97%E5%8F%A3%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F

在主进程加上下面的事件和判断,修改main.js如下:

const { app, BrowserWindow } = require('electron')// 创建窗口
function createWindow () {// 创建窗口let win = new BrowserWindow({width: 800,height: 600, //长宽autoHideMenuBar: true, //只保留标题,不保留其他的选项卡部分,也是隐藏菜单栏意思})win.on('close', () => {// 从性能考虑,应该释放窗体这个变量,删除窗体引用win = null})win.on('close', () => {// 从性能考虑,应该释放窗体这个变量,删除窗体引用win = null})win.loadFile('./pages/index.html')
}// 当app准备好就执行创建一个窗口
app.on('ready', () => {createWindow()// 监听应用被激活app.on('activate', () => {// 当应用激活后,窗口数量为0时,重新创建一个窗口(mac使用,在windows和Linux窗口为0直接退出了)if (BrowserWindow.getAllWindows().length === 0) createWindow()})
})// 监听所有窗口都被关闭事件
app.on('window-all-closed', () => {// 不是mac系统就执行退出if (process.platform !== 'darwin') app.quit()
})

配置热更新自动重启

安装插件

yarn add nodemon -D

修改package.json下面的script节点的start命令如下:

"start": "nodemon --exec electron ."

运行yarn run start

然后会发现.html后缀的文件内容更换了并不会自动重启项目,只有main.js主进程代码更换了才重启,为了解决这个问题,继续往下看

根目录下新建nodemon.json文件,内容如下:

{"ignore": [ // 忽略那些文件夹"node_modules","dist"],"restartable": "r", // 短命令,当文件没更改,在终端输入字母r可以自动重启"watch": ["*.*"], // 监视所有文件"ext": "js,json,html,css,vue" // 包含的文件名后缀
}

运行yarn run start再次重启项目就会发现一切正常,都可以实现自动刷新了

主进程与渲染进程进行通信(下面两种方式选其一即可)

简单来说就是渲染进程浏览器环境不能调用主进程的nodejs的相关api和方法,进行通信后就可以了,下面是两种方式,
第一种是:将渲染进程设置为可以访问nodejs方法,这时候渲染进程拥有了访问window环境和nodejs环境的方法和api调用
第二种是:使用预加载脚本,当有需求要操作nodejs的api调用时,渲染进程调用预加载脚本的对应方法,向主进程发起通信事件,主进程接收到对应的事件后就会执行操作

一:在渲染进程直接使用nodejs的所有api调用,本人常用方式(简单)

后面所有的案例都是使用这个方式在渲染进程里面做操作

需求: 用户输入文字后获取输入框内容并写入本地hello.txt文件内,点击第二个按钮可以将写入的文件内容信息弹出来

修改/pages/index.html内容如下:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="Content-Security-Policy"content="default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;"><title>Document</title><link rel="stylesheet" href="./index.css">
</head><body><h1>第haha本地electron页面</h1><input type="text" id="input"><br><button id="btn1">向D盘写入文件hello.txt</button><br><button id="btn2">读取D盘hello.txt文件</button><script src="./render.js"></script>
</body></html>

修改main.js如下

const { app, BrowserWindow } = require('electron')
const path = require('path')
// 创建窗口
function createWindow () {// 创建窗口let win = new BrowserWindow({width: 800,height: 600, //长宽autoHideMenuBar: true, //只保留标题,不保留其他的选项卡部分,也是隐藏菜单栏意思webPreferences: {nodeIntegration: true,  // 配置这三个选项就可以实现在渲染进程使用nodejs的api调用contextIsolation: false,enableRemoteModule: true}})win.on('close', () => {win = null})win.loadFile('./pages/index.html')
}// 当app准备好就执行创建一个窗口
app.on('ready', () => {createWindow()
})

渲染进程render.js内容改为如下

const fs = require('fs')
const btn = document.getElementById('btn1')
const btn2 = document.getElementById('btn2')
const input = document.getElementById('input')
btn.addEventListener('click', () => {// 向D盘写入文件fs.writeFileSync('D:/hello.txt', input.value) // 直接调用nodejs写入文件的方法
})
btn2.addEventListener('click', async () 

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

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

相关文章

CUTLASS

文章目录 1、关于 CUTLASS2、CUTLASS 3.5中的新增功能3、性能4、兼容性4、操作系统5、硬件6、目标架构7、文档8、资源9、构建 CUTLASS10、项目结构11、CUTLASS模板库CUTLASS SDK示例工具测试 12、性能分析13、构建所有GEMM和卷积内核&#xff08;构建时间长&#xff09;14、构建…

银河麒麟高级服务器操作系统V10加固操作指南

1:检查系统openssh安全配置: 2:检查是否设置口令过期前警告天数: 3:检查账户认证失败次数限制: 修改/etc/pam.d/system-auth文件中deny的参数即可 4:检查是否配置SSH方式账户认证失败次数限制:

StarRocks部署高可用 FE 集群

一、准备工作 1.1 部署规划 这里我打算部署存算一体模式&#xff0c;三节点。即三个FE节点&#xff0c;三个BE节点。假设三台IP分别为&#xff1a;10.10.10.50、10.10.10.51、10.10.10.52 我将采用三台centos7.9进行部署&#xff0c;单台配置为128C 256G 3T。 1.2 服务器检查…

拓展神经网络八股(入门级)

自制数据集 minst等数据集是别人打包好的&#xff0c;如果是本领域的数据集。自制数据集。 替换 把图片路径和标签文件输入到函数里&#xff0c;并返回输入特征和标签 要生成.npy格式的数据集&#xff0c;在进行读入训练集。 只需要把图片灰度值数据拼接到特征列表&#xff0…

进程间通信(下)

system V共享内存 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据 共享内存示意图 通过上面的图&#xff0c;我们不难想到…

linux的学习(三):用户权限,查找,压缩命令

简介 关于用户权限&#xff0c;查找和压缩解压缩命令的简单使用 用户管理命令 useradd useradd&#xff1a;添加新用户&#xff0c;要root权限才能使用 useradd -g 组名 用户名&#xff1a;可以添加到组 创建成功会在 /home下有用户的主目录 passwd passwd 用户名&#x…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第60集-agent训练资讯APP重点推荐AI资讯内容(含视频)

【WEB前端2024】3D智体编程&#xff1a;乔布斯3D纪念馆-第60集-agent训练资讯APP重点推荐AI资讯内容&#xff08;含视频&#xff09; 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。d…

php反序列化--2--PHP反序列化漏洞基础知识

一、什么是反序列化&#xff1f; 反序列化是将序列化的字符串还原为PHP的值的过程。 二、如何反序列化 使用unserialize()函数来执行反序列化操作 代码1&#xff1a; $serializedStr O:8:"stdClass":1:{s:4:"data";s:6:"sample";}; $origina…

Android Service的解析

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 Android服务&#xff0c;即Service&#xff0c;是Android四大组件之一&#xff0c;是一种程序后台运行的方案&am…

新增支持GIS地图、数据模型引擎升级、增强数据分析处理能力

为了帮助企业提升数据分析处理能力&#xff0c;Smartbi重点围绕产品易用性、用户体验、操作便捷性进行了更新迭代&#xff0c;同时重磅更新了体验中心。用更加匹配项目及业务需求的Smartbi&#xff0c;帮助企业真正发挥数据的价值&#xff0c;赋能决策经营与管理。 Smartbi用户…

js中使用原型链增加方法后,遍历对象的key-value时会遍历出方法

原因&#xff1a;js使用原型链实现方法时&#xff0c;这个方法默认是可迭代的&#xff0c;所以在遍历时就会被遍历出来&#xff0c; 例&#xff1a; Array.prototype.remove function(n){return this.slice(0,n).concat(this.slice(n1,this.length));}var cc ["cccaaaa…

wifi信号处理的CRC8、CRC32

&#x1f9d1;&#x1f3fb;个人简介&#xff1a;具有3年工作经验&#xff0c;擅长通信算法的MATLAB仿真和FPGA实现。代码事宜&#xff0c;私信博主&#xff0c;程序定制、设计指导。 &#x1f680;wifi信号处理的CRC8、CRC32 目录 &#x1f680;1.CRC概述 &#x1f680;1.C…

定时器的计数模式 定时器中断时钟配置

目录 一&#xff0c;定时器的计数模式 二&#xff0c;定时器中断时钟的配置 三&#xff0c;输入和输出原理 四&#xff0c;PWM波的小简介 一&#xff0c;定时器的计数模式 1.1 定时器的计数模式分别有三种 1.2 定时器溢出的时间&#xff08;中断&#xff0c;事件产生的时间…

QT多线程下,信号槽分别在什么线程中执行,如何控制?

可以通过connect的第五个参数进行控制信号槽执行时所在的线程 connect有几种连接方式&#xff0c;直接连接、队列连接和 自动连接 直接连接&#xff08;Qt::DirectConnection&#xff09;&#xff1a;信号槽在信号发出者所在的线程中执行 队列连接&#xff08;Qt::QueuedConn…

python初学者知识点笔记更新

文章目录 1.main函数入口2.__init__.py 文件作用3.from .applications import server解释4.变量没有修饰&#xff0c;直接创建使用1. 内置数据类型和函数2. 类和对象3.总结 5.mod app.__module__6.集合对比区分集合类型&#xff1a;混合集合类型 7.安装包失败 1.main函数入口 …

vitest 单元测试应用与配置

vitest 应用与配置 一、简介 Vitest 旨在将自己定位为 Vite 项目的首选测试框架&#xff0c;即使对于不使用 Vite 的项目也是一个可靠的替代方案。它本身也兼容一些Jest的API用法。 二、安装vitest // npm npm install -D vitest // yarn yarn add -D vitest // pnpm pnpm …

Linux 06-01:简易shell编写

考虑一下这个与shell典型的互动&#xff1a;ls、ps 用下图的时间轴来表示事件的发生次序。其中时间从左向右。shell由标识为sh的方块代表&#xff0c;它随着时间的流逝从左向右移动。shell从用户读入字符串"ls"。shell建立一个新的进程&#xff0c;然后在那个进程中运…

vs code 启动react项目,执行npm start报错原因分析

1.执行 npm start错误信息&#xff1a;npm : 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 所在位置 行:1 字符: 1 npm start ~~~ CategoryInfo …

2024年5000元投影仪推荐:五千元最值得买的三款家用激光投影推荐

五千元是很多家庭购买投影仪会选择的价位&#xff0c;这个价位的投影一般属于中高端产品&#xff0c;如果懂配置&#xff0c;知道怎么选的朋友可以选到一款性价比颇高的投影&#xff0c;但是如果不会选不懂配置可能会花冤枉钱。所以五千元价位的投影该如何选择&#xff1f;市面…

企业知识库用不起来?试一下用HelpLook同步钉钉组织架构

提升企业管理和协同效率已成为增强竞争力的关键。企业通过知识管理&#xff0c;搭建内部知识库&#xff0c;将分散的经验和知识转化为系统化流程&#xff0c;减少重复解释&#xff0c;促进业务高效运作。这为企业提供了坚实的基础。 企业知识库面临的挑战 尽管传统知识库内容丰…