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.mzph.cn/news/682486.shtml

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

相关文章

【王道数据结构】【chapter5树与二叉树】【P158t6】

二叉树按二叉链表形式存储&#xff0c;试编写一个判别二叉树是否是完全二叉树的算法 #include <iostream> #include <queue> typedef struct treenode{char data;struct treenode *left;struct treenode *right; }treenode,*ptreenode;ptreenode buytreenode(char …

2024.2.14

二维数组实现杨辉三角形 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) {int n;scanf("%d",&n);int a[n][n];for(int i0;i<n;i){for(int j0;j<i;j){if(j0||ij){ a[i][j]1;}else{a[i][j]a[i-1][j]a[i-1][j-…

docker 2:安装

docker 2&#xff1a;安装 ‍ ubuntu 安装 docker sudo apt install docker.io‍ 把当前用户放进 docker 用户组&#xff0c;避免每次运行 docker 命都要使用 sudo​ 或者 root​ 权限。 sudo usermod -aG docker $USER​id $USER ​看到用户已加入 docker 组 ​​ ‍ …

CSS介绍

本章目标&#xff1a; CSS概述 三种样式表 简单选择器 复合选择器 盒子模型 常用背景样式 浮动 常用文本样式 伪类样式 列表样式 表格样式 定位 一、CSS概述: CSS&#xff1a;cascading style sheets-层叠样式表 专门负责对网页的美化 二、有三种使用方式&…

SpringBoot与虚拟线程,接口吞吐量成倍增加,太爽了!

我们看一下如何在spring-boot中利用loom虚拟线程。 我们将做一些负载测试&#xff0c;看看虚拟线程和普通线程的响应时间如何。 让我们快速设置我们的 Spring Boot 项目。 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http:/…

【开源图床】使用Typora+PicGo+Gitee搭建个人博客图床

准备工作&#xff1a; 首先电脑得提前完成安装如下&#xff1a; 1. nodejs环境(node ,npm):【安装指南】nodejs下载、安装与配置详细教程 2. Picgo:【安装指南】图床神器之Picgo下载、安装与配置详细教程 3. Typora:【安装指南】markdown神器之Typora下载、安装与无限使用详细教…

JavaScript中如何判断数据类型

在JavaScript中&#xff0c;判断数据类型是我们在日常开发中经常会遇到的问题。正确地判断数据类型不仅有助于我们编写出更加健壮的代码&#xff0c;还可以提高程序的可读性和可维护性。本文将为大家介绍几种判断数据类型的方法 使用typeof运算符&#xff1a; typeof运算符可以…

[NSSRound#17 Basic]WEB

1.真签到 看robots.txt 密码先base32再base64得到md5加密的密文&#xff0c;在线解得到密码为Nss hint用16进制转字符串&#xff0c;提示新生赛遇到过 是一个敲击码加密 账号是ctfer,登录之后源码提示在F111n4l.php 要求nss参数若比较等于732339662&#xff0c;但是不能是数…

关于idea无法检测出lombok,导致代码爆红的处理

为啥需要本地安装lombok插件&#xff1f; 编译错误提示&#xff1a;Lombok 使用注解来自动生成代码&#xff0c;这些代码在编译时会由 Lombok 插件进行处理。如果没有安装 Lombok 插件&#xff0c;IDEA 在编译过程中可能会报告错误&#xff0c;因为它无法识别并处理 Lombok 注解…

【RL】Bellman Optimality Equation(贝尔曼最优等式)

Lecture3: Optimal Policy and Bellman Optimality Equation Definition of optimal policy state value可以被用来去评估policy的好坏&#xff0c;如果&#xff1a; v π 1 ( s ) ≥ v π 2 ( s ) for all s ∈ S v_{\pi_1}(s) \ge v_{\pi_2}(s) \;\;\;\;\; \text{for all…

Python数据科学:Scikit-Learn机器学习

4.1Scikit-Learn机器学习 Scikit-Learn使用的数据表示&#xff1a;二维网格数据表 实例1&#xff1a;通过Seaborn导入数据 def skLearn():scikit Learn基本介绍:return:import seaborn as sns#导入Iris数据集#注&#xff1a;一般网络访问不了iris sns.load_dataset(iris)ir…

助眠神器小程序源码|白噪音|小睡眠|微信小程序前后端开源

安装要求和说明后端程序运行环境&#xff1a;NginxPHP7.4MySQL5.6 PHP程序扩展安装&#xff1a;sg11 网站运行目录设置为&#xff1a;public 伪静态规则选择&#xff1a;thinkphp 数据库修改文件路径&#xff1a;/config/database.php需要配置后端的小程序配置文件&#xff0c;…

[word] word分割线在哪里设置 #其他#经验分享

word分割线在哪里设置 在工作中有些技巧&#xff0c;可以快速提高工作效率&#xff0c;解决大部分工作&#xff0c;今天给大家分享word分割线在哪里设置的小技能&#xff0c;希望可以帮助到你。 1、快速输入分割线 输入三个【_】按下回车就是一条长直线&#xff0c;同样分别…

webgis后端安卓系统部署攻略,超详细Termux攻略

目录 前言 一、将后端项目编译ARM64 二、安卓手机安装termux 1.更换为国内源 2.安装ssh远程访问 3.安装文件远程访问 三、安装postgis数据库 1.安装数据库 2.数据库配置 3.数据导入 四、后端项目部署 五、自启动设置 总结 前言 因为之前一直做的H5APP开发&#xf…

webpack面试解析

参考&#xff1a; 上一篇webpack相关的系列&#xff1a;webpack深入学习&#xff0c;搭建和优化react项目 爪哇教育字节面试官解析webpack-路白 1、Webpack中的module是什么&#xff1f; 通常来讲&#xff0c;一个 module 模块就是指一个文件中导出的内容&#xff0c;webpack…

Amber-Leedcode-Java - 代码随想录打卡第38 - 39天-动态规划汇总

本质上感觉是一个相加的问题&#xff0c;状态的转换&#xff0c;由前一种状态推至下一种状态509. 斐波那契数 较为简单 746. 使用最小花费爬楼梯 62. 不同路径 一开始写的时候被吓到了&#xff0c;但是发现听完一半之后再写还是比较容易的 对于我而言主要是找到逻辑&#xf…

Vue3+Ant-Design-Vue:报错Cannot read properties of null (reading ‘isCE‘)

问题描述 在使用Ant-Design-Vue内置的Table表格组件&#xff0c;实现expand展开行功能时&#xff0c;报错&#xff1a;Uncaught TypeError: Cannot read properties of null (reading ‘isCE‘) 。 报错信息图示&#xff1a; 在GitHub上找到如下描述&#xff0c; 解决方案 网上…

【漏洞复现】和为顺IP-COM WiFi未授权下载漏洞

Nx01 产品简介 深圳市和为顺网络技术有限公司是一家聚焦于商用级网络通信设备的研发与应用&#xff0c;为全球中小型企业提供高速、安全、易维护的网络设备产品和解决方案的公司。 Nx02 漏洞描述 深圳市和为顺网络技术有限公司IP-COM WiFi方案解决专家存在任意文件下载漏洞&am…

springsecurity6使用

spring security 中的类 &#xff1a; AuthenticationManager : 实现类&#xff1a;ProviderManager 管理很多的 provider &#xff0c;&#xff0c;&#xff0c; 经常使用的&#xff0c;DaoAuthenticationProvider , 这个要设置一个 UserDetailService , 查找数据库&#xff…

分享88个CSS3特效,总有一款适合您

分享88个CSS3特效&#xff0c;总有一款适合您 88个CSS3特效下载链接&#xff1a;https://pan.baidu.com/s/1pDAyFESnO8HSnCZj4-DOzQ?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…