electron初学

最近有一个开发桌面端的业务,考虑到跨平台就使用了electron。

引用官网:Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux。

简单说就是你会前端就能开发,无非是学一点api。官网入口

1.脚手架创建

正文

#创建文件夹
mkdir my-electron-app && cd my-electron-app#初始化
npm init#下载electron
npm i electron -S

在package.json里面加一个任务 “electron”: “electron .”

{"name": "electrondemo","version": "1.0.0","description": "","main": "main.js",//主程序入口"scripts": {"test": "echo \"Error: no test specified\" && exit 1","electron": "electron ." //就是这个},"author": "","license": "ISC","dependencies": {"@electron/remote": "^2.1.2","electron": "^30.0.9"},"devDependencies": {"electron-reloader": "^1.2.3"}
}

2.文件介绍

在electron项目中,最重要的就是main.js,这是主程序的入口。
在这里插入图片描述

3.代码粘贴

我这里会把我项目中的代码全部贴出来,个人理解就是主程序为核心,然后渲染主页面,页面上可以做各种交互。

main.js

const { app, BrowserWindow, Menu, globalShortcut, ipcMain } = require('electron')//热加载
const reloader = require('electron-reloader')
reloader(module)
// 监听初始化完成的生命周期
app.on('ready', () => {const createWindow = () => {const mainWindow = new BrowserWindow({width: 700,height: 700,frame: false, //无边框窗口webPreferences: {nodeIntegration: true,//开启渲染进程使用node模块contextIsolation: false,//开启渲染进程使用node模块enableRemoteModule: true,//开启渲染进程remote模块}})mainWindow.loadFile('./src/index.html')//默认打开调试mainWindow.webContents.openDevTools()//引入菜单jsrequire('./menu.js')//引入remoteconst remote = require('@electron/remote/main')remote.initialize()remote.enable(mainWindow.webContents)//快捷键窗口最大化globalShortcut.register('CommandOrControl+M', () => {mainWindow.maximize()})//定义自定义事件(渲染进程和主进程通讯)ipcMain.on('max-window',()=>{mainWindow.maximize()})}app.whenReady().then(() => {createWindow()app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow()}})})app.on('window-all-closed', () => {if (process.platform !== 'darwin') app.quit()})})

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="./css/index.css">
</head>
<body><div class="custom-menu"><button style="-webkit-app-region: no-drag" onclick="maxWindow()">最大</button><ul><li>最大</li><li class="new-window">新建窗口</li><li><a href="http://www.baidu.com">关于我们</a></li></ul></div><h1>hello electron 汗滴禾下土</h1><button onclick="openFile()">打开文件</button><button onclick="saveFile()">保存文件</button><textarea></textarea><script src="./js/index.js"></script>
</body>
</html>

menu.js

const { app, BrowserWindow, Menu } = require('electron')//定义菜单模版
const template = [{label: '文件',submenu: [{label: '新建窗口',click() {new BrowserWindow({width: 200,height: 200})}}]},{label: '关于我们'}
]//编译模版
const menu = Menu.buildFromTemplate(template)
//设置菜单
Menu.setApplicationMenu(menu)

index.css

* {margin: 0;padding: 0;
}.custom-menu{height: 50px;width: 100%;background: pink;-webkit-app-region: drag; /*支持拖拽*/
}.custom-menu ul{list-style: none;
}.custom-menu ul li{float: left;width: 80px;line-height: 50px;text-align: center;margin-left: 10px;-webkit-app-region: no-drag;
} 

index.js

const { shell, ipcRenderer } = require("electron");
const { BrowserWindow, dialog } = require("@electron/remote");
const fs = require("fs")// 点击新建窗口
const newWindow = document.querySelector('.new-window')
newWindow.onclick = function () {new BrowserWindow({width: 300,height: 300})
}// 点击a跳转
const allA = document.querySelectorAll('a')
allA.forEach(item => {item.onclick = function (e) {e.preventDefault();shell.openExternal(item.href)}
})// 打开文件
const textArea1 = document.querySelector('textarea')
function openFile() {const res = dialog.showOpenDialogSync({title: '读取',buttonLabel: '读取文件',filters: [{ name: 'Custom File Type', extensions: ['js'] },]})const fileContent = fs.readFileSync(res[0]).toStringconsole.log(fileContent)textArea1.value = fileContent
}// 保存文件
function saveFile() {const res = dialog.showSaveDialogSync({title: '保存',buttonLabel: '保存文件',filters: [{ name: 'index', extensions: ['js'] },]})fs.writeFileSync(res,textArea1.value)
}// 渲染进程和主进程通讯
const maxWindow =function(){ipcRenderer.send('max-window')
}

4.拓展

清理依赖

发现不知不觉引入了很多依赖,进行简单的清理。

npm install -g depcheck
depcheck 

在这里插入图片描述

调试

碰到一个问题,开发环境弹出窗体渲染没有问题,但是打包之后弹出窗体渲染就异常。启动的时候用dos命令行启动,这样console的日志还可以看到,便于排查。

#进入exe路径
.\program.exe

在这里插入图片描述

打开网址

// 打开网址(加载页面)let winURL: string;if (app.isPackaged) {// 已打包,正式环境(记住这里一定要去找程序入口页面)const html = path.join(path.join(__dirname, '../renderer/'),'index.html',);console.log('正式环境窗口地址:', html);console.log('正式环境路由地址:', args.route);win.loadFile(html, {hash: args.route ? `${args.route}?winId=${args.id}` : '',});} else {// 未打包,开发环境const html1 = path.join(path.join(__dirname, '../'),'renderer/index.tsx',);console.log('项目地址:', __dirname);console.log('正式环境窗口地址:', html1);winURL = args.route? `http://localhost:1212/#${args.route}?winId=${args.id}`: `http://${process.env['VITE_DEV_SERVER_HOST']}:${process.env['VITE_DEV_SERVER_PORT']}?winId=${args.id}`;console.log('新窗口地址:', winURL);if (args.params) {winURL = addQueries(winURL, args.params);}win.loadURL(winURL);}

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

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

相关文章

OpenAI 近期动荡:解雇 Sam Altman 事件分析与 AI 未来展望

引言 OpenAI 的动荡从未停止。最近&#xff0c;由于 OpenAI 高层领导的更迭&#xff0c;引发了广泛的关注和讨论。特别是在 Sam Altman 被解雇后&#xff0c;再次回归 CEO 职位的过程&#xff0c;更是引起了公众和业内的巨大反响。前 OpenAI 董事会成员 Helen Toner 在最新一期…

如何利用AI大模型给我写程序

文章目录 1&#xff0c;应用情景&#xff08;给文件夹里的图片批量重命名&#xff09;2&#xff0c;选择合适的AI大模型3&#xff0c;复制AI给出来的代码&#xff0c;在本地执行4&#xff0c;结果检查 1&#xff0c;应用情景&#xff08;给文件夹里的图片批量重命名&#xff09…

JasperReport-动态数据源数据填充

一、数据填充 在正式环境中,报表中的内容或数据通常是通过查询底层数据源获取然后再进行数据填充。JasperReport的JAVA SDK中,提供了多种方法提供数据填充(如下其中一个示例): /** * 填充数据构造JasperPrint * is: 文件输入流 * parameters:参数 * connection:数据源…

基于java的CRM客户关系管理系统(六)

目录 5.3 表现层设计 5.3.1 模型层&#xff08;M&#xff09; 5.3.2 视图层&#xff08;V&#xff09; 5.3.3 控制层&#xff08;C&#xff09; 5.4 系统主要功能模块的实现 5.4.1 登录功能的实现 5.4.2 客户管理的实现 5.5 本章小结 参考文献 前面内容请移步 基于java…

k8s学习--Secret详细解释与应用

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Secret什么是Secret?Secret四种类型及其特点Secret应用案例&#xff08;1&#xff09;将明文密码进行base64编码&#xff08;2&#xff09;编写创建secret的YAML文…

笔试训练2

牛客.单词搜索 刚开始我就想是搜索&#xff0c;但是不清楚bfs还是dfs更好&#xff0c;我尝试了bfs但是队列存东西&#xff0c;没有我想象的那么好写&#xff0c;所以我决定试试dfs import java.util.*;public class Solution {static int m 0;static int n 0;static int […

【人工智能Ⅱ】实验8:生成对抗网络

实验8&#xff1a;生成对抗网络 一&#xff1a;实验目的 1&#xff1a;理解生成对抗网络的基本原理。 2&#xff1a;学会构建改进的生成对抗网络&#xff0c;如DCGAN、WGAN、WGAN-GP等。 3&#xff1a;学习在更为真实的数据集上应用生成对抗网络的方法。 二&#xff1a;实验…

SaaS销售新指标|一文带你读懂什么是反向拒付指标

saas企业销售也需要一系列的指标来衡量企业运营情况如何&#xff1f;有哪些值得改善的地方&#xff1f;今天林叔发现一个比较有意思的新指标&#xff1a;反向拒付。希望能帮助saas企业更好的运营。 一、什么是反向拒付&#xff1f; **反向拒付指标&#xff08;反拒付指标&…

C基础-标准库下

上:http://t.csdnimg.cn/qj5uA 目录 七. math.h 八. setjmp.h 九. signal.h 十. stdarg.h 十一.stddef.h 十二. stdio.h 十三. stdlib. 十四. string.h 十五. time.h 七. math.h 定义了各种数学函数和一个宏。 宏和函数描述 序号宏 & 描述1HUGE_VAL 当函数的结…

Vue3——实现word,pdf上传之后,预览功能(实测有效)

vue-office/pdf - npm支持多种文件(**docx、excel、pdf**)预览的vue组件库&#xff0c;支持vue2/3。也支持非Vue框架的预览。. Latest version: 2.0.2, last published: a month ago. Start using vue-office/pdf in your project by running npm i vue-office/pdf. There are …

Mybatis实现树形结构方式

1&#xff0c;三级分类树形结构查询 /*** DDD(Domain-Driven Design): 领域驱动设计** 三级分类树形结构&#xff1b;* 支持无限层级&#xff1b;* 当前项目只有三级*/ Data public class CategoryTreeTo {private Long categoryId; //1private String categoryName;private …

ENVI 5.3/6.0打开Landsat 8/9 C2L2级别数据(带有Metadata),附常见问题

ENVI 5.3/6.0打开Landsat 8/9 C2L2级别数据&#xff08;带有Metadata&#xff09; 文章目录 ENVI 5.3/6.0打开Landsat 8/9 C2L2级别数据&#xff08;带有Metadata&#xff09;前言数据下载ENVI 5.3打开Landsat 8 C2L2级别数据ENVI 5.3打开Landsat 9 C2L2级别数据ENVI 6.0打开La…

手写防抖debounce

手写防抖debounce 应用场景 当需要在事件频繁触发时&#xff0c;只执行最后一次操作&#xff0c;可以使用防抖函数来控制函数的执行频率,比如窗口resize事件和输入框input事件&#xff1b; 这段代码定义了一个名为 debounce 的函数&#xff0c;它接收两个参数&#xff1a;fn…

颠覆传统:探索Web3对传统计算机模式的冲击

随着Web3技术的崛起&#xff0c;传统计算机模式正面临着前所未有的冲击与挑战。Web3作为下一代互联网的代表&#xff0c;以其去中心化、安全可信的特性&#xff0c;正在颠覆着传统计算机模式的种种假设和局限性。本文将深入探讨Web3对传统计算机模式的冲击&#xff0c;并探索其…

关于stm32的复用和重映射问题

目录 需求IO口的复用和重映射使用复用复用加重映射 总结参考资料 需求 一开始使用stm32c8t6&#xff0c;想实现pwm输出&#xff0c;但是原电路固定在芯片的引脚PB10和PB11上&#xff0c;查看了下引脚的功能&#xff0c;需要使用到复用功能。让改引脚作为定时器PWM的输出IO口。…

PMP应考小技巧有哪些?

首先&#xff0c;制定合理的学习计划。将备考过程分解为小目标&#xff0c;并为每个目标设定截止日期。这样可以帮助我们有条不紊地进行学习&#xff0c;避免拖延和压力过大。 其次&#xff0c;选择适合自己的学习资源。PMP考试教材众多&#xff0c;可以选择一本权威的教材作为…

Idea-Linux远程开发部署

第一步&#xff1a;File->Remote Development 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a;在Host位置填写Linux虚拟机的IP地址&#xff0c;在Username、Password填写对应的账号密码后点击Test Connection测试连接。 第五步&#xff1a; 第六步&#xff1a;在…

项目:仿RabbitMQ实现的消息队列组件

文章目录 写在前面开源仓库和项目上线其他文档说明 需求分析BrokerServer交换机类型持久化消息应答 模块划分服务端模块客户端模块交换机数据管理模块队列数据管理模块绑定数据管理模块消息数据管理模块队列信息管理模块虚拟机数据管理模块路由匹配模块消费者管理模块信道管理模…

折半查找二分查找

简介 折半查找也就是二分查找&#xff0c;也可以叫二分法&#xff0c;本质上都是一样的&#xff0c;通过比对中间值与目标值&#xff0c;一次性就能筛掉一半的数字。 举例&#xff1a; 一个猜数字游戏&#xff0c;让你来猜1-100中我选中的数&#xff0c;如果猜中游戏结束&…

露营地管理小程序基于ThinkPHP+FastAdmin+UniApp开发

应用介绍 本文来自&#xff1a;露营地管理小程序基于ThinkPHPFastAdminUniApp开发 - 源码1688 基于ThinkPHPFastAdminUniApp开发的现代化的露营地管理小程序&#xff0c;是专为露营业务设计开发小程序应用。平台拥有多角色管理&#xff0c;同时具有营位预定、门票购买等功能模…