2.第一个Electron程序

目录

    • 一、前言
    • 二、基本运行结构
    • 三、代码详解
    • 四、打包

一、前言

原文以及系列文章后续请参考:第一个Electron程序

上一章我们完成了Electron的环境搭建,本章就开始详解如何使用Electron开发一个完整的Electron桌面端程序。

注意开发环境,个人推荐使用vscode编辑器,网上可以找到很多教程,我这里不再赘述。

同时使用Electron开发是需要你有基本的前端开发经验的,比如html、js、css等,这些比较基础的东西我在文章中不会讲解太多,不会的可以先参考本站的另外三篇文章:

  • HTML
  • CSS
  • JavaScript

二、基本运行结构

上一章提到了,我们在package.js文件中看到了一个叫做main的项,它的值默认为index.js,意思就是将这个文件作为我们软件运行的入口文件。

所以现在我们主要需要自己创建两个文件:

  • index.js:软件运行的入口文件。
  • index.html:这就是我们软件的主页面,用html代码完成。

首先是index.html文件,代码如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Hello from Electron renderer!</title>
  </head>
  <body>
    <h1>Hello from Electron renderer!</h1>
  </body>
</html>

这只是一个最基本的html代码,当然你也可以随意修改。

有了页面代码后,就是我们的重头戏,也就是index.js中的代码了。

const { app, BrowserWindow } = require('electron')
app.whenReady().then(() => {
    const win = new BrowserWindow({
        width: 800,
        height: 600
    });
    win.loadFile('index.html');
})

此刻整个项目如下:

image-20240213154306171

这些代码的含义会在后面解释,现在我们就可以来到控制台当前文件夹下运行命令npm run start了:

image-20240213154432763

于是你就能看到,我们居然就这样写好了一个软件,而且看起来还功能俱全的感觉!

是不是相当的简单?甚至有些难以置信的感觉?

毕竟如果是使用其它框架开发,怎么也难以用如此简略的步骤就完成一个功能俱全的程序啊!

三、代码详解

程序能运行起来了,那就说明我们写的代码确实没有问题,那么现在就可以来讲解一下这些代码的含义。

index.html文件就不用多说了,因为它真的就仅仅只是一个html的网页代码而已。

主要还是看到我们index.js这个文件,因为前面说了,它是整个软件的入口文件,程序启动后,它是第一个被执行的。

它的第一行就是从electron模块中引入我们需要的两个属性:

const { app, BrowserWindow } = require('electron')

electron是什么?不就是前一章我们安装的Electron库嘛!而且你可以在node_modules文件夹中找到它。

require关键字的作用就是引入指定的模块、库中的内容,它只能在node.js环境下使用,在浏览器中是无法使用的。

然后前面的const { app, BrowserWindow },意思就是从这个模块中引出两个不可变的模块、属性、对象、函数等等内容。

不可变也就是const关键字,而app则是electron框架预定义好应用程序实例,简单来说,这个app对象,就代表了我们当前这整个应用程序。

后面我们也可以通过该对象来任意控制整个应用程序,比如退出应用等函数,就在它的身上。

BrowserWindow 则可以用来创建一个窗口,存放我们页面。

比如前面的index.html就是一个页面,但需要用窗口来存放。

有了app这个应用程序实例后,我们就能够在程序不同的情况下执行不同的代码。

而最常见的就是在程序一切准备就绪的时候,开始创建窗口:

app.whenReady().then(() => {
	//创建窗口
})

它上面的whenReady()函数,就是当程序初始化就绪后,执行指定的函数。

但由于js是单线程程序,不可能一直卡在这里等你应用程序初始化完毕,所以这个函数是异步的。

异步的内容请参考网上其它文章,或者查询本站其它相关的教程。

因此当调用这个函数后,它会直接返回一个管理异步的对象Promise

但我们为了代码简洁,一般不会写这个对象,而是直接调用这个对象身上的函数then

它的意思就是,当这个事件完成之后,就会立马执行then函数中的内容。

这也就有了先后,即确实是等程序初始化后,才会执行then函数中的内容。

then函数可以传递一些回调函数进去,比如这里,就传入了一个箭头函数()=>{}

然后我们就可以在这个箭头中执行创建窗口的代码,等程序就绪后,就会开始执行创建。

这些都是js中的基础内容,但又非常重要,不理解的话你就能以看懂它的运行逻辑,所以这里多说了几句,后面不会再重复赘述。

然后在箭头函数中,我们就可以使用从electron中引入的BrowserWindow类创建一个窗口对象:

const win = new BrowserWindow({
    width: 800,
    height: 600
});

这里使用的new关键字创建对象,它的参数就是我们这个窗口的属性,属性非常之多,可以点击BrowserWindow查看。

我这里只用到了其中的宽高属性,即设置这个窗口初始化时的宽与高。

创建成功后,这个窗口就会被保存到前面的常量win上。

有了窗口,就可以加载页面了,直接调用它身上的loadFile函数加载我们写好的页面:

win.loadFile('index.html');

至此,我们的程序就运行起来了!

不过这还非常简略,所以后面的章节我会带着大家一步一步丰富它的内容。

四、打包

仅仅这样写完还不够,毕竟写出来的软件是给别人用的。

但你不能每次都把这么一大堆东西都发送给别人吧?而且还要安装各种开发环境?

这一过程就叫做打包(或者官方也称其为分发,意思也差不多)。

其目的就是将运行这个程序所需要的所有东西放在一起,别人如果想要用,那么就直接发送打包好的程序就行了,也就是大家常见的点击安装,

打包的工具、方式不只一种,官方推荐使用Electron Forge

简单来说就是,在项目根目录下使以下命令:

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

第一行代码是安装这个工具,第二行代码是导入这个工具。

npxnpm弱一点,它仅仅是用来执行命令的,而不能安装包,而npm既可以安装包,也可以执行命令,且这两者都是安装node后自带的命令,两者具体有什么区别可以自行上网搜一搜。

如果嫌npm安装慢,就换成上一章提到的cnpm,将命令换为:

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

然后下面那个npx命令同样需要下载一些开源包,由于这些包很多都在外网,也容易下载失败或者出现错误。

所以你可能还需要更换一下国内的包源。

方法是在当前用户目录下找到一个叫.npmrc的文件,用记事本打开它,写入下面的文本:

ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/

如果没有这个文件,那就自己创建一个,如果有,那就将上面的内容单独放在一行即可:

image-20240213160046922

注意,此时要先关闭以前的控制台后再重新打开控制台运行命令:

npx electron-forge import

重新打开的目的是刷新该终端的配置项,此时一般就可以用了。

当然,如果你能上外网,那么上面这些步骤就都是多余的,直接按官方来即可,没这么多的麻烦。

安装完成后的界面:

image-20240213160548568

然后我们就可以运行下面的命令开始打包了:

npx electron-forge publish

打包完成后,你就能在当前目录的:out\my-electron-app-win32-x64中找到可执行文件了。

image-20240213160953742

如果要将软件发给别人用,你可以在另外一个文件夹out\make\squirrel.windows\x64下找到一个.exe可执行文件。

image-20240213161026504

这就是该软件的安装包,可以直接发送给别人安装使用。

原文以及系列文章后续请参考:第一个Electron程序

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

可视化工具:将多种数据格式转化为交互式图形展示的利器

引言 在数据驱动的时代&#xff0c;数据的分析和理解对于决策过程至关重要。然而&#xff0c;不同的数据格式和结构使得数据的解读变得复杂和困难。为了解决这个问题&#xff0c;一种强大的可视化工具应运而生。这个工具具有将多种数据格式&#xff08;包括JSON、YAML、XML、C…

【在Linux世界中追寻伟大的One Piece】Linux是从哪里来的?又是怎么发展的?基本指令你知道哪些?

目录 1 -> Linux背景 1.1 -> Linux发展史 1.1.1 -> UNIX发展历史 1.1.2 -> Linux发展历史 1.2 -> 开源 1.3 -> 官网 1.4 -> 企业应用现状 1.5 -> 发行版本 1.6 -> OS概念&#xff0c;定位 2 -> Linux下基本指令 2.1 -> Is指令 2…

不懂编程?节点包来凑——Dynamo常用节点包推荐(上)

由于篇幅有限&#xff0c;本次文章我们分上、下两篇&#xff0c;来分享给大家。 Dynamo作为一款辅助三维设计工具&#xff0c;他可以通过图形化的编程&#xff0c;帮我们解决很多在设计或者建模过程中遇到的小问题&#xff1b;同时他作为一款可视化编程软件&#xff0c;学起来…

1921:【02NOIP普及组】过河卒

1921&#xff1a;【02NOIP普及组】过河卒 【题目描述】 如图&#xff0c;A点有一个过河卒&#xff0c;需要走到目标B点。卒行走的规则&#xff1a;可以向下、或者向右。 同时在棋盘上的任一点有一个对方的马&#xff08;如上图的C点&#xff09;&#xff0c;该马所在的点和所有…

turtle画闪烁发光的字体

使用随机生成的RGB颜色来绘制文本 # Author : 小红牛 # 微信公众号&#xff1a;WdPython import turtle as t import random import timet.title(闪烁发光的字体) t.setup(550, 100) t.bgcolor(black) t.ht()# 1.定义一个函数来生成随机RGB颜色 def get_RGB():return ("#…

五.实战软件部署 1-3实战章节-前言MYSQL 5.7版本在centos系统安装MYSQL 8.0版本在centos系统安装

目录 五.实战软件部署 1-实战章节-前言 五.实战软件部署 2-MYSQL 5.7版本在centos系统安装 1-配置yum仓库 2-使用yum安装mysql 3-安装完成后&#xff0c;启动mysql并配置开机自启动 4-检查mysql的运行状态 --配置 1-获取mysql的初识密码 2-登录mysql数据库系统 3-修改…

网安常用的三个攻击方式

1.渗透测试执行标准&#xff08;PTES&#xff09; 渗透测试执行标准由7个部分组成&#xff0c;包括前期交互、情报收集、威胁建模、漏洞分析、渗透利用、后渗透、撰写报告。在中国&#xff0c;渗透测试必须经过授权&#xff0c;否则就违背了网络安全法。前期交互主要指开展渗透…

书生谱语-基于 InternLM 和 LangChain 搭建知识库

大语言模型与外挂知识库&#xff08;RAG&#xff09;的优缺点 RAG方案构建与优化 作业 在创建web_demo时&#xff0c;需要根据教程将服务器端口映射到本地端口&#xff0c;另外需要将链接的demo从服务器中复制出来&#xff0c;不要直接从服务器打开demo页面&#xff0c;不然会…

Redis 单线程

文章目录 Redis单线程架构Redis 单线程访问速度IO多路复用原理 Redis单线程架构 Redis的单线程架构的效果为&#xff1a;Redis的单线程是对于服务端而言的&#xff0c;Redis允许多个Redis用户端同时在线操作&#xff0c;但同时只有一个用户端在和服务端交互。多个用户同时发送…

VMware清理拖拽缓存 Ubuntu硬盘情况占用分析

这两天在尝试编译Linux源码&#xff0c;我在win上将源码下载下来然后复制到ubuntu上&#xff0c;这一步我粗略看到了三种方法&#xff1a;安装VM tools&#xff0c;就可以使文件正常的在win和ubuntu中复制剪切&#xff1b;使用scp命令将win和linux系统链接起来&#xff1b;使用…

英伟达依托AI市值超谷歌,这波AI浪潮,你赶上了吗

随着人工智能(AI)技术的迅猛发展&#xff0c;全球科技行业的竞争格局正在发生着翻天覆地的变化。PS&#xff1a;如果你需要使用ChatGPT&#xff0c;可以参考这篇文章&#xff1a;【新手向】ChatGPT入门指南 - 订阅GPT4之前必须了解的十件事情 英伟达&#xff0c;一家以其高性能…

《Git 简易速速上手小册》第6章:Git 在持续集成/持续部署(CI/CD)中的应用(2024 最新版)

文章目录 6.1 CI/CD基础6.1.1 基础知识讲解6.1.2 重点案例&#xff1a;为 Python Web 应用实现 CI/CD6.1.3 拓展案例 1&#xff1a;自动化部署到云平台6.1.4 拓展案例 2&#xff1a;使用 Docker 容器化部署 6.2 Git 与自动化测试6.2.1 基础知识讲解6.2.2 重点案例&#xff1a;为…

二叉树的垂直遍历

1.题目 这道题是2024-2-13的签到题&#xff0c;题目难度为困难。 考察的知识点是DFS算法和自定义排序。 题目链接&#xff1a;二叉树的垂直遍历 给你二叉树的根结点 root &#xff0c;请你设计算法计算二叉树的 垂序遍历 序列。 对位于 (row, col) 的每个结点而言&#xff…

卷积神经网络(CNN)

本文仅在理论方面讲述CNN相关的知识&#xff0c;并给出AlexNet, Agg, ResNet等网络结构的代码。 1.构成 ​ 由输入层、卷积层、池化层、全连接层构成。 输入层&#xff1a;输入数据卷积层&#xff1a;提取图像特征池化层&#xff1a;压缩特征全连接层&#xff1a;为输出准备…

解锁未来:探秘Zxing二维码技术的神奇世界

解锁未来&#xff1a;探秘Zxing二维码技术的神奇世界 1. 引言 在当今数字化和智能化的社会中&#xff0c;二维码技术已经成为人们生活中不可或缺的一部分。从商品购物、支付结算到健康码、门票核销&#xff0c;二维码无处不在&#xff0c;极大地方便了人们的生活和工作。而Zx…

mysq开启慢查询日志,对慢查询进行优化

1.创建实验的环境 创建对应的数据库&#xff0c;然后写脚本向数据库中写入400万条的数据 //创建实验用的数据库 CREATE DATABASE jsschool;//使用当前数据库 USE jsschool;//创建学生表 CREATE TABLE student (sno VARCHAR(20) PRIMARY KEY COMMENT 学生编号,sname VARCHAR(20…

Java 基于springboot+vue的民宿管理系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

喝酒到天亮,时刻不敢忘,人间值得——“早”读

春节你小酌了嘛&#xff1f; 引言代码第一篇 人民日报 【夜读】这三句话&#xff0c;致新一年的自己第二篇&#xff08;跳&#xff09;李白如何穿越“来”春晚&#xff1f;揭秘→第三篇&#xff08;跳&#xff09;人民日报 来啦 新闻早班车要闻社会 政策结尾 引言 完蛋 这个早读…

1. pick gtk dll 程序的制作

文章目录 前言预览细节要点初始窗口尺寸提示音快速提示信息对话框AlertDialog鼠标移入移出事件布局与父子控件关系图片 后续源码及资源 前言 在之前的打包测试中我提到了需要一个挑选dll的程序于是我打算用Gtk来制作这个程序 预览 细节要点 初始窗口尺寸 只有主窗口有set_d…

数学建模:K-means聚类手肘法确定k值(含python实现)

原理 当K-means聚类的k值不被指定时&#xff0c;可以通过手肘法来估计聚类数量。   在聚类的过程中&#xff0c;随着聚类数的增大&#xff0c;样本划分会变得更加精细&#xff0c;每个类别的聚合程度更高&#xff0c;那么误差平方和&#xff08;SSE&#xff09;会逐渐变小&am…
最新文章