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

news2024/10/7 18:31:30

简介

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.21
    info 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 expired
    at 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 expired
    at 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.coloradmin.cn/o/1460020.html

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

相关文章

【riscv】使用qemu运行riscv裸机freestanding程序

文章目录 1. 运行显示2. 工具准备3. 裸机代码和编译3.1 源码3.2 编译 4. 使用qemu仿真运行riscv裸机程序 1. 运行显示 详见左下角, 运行时串口输出的字符 A ; 2. 工具准备 # for riscv64-linux-gnu-gcc sudo apt-get install gcc-riscv64-linux-gnu# for qemu-s…

PROBIS铂思金融破产后续:ASIC牌照已注销

2024年1月31日,PROBIS铂思金融的澳大利亚ASIC牌照 (AFSL 338241) 被注销《差价合约经纪商PROBIS宣布破产,澳大利亚金融服务牌照遭暂停》,这也就意味着,PROBIS铂思金融目前已经没有任何金融牌照。 值得注意的是,时至今日…

摄像设备+nginx+rtmp服务器

前言 由于html中的video现在不支持rtmp协议(需要重写播放器框架,flash被一刀切,360浏览器还在支持flash),遂用rtmp作为桥梁,实际是hls协议在html中起作用. 在此推荐一款前端播放器,.ckplayer 简直了,写点页面,一直循环,洗脑神曲 dream it po…

Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&…

美团外卖商超销量数据

字段内容: shop_id varchar(50) NOT NULL, shop_id_str varchar(50) NOT NULL, shop_name varchar(400) DEFAULT NULL, shop_min_price varchar(10) DEFAULT NULL, shop_score varchar(10) DEFAULT NULL, shop_wm_score varchar(10) DEFAULT NU…

《Solidity 简易速速上手小册》第9章:DApp 开发与 Solidity 集成(2024 最新版)

文章目录 9.1 DApp 的架构和设计9.1.1 基础知识解析更深入的理解实际操作技巧 9.1.2 重点案例:去中心化社交媒体平台案例 Demo:创建去中心化社交媒体平台案例代码SocialMedia.sol - 智能合约前端界面 测试和验证拓展功能 9.1.3 拓展案例 1:去…

2024云服务器ECS_云主机_服务器托管_e实例-阿里云

阿里云服务器ECS英文全程Elastic Compute Service,云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,阿里云提供多种云服务器ECS实例规格,如ECS经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等,阿里云服务器网al…

springboot+flowable 使用方式

创建flowble制定流程图 登录flowalbe 制定流程图 进入建模器应用程序 创建流程图 分配用户 下载流程图 使用springboot 调用flowable /*** 导入流程图老师流程*/Testvoid startTeacherApprover(){Deployment deploy repositoryService.createDeployment().addClasspathRes…

IDEA的版本控制Local Changes和settings按钮显示问题

经常用idea的小伙伴应该对标题的这两个功能不陌生,特别是Local Changes 周日刚开工,我的idea就过期了,索性就下载了一个2023.3.3版本的,安装好打开一看,发现Local Changes 和 settings的按钮消失了,虽然说…

【Git】:分支管理

分支管理 一.概念二.分支管理基本操作三.分支管理策略1.noff模式2.分支策略 一.概念 在版本回退⾥,你已经知道,每次提交,Git都把它们串成⼀条时间线,这条时间线就可以理解为是⼀个分⽀。截⽌到⽬前,只有⼀条时间线&…

超平面介绍

超平面公式 (1) 超平面是指n维线性空间中维度为n-1的子空间。它可以把线性空间分割成不相交的两部分。比如二维空间中,一条直线是一维的,它把平面分成了两部分;三维空间中,一个平面是二维的,它把空间分成了两部分。(2…

斐讯插座DC1指示灯不亮按钮不能打开开关维修方法

故障现象 当时入了2个插座,时至今年2个插座都坏了,表现为wifi灯不亮,三个插孔对应的开关按了没反应。2个插座同样的问题应该是通病,在这里分享一下维修经验。斐讯插座市面上应该有很多,说多都是泪。 故障分析 在图片…

Prometheus+influxdb1.8实现高可用监控系统

背景 Prometheus是业内有名的开源监控工具,我所在的公司也是采用PrometheusGrafana方式构建监控系统,并且不只是监控运维层面的数据,业务层面的服务状态也通过Java代码的客户端micrometer向Prometheus提交数据并在Grafana上配置出图&#xf…

word中插入公式,公式和文字不在一条线上,怎么解决?

本解决方案以word2013为版本,其余版本大同小异。 在word文本编辑的时候我们避免不了需要进行文本、公式的同时编辑,在编辑公式存在两种情况:1、公式单独成为一行;2、公式和中英文存在同一行。经常会出现以下问题。 很多人不知所措…

【Unity】【VR开发】如何创建让物体透明的Material

【背景】 在VR开发中,如果遇到需要锚点传送移动的场景,作为锚点的目标往往需要设置为透明。本篇介绍简单设置Material使3D GameObject便透明的方法。 【操作方法】 新建一个Material对象选中Material对象后,在Inspector面板中重选Shader属…

【Flink】FlinkSQL读取hive数据(批量)

一、简介: Hive在整个数仓中扮演了非常重要的一环,我们可以使用FlinkSQL实现对hive数据的读取,方便后续的操作,本次例子为Flink1.13.6版本 二、依赖jar包准备: 官网地址如下: Overview | Apache Flink 1、我们需要准备相关的jar包到Flink安装目录的lib目录下,我们需…

重铸安卓荣光——上传图片组件

痛点: 公司打算做安卓软件,最近在研究安卓,打算先绘制样式 研究发现安卓并不像前端有那么多组件库,甚至有些基础的组件都需要自己实现,记录一下自己实现的组件 成品展示 一个上传图片的组件 可以选择拍照或者从相册中…

php反序列化原理常见的魔术方法

序列化是什么? 要想了解反序列化,就先要知道序列化是什么。下面是是一串序列化数组: a:2:{s:4:"name";s:6:"cike_y";s:3:"age";i:18;}a表示array(数组),2表示这个数组有两…

计算机网络Day1--计算机网络体系

1.三网合一 电信网络、广播电视网络、计算机网络(最基础最重要发展最快) 2.Internet 名为国际互联网、因特网,指当前全球最大的、开放的、由众多网络相互连接而成的特定互连网,采用TCP/IP 协议族作为通信的规则,前…

NoSQL 数据库管理工具,搭载强大支持:Redis、Memcached、SSDB、LevelDB、RocksDB,为您的数据存储提供无与伦比的灵活性与性能!

NoSQL 数据库管理工具,搭载强大支持:Redis、Memcached、SSDB、LevelDB、RocksDB,为您的数据存储提供无与伦比的灵活性与性能! 【官网地址】:http://www.redisant.cn/nosql 介绍 直观的用户界面 从单一应用程序中同…