禹神:一小时快速上手Electron,前端Electron开发教程,笔记。一篇文章入门Electron

禹神:一小时快速上手Electron,前端Electron开发教程,笔记。一篇文章入门Electron
⚠️注意:
1️⃣原视频打包时,是使用electron-builder打包,使用electron-builder打包,打包时要访问github需要修仙术才能访问。
2️⃣本笔记,使用Electron Forge进行打包,使用Electron Forge不需要访问github更友好。在Electron 官网中也推荐使用这种方式 👉Electron

一、Electron是什么

简单的一句话,就是用html+css+js+nodejs+(Native Api)做兼容多个系统(Windows、Linux、Mac)的软件。

官网解释如下(有点像绕口令):
Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。

在这里插入图片描述


在这里插入图片描述

二、Elemtron流程模型

Electron流程模型图

三、Electron搭建工程,若成功则输出123

3.1 准备

可参考Electron官网地址
需要node和npm,先检测是否安装。

node -v npm -v 
在这里插入图片描述

3.2 项目初始化

命令行创建

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

或者,手动快速创建

在这里插入图片描述

package.json文件

{"name":"my-electron-app","version":"1.0.0","description":"test Electron","main":"main.js","author":"Bin9153","license":"MIT"}

有几条规则需要遵循:

entry point 应为 main.js.
author 与 description 可为任意值,但对于应用打包是必填项。

在这里插入图片描述

3.3 安装 Electron

npm install --save-dev electron //或者 npm install electron -D

3.4 配置并启动

在 package.json配置文件中的scripts字段下增加一条start命令:

{"scripts":{"start":"electron ."}}

这一步,完整的package.json

{"name":"my-electron-app","version":"1.0.0","main":"main.js","scripts":{"start":"electron ."},"author":"bin9153","license":"ISC","description":"electron test","dependencies":{"electron":"^31.2.0"}}

代码解析:

package代码解析


创建main.js

在这里插入图片描述


在main.js里写入

console.log(123)
在这里插入图片描述

再运行!

npm start 

注意:

  1. 先创建main.js,否则报错
  2. 如果main.js里没写输出(或其他代码)则,启动了运行窗口也不容易看出变化
启动输出123


成功输出123,工程搭建完成。

四、开始制作程序

4.1 案例1:做一个简易网页程序

点击可以查看,browser-window配置项的开发文档
在main.js里写入

const{app, BrowserWindow}=require('electron') app.on('ready',()=>{//当app准备好后,执行createWindow创建窗口const win =newBrowserWindow({ width:800,//窗口宽度 height:600,//窗口高度 autoHideMenuBar:true,//自动隐藏菜单档 alwaysOnTop:true,//置顶 x:0,//窗口位置x坐标 y:0//窗口位置y坐标})//加载一个远程页面 win.loadURL('https://blog.ZEEKLOG.net/qq_33650655/article/details/140353815')})

运行

 npm start 
制作一个远程界面


成功显示页面。

4.2 案例2:做一个本地程序(不是远程链接页面,是自己写的页面)

4.2.1 是本地程序,所以创建新的页面

新建pages目录,创建页面,这里就像写前端一样了。index.html,index.css

在这里插入图片描述


index.html里

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>这里是index页面</title></head><body><h1> 这里是index里的标题 </h1></body></html>

main.js里引入页面

const{app, BrowserWindow}=require('electron') app.on('ready',()=>{//当app准备好后,执行createWindow创建窗口const win =newBrowserWindow({ width:800,//窗口宽度 height:600,//窗口高度 autoHideMenuBar:true,//自动隐藏菜单档 alwaysOnTop:true,//置顶})//引入页面 win.loadFile('./pages/index/index.html')})

运行

npm start 

4.2.2 解决内容安全策略

有安全提示

在这里插入图片描述


在index.html里加入,如下代码,内容安全策略警告提示消失。

//electron 提供的配置 成功运行 <metahttp-equiv="Content-Security-Policy"content="default-src 'self'; script-src 'self'"> //electron 提供的配置2 引入js后也会报错 <metahttp-equiv="Content-Security-Policy"content="default-src none"> //视频教程里的配置 会报错 <metahttp-equiv="Content-Security-Policy"content="default-src 'self';style-src 'self''unsafe-inline';img-src self'data:;"> //我自己写的组合的配置更全 加了一个script的限制,有事儿后期再改, 刚试了会报错,可能哪里没写对,先记录在这里 <metahttp-equiv="Content-Security-Policy"content="default-src 'self'; script-src 'self';style-src 'self''unsafe-inline';img-src self'data:;">
安全策略代码详解

关于CSP的详细说明:MDN内容安全策略详解Electron安全策略规范

4.2.3 增加多系统的兼容代码

兼容mac(完善窗口行为)
electron文档:
关闭所有窗口时退出应用 (Windows & Linux)
如果没有窗口打开则打开一个窗口 (macOS)
在main.js里写入兼容各个系统平台的代码

const{app, BrowserWindow}=require('electron')functioncreateWindow(){//当app准备好后,执行createWindow创建窗口const win =newBrowserWindow({ width:800,//窗口宽度 height:600,//窗口高度 autoHideMenuBar:true,//自动隐藏菜单档 alwaysOnTop:true,//置顶}) win.loadFile('./pages/index/index.html')} app.on('ready',()=>{createWindow()//兼容核心代码 1 app.on('activate',()=>{if(BrowserWindow.getAllWindows().length ===0)createWindow()})})//兼容核心代码 2 app.on('window-all-closed',()=>{if(process.platform !=='darwin') app.quit()})

代码解析

在这里插入图片描述

下面两句代码相等

app.on('ready',()=>{// 写核心代码})// 或者 app.whenReady().then(()=>{//写核心代码})

4.2.4 配置自动重启,保存后自动热更新

npm i nodemon -D

package.json里重写start

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

这样保存main.js里的内容,就自动热更新了。
但是更新index.html里的代码不能热更新,要加一个nodemon.json,需要手动添加

{"ignore":["node modules","dist"],"restartable":"r","watch":["*.*"],"ext":"html,js,css"}

增加nodemon.json,

增加nodemon文件和内容


重启生效

npm start 

4.2.5 编写页面程序(写一个应用程序,可以写入任意文字到hello.text里)

页面程序要写在页面里,那它和主进程的关系如图

Electron流程模型图


每个页面程序通过渲染和主进程通信,主进程根据需求调用Native Api来实现功能。

实际,每个页面和主程序通信时,需要建个桥梁来管理它们的通信,preload.js(自己创建),来管理实现通信

在这里插入图片描述


创建preload.js定义桥梁js

创建preloadjs


在main.js中定义preload.js为桥梁

在main.js里定义桥梁

main.js代码:

const{app, BrowserWindow}=require('electron')const path =require('path')functioncreateWindow(){//当app准备好后,执行createWindow创建窗口const win =newBrowserWindow({ width:800,//窗口宽度 height:600,//窗口高度 autoHideMenuBar:true,//自动隐藏菜单档 alwaysOnTop:true,//置顶 webPreferences:{//在main.js中定义preload.js为桥梁 preload:path.resolve(__dirname,'./preload.js')}})//引入页面 win.loadFile('./pages/index/index.html') win.openDevTools()//自动打开调试窗口 console.log("main.js里的main.js")} app.on('ready',()=>{createWindow()//兼容核心代码1 app.on('activate',()=>{if(BrowserWindow.getAllWindows().length ===0)createWindow()})})

创建渲染js

在这里插入图片描述


定义渲染js

定义渲染js


这是自己整理的,整理了前面45分钟,再这么整理下去,1000字也不够用。
下面写代码不详细介绍了。会点前端的能懂一半多代码。
可以看原来的教程 从45分钟开始看。视频教程
直接上代码。

main.js里的代码
const{app, BrowserWindow,ipcMain}=require('electron')const path =require('path')const fs =require('fs')//写入文件functionwriteFile(_, data){ fs.writeFileSync('D:/hello.txt', data)}//读取文件functionreadFile(){const res = fs.readFileSync("D:/hello.txt").toString()return res }functioncreateWindow(){//当app准备好后,执行createWindow创建窗口const win =newBrowserWindow({ width:800,//窗口宽度 height:600,//窗口高度 autoHideMenuBar:true,//自动隐藏菜单档 alwaysOnTop:true,//置顶 webPreferences:{//在main.js中定义preload.js为桥梁 preload: path.resolve(__dirname,'./preload.js')}}) ipcMain.on('file-save', writeFile) ipcMain.handle('file-read', readFile)//引入页面 win.loadFile('./pages/index/index.html') win.openDevTools()//自动打开调试窗口 console.log("main.js里的main.js")} app.on('ready',()=>{createWindow()//兼容核心代码1 app.on('activate',()=>{if(BrowserWindow.getAllWindows().length ===0)createWindow()})})
preload.js里的代码
const{contextBridge, ipcRenderer}=require('electron') contextBridge.exposeInMainWorld('myAPI',{ version: process.version,saveFile:(data)=>{ ipcRenderer.send('file-save', data)},readFile(){return ipcRenderer.invoke('file-read')}})
render.js里的代码
const btn1 = document.getElementById("btn1")const btn2 = document.getElementById("btn2")const btn3 = document.getElementById("btn3")const input = document.getElementById("inp") btn1.onclick=()=>{alert(myAPI.version)} btn2.onclick=()=>{ myAPI.saveFile(input.value)} btn3.onclick=async()=>{const res =await myAPI.readFile()alert(res)}
html里的代码
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'"><title>这里是index页面</title></head><body><h1>欢迎学习Electron开发!!!</h1><button id="btn1">点我</button><hr/><input type="text" id="inp"/><button id="btn2">向D盘写入hello.txt</button><hr><button id="btn3">读取hello.txt的内容</button></body><script type="text/javascript" src="./render.js"></script></html>
目录结构
在这里插入图片描述
备注
1.代码稍微有点不一样
2.目录结构也有变化,功能是一样的

五、打包

5.1 使用electron-builder打包,打包时要访问github需要修仙术

1.安装electron-builder:

npm install electron-builder -D

2.在package.json中进行相关配置,具体配置如下:

备注:json文件不支持注释,使用时请去掉所有注释。
打包配置图
package.json里的代码
{"name":"video-tools","version":"1.0.0","main":"main.js","scripts":{"start":"electron .","build":"electron-builder"},"build":{"appId":"com.atguigu.video","win":{"icon":"./logo.ico","target":[{"target":"nsis","arch":["x64"]}]},"nsis":{"oneClick":false,"perMachine":true,"allowToChangeInstallationDirectory":true}},"devDependencies":{"electron":"^30.0.0","electron-builder":"^24.13.3"},"author":"宝码香车","license":"ISC","description":"A video processing program based on Electron"}
根据视频操作未能完成打包,这种方式在打包时 访问github 多次尝试后,决定放弃

5.2 使用Electron Forge进行打包(使用这种方式打包的)

Electron中文网也推荐使用这种方式。
Electron Forge是从建项目开始配置 的,因为项目已经写完了,所以从第五步开始。
Electron Forge 从第五步开始的文档

5.2.1 使用3条命令,完成打包。

1、运行第1条命令

npm install --save-dev @electron-forge/cli 

2、运行第2条命令

npx electron-forge import

这时在packgae.json里会增加一些配置。

在package里增加配置


不用管。

3、直接运行第3条命令

npm run make 
打包完成。

5.2.2 打包后的位置,在根项目下的out文件里

打包后的文件,在根项目下的out文件夹里

打包后的文件
可运行程序在 my-electron-app\out\make\squirrel.windows\x64
可运行程序

5.2.3 看运行效果,终于完成了。

完成运行效果

5.2.4 出现的bug

1.安装一次后再打开会报错,

再次安装报错

2.直接删除软件,目录在 C:\Users\Administrator\AppData\Roaming 删除my_electron_app这个文件夹。然后用360安全卫士清理垃圾。然后重启即可。

其他bug
1.软件有卡死的现象
2.还会自动重启
3.软件关闭后会自动重启
4.在输入框中输入内容,写入后可能会卡死,第二次可能无法输入,但可以读取。
5.启动时有点卡

六、总结

1.后面有的bug可能与Electron Forge配置有关。有时间试试,找个解决方案。
2.也有可能与main.js写法有关。
3.打包时删除main.js里的 win.openDevTools() //自动打开调试窗口 否则软件会自动打开调试窗口。
4. 代码仓库位置 https://gitee.com/electron_9/my-electron-app

终于完成,虽然有bug,但能运行起来了。后续找个更好的解决方案。
整理不易点赞关注支持宝码香车

Read more

Science Advances | 一种材料造出整只大象机器人:晶格几何编程实现从柔软到刚硬的

Science Advances | 一种材料造出整只大象机器人:晶格几何编程实现从柔软到刚硬的

论文信息 英文题目:Lattice structure musculoskeletal robots: Harnessing programmable geometric topology and anisotropy 中文题目: 晶格结构肌肉骨骼机器人:利用可编程几何拓扑和各向异性 作者:Qinghua Guan, Benhui Dai, Hung Hon Cheng, Josie Hughes 作者单位: 瑞士洛桑联邦理工学院(EPFL) 期刊:Science Advances(IF 13.6 中科院一区,JCR一区) 发表时间:2025年7月16日 链接:https://www.science.org/doi/10.1126/sciadv.adu9856 引文格式:Guan

YOLOv8【第十章:多任务扩展深度篇·第11节】旋转框角度回归优化:CSL(Circular Smooth Label)与 DCL 编码实战!

YOLOv8【第十章:多任务扩展深度篇·第11节】旋转框角度回归优化:CSL(Circular Smooth Label)与 DCL 编码实战!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。 部分章节也会结合国内外前沿论文与 AIGC 等大模型技术,对主流改进方案进行重构与再设计,内容更偏实战与可落地,适合有工程需求的同学深入学习与对标优化。 ✨特惠福利:当前限时活动一折秒杀,一次订阅,终身有效,后续所有更新章节全部免费解锁,👉 点此查看详情 🎯 本文定位:计算机视觉 × 多任务扩展深度系列 📅 更新时间:2026年 🏷️ 难度等级:⭐⭐⭐⭐(高级进阶) 🔧 技术栈:Python 3.9+ · PyTorch

FPGA入门:CAN总线原理与Verilog代码详解

FPGA入门:CAN总线原理与Verilog代码详解

目录 一、CAN 总线核心原理 1. 物理层特性 2. 协议层核心概念 (1)位时序 (2)帧结构(标准数据帧) (3)关键机制 二、FPGA 实现 CAN 的核心模块 三、Verilog 代码实现(以 50MHz 时钟、1Mbps 波特率为例) 1. 全局参数定义 2. 位时序模块(CAN Bit Timing Generator) 3. CRC 计算模块(CAN CRC Generator) 4. 发送模块(CAN Transmitter) 5. 接收模块(CAN Receiver)

Windows 安装 Neo4j(2025最新·极简)

Windows 安装 Neo4j(2025最新·极简)

目录 1. 准备 2. 下载安装包 3. 一键安装 4. 启动 Neo4j 5.安装 Neo4j 的系统服务 Neo4j 是目前最流行的原生图数据库,用图结构(节点-关系-属性)存储数据,而非传统表结构。它专为海量关联数据设计,提供: * 原生图存储:基于免索引邻接结构,每个节点直接维护指向相邻节点的物理指针,实现 O(1) 时间复杂度的图遍历。 * Cypher 查询语言:ISO 标准化图查询语言,采用 ASCII-Art 模式匹配语法,支持可变长度路径、子图查询、聚合与更新混合事务。 * ACID 事务:支持完整事务、集群高可用,可承载企业级负载。 * 丰富生态:内置 Graph Data Science (GDS)