2024年了,如何从 0 搭建一个 Electron 应用

简介

Electron 是一个开源的跨平台桌面应用程序开发框架,它允许开发者使用 Web 技术(如 JavaScript、HTML 和 CSS)来构建桌面应用程序。Electron 嵌入了 Chromium(一个开源的 Web 浏览器引擎)和 Node.js(一个运行在服务器端的 JavaScript 运行时环境),使得开发者能够创建既具有现代 Web 应用的丰富交互性,又具备传统桌面应用的功能和性能的应用程序。

程序员每天离不开的 Visual Studio Code,以及团队协作软件 Slack,聊天社区 Discord 的客户端,都是用 Electron 开发的,可能打出来的包会比较大,但是框架周边成熟度,兼容性和开发体验是真的很棒。仍然是现在桌面端跨平台开发的首选技术之一。最近,我就利用 Electron 技术开发了一个博客客户端软件 HexoPress,开源在 GitHub。从 0 开始学习并完整体验了 Electron 开发的各个方面。

本文给大家分享,2024 年,如何从 0 开始创建一个 Electron 项目。

准备工作

首先你需要一个开发环境,我会使用 Mac 作为例子,如果你使用的是 Windows,我建议通过虚拟机安装 Linux,会跟在 Mac 下差不多的体验,但是在 Windows 上,会有很多意外小麻烦。

开始之前,你首先需要安装 Node.js 的开发环境,在 Mac 就是:

brew install node

或者,你可以使用 nvm 来管理电脑上安装的 node 环境的多个版本。本文就不介绍了。npm 也是一个必须的工具,不过安装好 node,会自动就安装了 npm

你可以登录 Electron 的官网,在文档页面,会看到一些指引。官方文档的“快速开始”,可以仔细阅读一下,这个文档重点介绍了 Electron 项目启动的最小规模,需要四个重要文件,main.jspreload.jsrenderer.jsindex.html,官方文档会介绍这四个文件的作用,以及引导开发者,从 0 手动创建一个项目脚手架。此外提供了一个示范项目,在 GitHub 搜索 electron/electron-quick-start 可以找到。

官方还提供一个类似 Playground 的地方,供每个开发者实验自己的想法,叫 Electron Fiddle,是一个客户端软件,会把刚才的那四个文件组装成一个临时的 Electron App,供开尝试。也是不错的上手方式。

快速开始

如果,你去阅读文档,然后搞清楚所有原理,并手动创建了项目,那么就不能称为是“快速开始”了。真正比较快速的方式是,通过项目的模板来快速构建一个项目脚手架。而官方实际上也提供了这样的项目模板,但是我不明白,为什么官方文档把这个放在那么深的入口,非常不易找到。

这个项目的模板,其实是官方的打包工具 Electron Forge 提供的,下面介绍怎么使用这个模板。

npm init electron-app@latest my-first-electron-app -- --template=vite-typescript

这个命令是用来创建一个新的 Electron 应用的。这里是它的各个部分的详细解释:

  • npm init: 这是一个 npm 命令,用于初始化一个新的 Node.js 项目。它会创建一个新的 package.json 文件,这个文件包含了项目的元数据和依赖信息。
  • electron-app@latest: 这是一个 npm 包的名称和版本。electron-app 是一个用于创建 Electron 应用的模板,@latest 表示我们想要使用的是这个包的最新版本。
  • my-first-electron-app: 这是新项目的名称。这个命令会在当前目录下创建一个名为 my-first-electron-app 的新目录,并在这个目录中初始化新的 Electron 项目。
  • --: 这个符号是用来分隔命令和选项的。在这个符号之后的所有内容都会被视为选项,而不是命令的一部分。
  • --template=vite-typescript: 这是一个选项,用于指定我们想要使用的项目模板。在这个例子中,我们选择的是 vite-typescript 模板,这是一个使用 Vite 和 TypeScript 的 Electron 项目模板。这里还有一些选项,比如 webpack,比如 vite,区别是没有 typescript。不过既然大家都选择看本文来学习的话,我推荐学学 typescript,因为是适合构建大型项目的技术,如果怕麻烦,可以不选 ts,因为真的有一点点麻烦,在前期容易造成学习的障碍。

所以,整个命令的意思是:使用 electron-app 包的最新版本,初始化一个名为 my-first-electron-app 的新 Electron 项目,并使用 vite-typescript 模板。

顺利的话,现在你已经初始化了一个项目的脚手架。如果不顺利的话,比如我,就碰到了一些问题。比如,这个工程中调用了 yarn,就出现了报错。

  ✖ Failed to install modules: ["@electron-forge/plugin-vite@^7.2.0","@typescript-eslint/eslint-plugin@^5.0.0","@typescript-eslint/parser@^5.0.0","eslint@^8.0.1","…With output: Command failed with a non-zero return code (1):yarn add @electron-forge/plugin-vite@^7.2.0 @typescript-eslint/eslint-plugin@^5.0.0 @typescript-eslint/parser@^5.0.0 eslint@^8.0.1 eslint-plugin-import@^2.25.0…yarn add v1.22.21info No lockfile found.[1/4] Resolving packages...info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.(node:89705) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.(Use `node --trace-deprecation ...` to show where the warning was created)error Error: certificate has expiredat TLSSocket.onConnectSecure (node:_tls_wrap:1674:34)at TLSSocket.emit (node:events:515:28)at TLSSocket._finishInit (node:_tls_wrap:1085:8)at ssl.onhandshakedone (node:_tls_wrap:871:12)(node:89705) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.(Use `node --trace-deprecation ...` to show where the warning was created)error Error: certificate has expiredat TLSSocket.onConnectSecure (node:_tls_wrap:1674:34)at TLSSocket.emit (node:events:515:28)at TLSSocket._finishInit (node:_tls_wrap:1085:8)at ssl.onhandshakedone (node:_tls_wrap:871:12)⚠ Finalizing dependencies

真是糟糕的体验,具体错误是中间的一行 error Error: certificate has expired。解决办法是,可以把对 SSL 的校验给关闭。

yarn config set "strict-ssl" false -g  #关闭检查
yarn config list                       #显示所有配置,检查确认

UPDATE:这里给大家认个错,上面的解决方法是错误的。虽然也能绕开问题往下走,但是,是一种很坏的习惯。 请看这篇文章,详细解释了原因。正确解决方法是,检查自己是否使用了过期的 registry 镜像,更换为有效的镜像(https://registry.npmmirror.com)或者官方镜像(https://registry.npmjs.org/)。或者检查系统的代理配置,根证书配置等。

再次执行刚才的 init 试试。这次我们看到项目初始化成功了。

进入到项目目录,执行:

yarn start

你的第一个 Electron App 启动了!!

在这里插入图片描述

后续

现在你可以仔细看看你的目录结构了,这个 vite-typescript 的模版,特点是全部使用 ts,如果用 js 的话,文件组织形式会有不同,不过我个人很喜欢 ts,会让目录看起来更简洁一点,后续我会介绍更多的细节的点,比如我要用 vue 3 + typescript 来开发 App,如果 Electron 的部分是 js 的,而 vue 3 是 ts,就很不符合我的审美。

比如大家可以看看我现在的那个项目 HexoPress,前面有链接,就是这种混搭,让我极其不爽。

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

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

相关文章

游戏行业洞察:分布式开源爬虫项目在数据采集与分析中的应用案例介绍

前言 我在领导一个为游戏行业巨头提供数据采集服务的项目中,我们面临着实时数据需求和大规模数据处理的挑战。我们构建了一个基于开源分布式爬虫技术的自动化平台,实现了高效、准确的数据采集。通过自然语言处理技术,我们确保了数据的质量和…

【PostgreSQL实现psql连接时候提示用户的密码有效时间】

如下内容使用session_exec插件结合自定函数实现。类似于触发器的原理。 功能需要严格在测试环境测试后,才可在正式环境使用。没有相关要求,还是建议直接查询pg_roles/pg_authid/pg_user; 一、判断是否需要修改用户密码和有效期的检查SQL 首…

【Emgu CV教程】7.1、图像锐化之Laplacian(拉普拉斯)算子锐化

文章目录 一、介绍二、举例1.原始素材2.代码3.运行结果 一、介绍 前面几篇讲的是图像平滑,就是抑制或消除噪声,并使得图像亮度及颜色变化更平缓的操作。在图像处理领域,与平滑操作相对应的,叫图像锐化。 图像锐化就是增强图像的边…

python OpenCV:seamlessClone泊松融合

一、seamlessClone函数的用法 翻译 https://www.learnopencv.com/seamless-cloning-using-opencv-python-cpp/ def seamlessClone(src, dst, mask, p, flags, blendNone): # real signature unknown; restored from __doc__"""seamlessClone(src, dst, mask, …

【Hudi】Upsert原理

17张图带你彻底理解Hudi Upsert原理 1.开始提交:判断上次任务是否失败,如果失败会触发回滚操作。然后会根据当前时间生成一个事务开始的请求标识元数据。2.构造HoodieRecord Rdd对象:Hudi 会根据元数据信息构造HoodieRecord Rdd 对象&#xf…

2024年【起重机司机(限桥式起重机)】试题及解析及起重机司机(限桥式起重机)证考试

题库来源:安全生产模拟考试一点通公众号小程序 起重机司机(限桥式起重机)试题及解析考前必练!安全生产模拟考试一点通每个月更新起重机司机(限桥式起重机)证考试题目及答案!多做几遍,其实通过起重机司机(限桥式起重机)理论考试很…

linux ext3/ext4文件系统(part2 jbd2)

概述 jbd2(journal block device 2)是为块存储设计的 wal 机制,它为要写设备的buffer绑定了一个journal_head,这个journal_head与一个transaction绑定,随着事务状态的转移(运行,生成日志&#…

我为什么不喜欢关电脑?

程序员为什么不喜欢关电脑? 你是否注意到,程序员们似乎从不关电脑?别以为他们是电脑上瘾,实则是有他们自己的原因!让我们一起揭秘背后的原因,看看程序员们真正的“英雄”本色! 一、上大学时。 …

Backtrader 量化回测实践(1)—— 架构理解和MACD/KDJ混合指标

Backtrader 量化回测实践(1)—— 架构理解和MACD/KDJ混合指标 按Backtrader的架构组织,整理了一个代码,包括了Backtrader所有的功能点,原来总是使用SMA最简单的指标,现在稍微增加了复杂性,用MA…

k8s除了可以直接运行docker镜像之外,还可以运行什么? springboot项目打包成的压缩包可以直接运行在docker容器中吗?

Kubernetes(k8s)主要设计用于自动部署、扩展和管理容器化应用程序。虽然它与Docker容器最为密切相关,Kubernetes实际上是与容器运行时技术无关的,这意味着它不仅仅能够管理Docker容器。Kubernetes支持多种容器运行时,包…

[office] EXCEL表格不能使用键盘箭头切换单元格该怎么解决- #媒体#经验分享#知识分享

EXCEL表格不能使用键盘箭头切换单元格该怎么解决? EXCEL表格不能使用键盘箭头切换单元格该怎么解决? 1、入下图所示的键盘。 图中红色标记“1”的地方是Scroll Lock指示灯。Scroll Lock就是“滚动锁定”的意思。当该指示灯亮起来的时候,在excel表格中操…

Android 面试问题 2024 版(其一)

Android 面试问题 2024 版(其一) 一、Java 和 Kotlin二、安卓组件三、用户界面 (UI) 开发四、安卓应用架构五、网络和数据持久性 一、Java 和 Kotlin Java 中的抽象类和接口有什么区别? 答:抽象类是不能实例化的类,它…

使用IntelliJ IDEA查看接口的全部实现方法

在大型Java项目中,经常会使用接口和抽象类进行代码设计。为了更好地了解代码结构和功能,我们需要快速查看一个接口的所有实现类。IntelliJ IDEA提供了一些方便的方法来实现这一目标。 1. 点击查看接口的实现子类 在IDEA中,你可以轻松地查看…

大话设计模式——2.简单工厂模式(Simple Factory Pattern)

定义:又称静态工厂方法,可以根据参数的不同返回不同类的实例,专门定义一个类(工厂类)来负责创建其他类的实例可通过类名直接调用,被创建的实例通常具有共同的父类。 UML图: 例子: 计…

计算机视觉的应用24-ResNet网络与DenseNet网络的对比学习,我们该如何选择。

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用24-ResNet网络与DenseNet网络的对比学习,我们该如何选择。在计算机视觉领域,ResNet(残差网络)和DenseNet(密集网络)都是深度学…

华清远见作业第三十九天——Qt(第一天)

思维导图&#xff1a; 登录界面&#xff1a; 代码&#xff1a; #include "mainwindow.h" #include<QToolBar> #include<QPushButton> MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->resize(600,400);this->setFixedSize…

Mysql 8.0新特性详解

建议使用8.0.17及之后的版本&#xff0c;更新的内容比较多。 1、新增降序索引 MySQL在语法上很早就已经支持降序索引&#xff0c;但实际上创建的仍然是升序索引&#xff0c;如下MySQL 5.7 所示&#xff0c;c2字段降序&#xff0c;但是从show create table看c2仍然是升序。8.0…

ubuntu 22.04.3 live server安装JDK21与远程编程环境和maven

ubuntu 22.04.3 live server安装JDK21与远程编程环境 一、安装jdk21 解压jdk压缩包&#xff0c;命令&#xff1a; tar -zxvf jdk-21_linux-x64_bin.tar.gz打开环境变量&#xff0c;命令&#xff1a; sudo vim /etc/profile配置环境变量 export JAVA_HOME/root/jdk-21.0.2 …

第3.3章:StarRocks数据导入--Stream Load

一、概述 Stream Load是StarRocks常见的数据导入方式&#xff0c;用户通过发送HTTP请求将本地文件或数据流导入至StarRocks中&#xff0c;该导入方式不依赖其他组件。 Stream Load作是一种同步导入方式&#xff0c;可以直接通过请求的返回值判断导入是否成功&#xff0c;无法手…

JAVA并发编程之原子性、可见性与有序性

并发编程-原子性、可见性与有序性 一、CPU的可见性 1.1 缓存一致性问题的出现 CPU处理器在处理速度上&#xff0c;远胜于内存&#xff0c;主内存执行一次内存的读写操作&#xff0c;所需要的时间足够处理器去处理上百条指令。 为了弥补处理器与主内存处理能力之间的差距&am…