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.rhkb.cn/news/341212.html

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

相关文章

[线程与网络] 网络编程与通信原理(四):深入理解传输层UDP与TCP协议

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

WWDC 2024前瞻:苹果如何用AI技术重塑iOS 18和Siri

苹果下周的全球开发者大会有望成为这家 iPhone 制造商历史上的关键时刻。在 WWDC 上&#xff0c;这家库比蒂诺科技巨头将展示如何选择将人工智能技术集成到其设备和软件中&#xff0c;包括通过与 OpenAI 的历史性合作伙伴关系。随着重大事件的临近&#xff0c;有关 iOS 18 及其…

使用Rufus工具制作Ubuntu To Go——很详细

一、准备工作 准备工具&#xff1a; 1、下载Rufus(主角)软件 2、准备一个U盘或硬盘&#xff08;小白128G足够&#xff0c;装Ubuntu系统&#xff09; 3、下载Ubuntu系统镜像文件 1、下载软件Rufus 先来看一下官网介绍&#xff1a; Rufus 是一款格式化和创建 USB 启动盘的辅助工…

探索 Omost:创新的图像生成AI框架

文章目录 探索 Omost&#xff1a;创新的图像生成AI框架第一部分&#xff1a;背景第二部分&#xff1a;Omost是什么&#xff1f;第三部分&#xff1a;如何安装Omost&#xff1f;第四部分&#xff1a;结合具体场景使用第五部分&#xff1a;总结 探索 Omost&#xff1a;创新的图像…

大话设计模式学习笔记

目录 工厂模式策略模式备忘录模式&#xff08;快照模式&#xff09;代理模式单例模式迭代器模式访问者模式观察者模式解释器模式命令模式模板方法模式桥接模式适配器模式外观模式享元模式原型模式责任链模式中介者模式装饰模式状态模式 工厂模式 策略模式 核心&#xff1a;封装…

神经网络 | 深度学习背后的数学

神经网分析 机器学习处理的是数据&#xff0c;通过学习输入的数据&#xff0c;从而建立模型&#xff0c;以便预测新的数据的输出 按照类型可以进行如下分类 监督分类 非监督分类 强化学习 神经元 生物学中&#xff0c;人的大脑是由多个神经元互相连接形成网络而构成的。也…

处理无法拉取GitHub库的解决方案

提交和拉取github上的库总是失败&#xff0c;这里记录一下如何使用代理解决。 首先找到端口&#xff0c;记住它的端口 然后使用git命令 # HTTP/HTTPS 协议 git config ––global http.url.proxy http://127.0.0.1:port # 以 Github 为例 git config ––global http.https:/…

四.再谈协议_网络计算器

序言 在之前章节中&#xff0c;我们认识了一些网络的接口&#xff0c;并简单体验了一下网络编程&#xff0c;成功实现了字符串数据的收发&#xff0c;模拟实现了最基本的一个多人聊天室&#xff0c;但是网络编程就仅仅局限于此吗?那还远远不够&#xff01; 最基本的一点在于&…

ChatGPT Edu版本来啦:支持GPT-4o、自定义GPT、数据分析等

5月31日&#xff0c;OpenAI在官网宣布&#xff0c;推出ChatGPT Edu版本。 据悉&#xff0c;这是一个专门为大学校园提供的ChatGTP&#xff0c;支持GPT-4o、网络搜索、自定义GPT、数据分析、代码生成等功能&#xff0c;可以极大提升学生、老师的学习质量和教学效率。 目前&…

Mac OS 用户开启 8080 端口

开启端口 sudo vim /etc/pf.conf # 开放对应端口 pass out proto tcp from any to any port 8080 # 刷新配置文件 sudo pfctl -f /etc/pf.conf sudo pfctl -e获取本机ip地址 ifconfig en0 | grep inet | grep -v inet6 | awk {print $2}访问指定端口

星创编辑器在投放业务中的落地|得物技术

搭建一个落地页需要涉及到多方合作&#xff0c;需要不断地进行沟通协调。繁杂的流程需要耗费很多的时间&#xff0c;因此我们推动产品重新搭建了一个专门服务于软广投放流程的编辑器——星创&#xff0c;完成广告搭建在投放业务各系统中的闭环。 一、落地页技术架构 名词解释…

贰[2],VisionMaster/.NetCore的WPF应用程序调用控件

1,环境 VisionMaster4.2 VisualStudio2022 WPF/.Net6.0 2,记录原因 .NetFrameWork的WPF应用程序调用添加例程.NetFrameWork的Winform应用程序相应的库,不会出现报错,界面也能正常显示操作,但是.NetCore的程序却总是报错。 2.1,.NetFrameWork的WPF应用程序 注:但是.…

AI绘画SD入门教程:ControlNet篇-Canny边缘检测预处理器

大家好&#xff0c;我是向阳 在本篇中&#xff0c;我来讲讲如何使用预处理器和辅助模型&#xff0c;分别都有些什么作用。 &#x1f4a1; 这里说明一下当你调用预处理器而辅助模型显示为无的几种原因&#xff1a; 当已载入SD1.5的模型时&#xff0c;CannyXL的辅助模型不会显示…

【笔记】Sturctured Streaming笔记总结(Python版)

目录 相关资料 一、概述 1.1 基本概念 1.2 两种处理模型 &#xff08;1&#xff09;微批处理 &#xff08;2&#xff09;持续处理 1.3 Structured Streaming和Spark SQL、Spark Streaming关系 二、编写Structured Streaming程序的基本步骤 三、输入源 3.1 File源 &a…

django 内置 JSON 字段 使用场景

Django 内置的 JSON 字段&#xff08;JSONField&#xff09;是在 Django 3.1 版本中引入的&#xff0c;用于处理 JSON 格式的数据。JSONField 允许在数据库表中存储和查询 JSON 数据&#xff0c;并且在与 Python 代码交互时自动转换为合适的 Python 数据类型。以下是一些常见的…

【golang学习之旅】Go中的cron定时任务

系列文章 【golang学习之旅】报错&#xff1a;a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】深入理解字符串string数据类型 【golang学习之旅】go mod tidy 【golang学习之旅】记录一次 panic case : reflect: reflect.Value.SetInt using…

国产打印何去何从?汉印瞄准突破口,推进发展新质生产力

推动发展新质生产力&#xff0c;已成为当前时代的主题&#xff0c;代表着先进生产力的发展方向。 打印行业因其高门槛性和技术复杂性&#xff0c;以及在信息安全领域中的作用&#xff0c;使其在我国“新质生产力”发展中占据关键位置。同时&#xff0c;打印行业融合了高精尖产…

windows10镜像文件官网下载

官网 下载 Windows 10 光盘映像&#xff08;ISO 文件&#xff09; https://www.microsoft.com/zh-cn/software-download/windows10ISO/

QT开源 串口调式工具

都是基础的代码不详细解释&#xff0c;代码比较多福利链接

【C++练级之路】【Lv.24】异常

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、异常的概念及定义1.1 异常的概念1.2 异常的定义 二、异常的使用2.1 异常的栈展开匹配2.2 异常的重新…