【Electron】Electron入门实现

news2024/12/24 3:11:42

Electron 学习笔记

Electron 是一个开源框架,允许开发者使用网页技术(HTML、CSS 和 JavaScript)来构建跨平台的桌面应用程序。它由 GitHub 开发并维护,最初是为了支持开发 Atom 编辑器。Electron 结合了 Chromium(用于呈现网页内容)和 Node.js(用于与操作系统交互),因此开发者可以利用大量现有的网页开发技术和工具来构建桌面应用。

Electron 的主要特点有:

  1. 跨平台支持Electron 应用可以运行在 WindowsmacOSLinux 系统上。
  2. 使用网页技术:开发者可以使用熟悉的 HTMLCSSJavaScript 来创建应用程序的用户界面。
  3. 与操作系统交互:通过 Node.jsElectron 应用可以与底层操作系统进行交互,执行文件系统操作、网络请求等。
  4. 自动更新Electron 提供了自动更新的功能,可以轻松地发布和分发应用的更新版本。
  5. 打包和发布Electron 提供工具将应用程序打包成独立的可执行文件,以便于分发。

0.前提条件

在使用 Electron 进行开发之前,需要安装 node.js,使用如下命令进行检查。

node -v
npm -v

在这里插入图片描述

注意 因为 ElectronNode.js 嵌入到其二进制文件中,因此应用运行时的 Node.js 版本与你系统中运行的 Node.js 版本无关。

1.Electron 应用程序的创建

1.1 使用脚手架

Electron 应用程序遵循与其他 Node.js 项目相同的结构,首先创建一个文件夹并初始化 npm 包。

mkdir my-electron-app && cd my-electron-app
npm init

在这里插入图片描述

npm init 初始化命令会设置项目的相关值,生成一个 package.json 的配置文件,但在 electron.js 项目中有以下两点需要注意:

  1. entry point 是项目的入口文件,这个文件必须存在。
  2. authordescription 可以任意设置,但对于 electron 应用的打包来说,是必填项。

因此,实际的 package.json 应该是如下的内容:

{
  "name": "my-electron-app",
  "version": "1.0.0",
  "description": "this is a electron demo.",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "euansu",
  "license": "ISC"
}

然后,使用如下命令,将 electron 包安装到应用的开发依赖中。

npm install --save-dev electron
# 过程中安装 electron 可能会失败,执行如下两行命令
npm install -g cnpm --registry=https://registry.npmmirror.com
cnpm install --save-dev electron

1.2 运行主进程

Electron 配置了入口文件,这个文件控制了主进程,,它运行在一个完整的 Node.js 环境中,负责控制您应用的生命周期,显示原生界面,执行特殊操作并管理渲染器进程。

这里首先是创建入口文件,内容如下所示:

// 引入electron应用和浏览器窗口
const { app, BrowserWindow } = require('electron');

// 创建浏览器窗口
const createWindow = () => {
  // 浏览器窗口实例
  const mainWindow = new BrowserWindow({
    width: 600,
    height: 400,
    title: 'EuanSu的第一个Electron应用',
    autoHideMenuBar: true
  });
  // 加载页面
  // mainWindow.loadURL('http://www.baidu.com')
  // 加载本地文件
  mainWindow.loadFile('index.html');
};

// 当app准备好的时候,调用创建窗口函数
// 在 Electron 中,只有在 app 模块的 ready 事件被激发后才能创建浏览器窗口。
app.on('ready', () => {
  createWindow();
});

// 当窗口关闭的时候,退出electron应用
app.on('window-all-closed', () => app.quit());

简单编写一个 html 文件,内容如下所示:

<h1>Hello electron!</h1>

其次,需要配置 script 操作,如下所示,修改 package.json 文件的 scripts 内容。

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "electron ."
},

配置完成后,在终端环境,执行 npm start 启动 electron 应用。

npm start

在这里插入图片描述

出现一个应用程序的窗口,内容如下所示:

在这里插入图片描述

1.3 管理窗口的声明周期

应用程序的窗口在不同的操作系统下有不同的行为,Electron 将在 app 中实现这些行为的责任交给开发者来实现,也即开发者可以使用 进程 全局的 platform 属性来专门为某些操作系统运行代码。

1.3.1 关闭所有窗口时退出应用(Windows & Linux

WindowsLinux 操作系统上,关闭所有窗口通常会完全退出一个应用程序。

使用 app.on 监听当前是否处于 window-all-closed(所有窗口被关闭)场景,如果用户不是在 macOS 上运行程序,则调用 app.quit()

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit()
})
1.3.2 如果没有窗口打开则打开一个窗口(macOS

LinuxWindows 应用在没有窗口打开的场景,认为应用是退出状态。macOS应用通常在没有打开任何窗口的情况下也继续运行,并且在没有窗口可用的情况下激活应用时会打开新的窗口。

为了实现这一特性,监听 app 模块的 activate 事件,如果没有任何应用窗口是打开的,则调用 createWindow() 方法。

// app.whenReady() 等同于 app.on('ready',()=>{})
app.whenReady().then(() => {
  createWindow()

  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

1.4 通过预加载脚本从渲染器访问 Node.js

实现将 Node.jsElectron 的版本号以及以来信息输出到 Electron 应用上。

这里以 Chromium 多进程架构做示范,当 Electron 应用主进程处于 read 状态,应该做的是页面的展示,而不是获取 Node.js 以及相关的依赖信息,创建一个子进程,获取对应的依赖信息,当主进程处于 ready 状态,只需要考虑页面的加载即可。

创建一个名为 preload.js(预加载)JavaScript 文件,内容如下:


window.addEventListener('DOMContentLoaded', () => {
  const replaceText = (selector, text) => {
    const element = document.getElementById(selector)
    if (element) element.innerText = text
  }

  for (const dependency of ['chrome', 'node', 'electron']) {
    replaceText(`${dependency}-version`, process.versions[dependency])
  }
})

如上代码访问 Node.jsprocess.version 对象,并运行一个基本的 replaceText 辅助函数将版本号插入到 HTML 文件中。

main.js 文件中使用 BrowserWindow 构造器加载 preload.js 文件。

const { app, BrowserWindow } = require('electron')
// 在你文件顶部导入 Node.js 的 path 模块
const path = require('node:path')

// 修改已有的 createWindow() 方法
const createWindow = () => {
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })

  mainWindow.loadFile('index.html')
}
// ...

以上代码有两个 Node.js 的相关内容:

  • __dirname 字符串指向当前正在执行脚本的路径,也即当前目录。
  • path.join 将多个路径连接在一起,创建一个符合不同操作系统的路径字符串。

创建 index.html,内容如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using Node.js <span id="node-version"></span>,
    Chromium <span id="chrome-version"></span>,
    and Electron <span id="electron-version"></span>.
  </body>
</html>

启动 Electron 应用。

npm start

出现一个如下所示的窗口内容:

在这里插入图片描述

2.打包并分发 Electron 应用程序

  1. electron-builder 添加到应用的开发依赖中,

    cnpm install --save-dev electron-builder
    
  2. 修改 package.json 项目配置文件,主要修改的内容如下所示:

      
    // 增加build配置
    "build": {
        "appId": "com.euansu.electron_example", // 应用程序的唯一标识符
        "productName": "electron_example", // 应用名称
        "directories": {
          "output": "release" //打包输出的目录
        },
        "win": {
          "target": [
            {
              "target": "nsis", // 指定使用nsis作为安装程序格式
              "arch": [
                "x64" // 生成 64 位按转包
              ]
            }
          ]
        },
        "nsis":{
          "oneClick": false, // 安装程序显示安装向导界面
          "allowToChangeInstallationDirectory": true // 允许用户选择安装目录
        }
      }
    
  3. 执行如下脚本,打包 Electron 应用。

    npm run build
    

    在这里插入图片描述

    打包完成后,在 release 目录下能找到输出的程序。

    在这里插入图片描述

  4. 安装测试。

    在这里插入图片描述

    安装完成后能够正常运行。

    在这里插入图片描述

3.参考链接

[1] Electron 快速入门 https://www.electronjs.org/zh/docs/latest/tutorial/quick-start

[2] BrowserWindow官方文档 https://www.electronjs.org/zh/docs/latest/api/browser-window

[3] Electron 流程模型 https://www.electronjs.org/zh/docs/latest/tutorial/process-model

[4] electron-build 官方文档 https://www.electron.build/

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

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

相关文章

【Lua小知识】Vscode中Emmylua插件大量报错的解决方法

起因 Vscode写Lua用的好好的&#xff0c;最近突然出现了大量报错。 看报错是有未定义的全局变量&#xff0c;这里查日志才发现是由于0.7.5版本新增诊断启用配置&#xff0c;所以导致了原先好的代码&#xff0c;现在出现了大量的报错。 解决方案一 最直接的方法当然是在配置中直…

什么是GPIO口,GPIO口最简单的input/output

目录 一&#xff0c;什么是GPIO口 二&#xff0c;GPIO内部结构 三&#xff0c;GPIO口工作模式 一&#xff0c;什么是GPIO口 1.GPIO口是通用输入输出端口&#xff08;General-purpose input/output&#xff09;的英文缩写&#xff0c;是所有的微控制器必不可少的外设之一&…

没有兴趣爱好的我,怎么填报高考志愿选专业?

这是我从知乎看来的一个问题&#xff0c;也在知乎做了回复&#xff0c;顺便摘录下来做个记录。 原文是&#xff1a;以为考完了就走向人生巅峰了&#xff0c;谁知道会这么down。我爸这两天一直追着问我有什么理想&#xff0c;搞得我很难受。过去的十几年里&#xff0c;我对人生都…

stm32cubemx,adc采样的几种方总结,触发获取adc值的方法dma timer trigger中断

stm32cubemx adc采样的几种方总结&#xff0c;触发获取adc值的方法 timer trigger中断 方法1&#xff0c;软件触发方法2&#xff1a;,Timer触发ADC采集通过DMA搬运 触发获取adc值的方法 Regular Conversion launched by software 软件触发 调用函数即可触发ADC转换 Timer X Cap…

虹科技术丨跨越距离障碍:PCAN系列网关在远程CAN网络通信的应用潜力

来源&#xff1a;虹科技术丨跨越距离障碍&#xff1a;PCAN系列网关在远程CAN网络通信的应用潜力 原文链接&#xff1a;虹科技术 | 跨越距离障碍&#xff1a;PCAN系列网关在远程CAN网络通信的应用潜力 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #PCAN #网关 #CA…

Nuxt3 的生命周期和钩子函数(四)

title: Nuxt3 的生命周期和钩子函数&#xff08;四&#xff09; date: 2024/6/28 updated: 2024/6/28 author: cmdragon excerpt: 概述了Nuxt3的六个关键生命周期钩子用途&#xff1a;modules:before至build:before&#xff0c;指导如何在应用初始化、模块管理、配置解析、模…

【ajax实战07】文章筛选功能

本文章目标&#xff1a;根据筛选条件&#xff0c;获取匹配数据展示 本章**“查询参数对象”指的是&#xff0c;要“获取文章列表”功能**中服务器接口要求配置的对象 实现步骤如下&#xff1a; 一&#xff1a;设置频道列表数据 二&#xff1a;监听筛选条件改变&#xff0c;…

android Studio 无线开发调试: PC机远程安卓电脑 免费

背景 公司的安卓机比较大&#xff0c;还有连接着串口设备不好挪动。 但是遇到问题调试很麻烦。想找到一套远程调试方法。 实现 要求&#xff1a; adb android Studio 2023.3.1 安卓机IP:1928.168.1.228 直接用adb远程连接&#xff1a;adb connect 1928.168.1.228 默认端口…

查看当前服务器Kafka是否已启动

# 查看当前系统中的java进程 # -ml 详细内容 jps -ml | grep Kafka

Thermo Fisher Scientific赛默飞检测扫描架IPC电路板维修WAH402290

美国Thermo Fisher赛默飞世尔光谱仪IS10 IS5光谱仪主板维修iCAP6000/iCAP7000/iCAP7400&#xff1b;热电质朴分析仪电路板维修 公司仪器维修设备备有三相交流电源,变频电源&#xff0c;无油空压气源&#xff0c;标准化的维修平台、电子负载&#xff0c;耐压测试仪、老化台车和各…

视频均衡驱动器,SDI产品PIN LMH0387

视频均衡驱动器,功能仿制 TI公司 LMH0387产品。本期间支持 DVB-ASI,作为驱动器能够选择输出速率,作为均衡接收器能支持100m 以上传输距离(线缆类型 Belden1694A)。 工作温度范围:-40℃~85℃:a) 电源电压:3.14V~3.46V: 驱动器输出信号:单端 CML 信号: 均衡器输出信号:LVDS 电平…

经典爱情影视作品推荐❗❗

1.《不能说的秘密》类型&#xff1a;爱情、剧情上映日期&#xff1a;2024年6月28日&#xff08;日本&#xff09;导演&#xff1a;河合勇人主演&#xff1a;京本大我、古川琴音简介&#xff1a;该片讲述音乐大学学生湊人在过去的事件中受到创伤&#xff0c;与雪乃在钢琴的引导下…

C++万恶的模板

万能的模板都是这样产出的

680. 验证回文串 II(简单)

680. 验证回文串 II 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;680. 验证回文串 II 2.详细题解 本题是167. 两数之和 II - 输入有序数组&#xff08;中等&#xff09;题目的另一种变型&#xff0c;由两数之和变为寻找最多删除一…

基于Netron库的PyTorch 2.0模型可视化

【图书推荐】《从零开始大模型开发与微调&#xff1a;基于PyTorch与ChatGLM》_《从零开始大模型开发与微调:基于pytorch与chatglm》-CSDN博客 前面章节带领读者完成了基于PyTorch 2.0的MNIST模型的设计&#xff0c;并基于此完成了MNIST手写体数字的识别。此时可能有读者对我们…

3D开发工具HOOPS如何推动造船业数智化转型?

在当今科技迅猛发展的背景下&#xff0c;造船业正经历着翻天覆地的变革。计算机辅助设计&#xff08;CAD&#xff09;和三维建筑模型技术的应用&#xff0c;正在逐步取代传统的手绘设计方法&#xff0c;推动着这一行业向数字化、智能化转型。本文将深入探讨HOOPS技术在造船业中…

【LeetCode】九、环形链表检测 + 救生艇

文章目录 1、双指针算法1.1 对撞双指针1.2 快慢双指针 2、leetcode141&#xff1a;环形链表3、leetcode881&#xff1a;救生艇 1、双指针算法 用两个指针来共同解决一个问题&#xff1a; 1.1 对撞双指针 比如先有一个有序的数组array int[] array {1, 4, 5, 7, 9}先要找两个…

mov和mp4区别是什么?苹果的原创和时代的宠儿

在数字媒体领域&#xff0c;视频格式的选择往往决定了观看体验的质量和文件的兼容性。在众多视频格式中&#xff0c;MOV和MP4无疑是最具代表性的两种&#xff0c;它们分别承载着苹果和互联网世界的技术革新与历史变迁。本文将带您穿越时间的长廊&#xff0c;探索MOV与MP4的发展…

基于C++标准库实现定时器类

基于C标准库实现定时器类 定时器类是多线程编程中经常设计到的工具类 简单的定时器原理其实很简单&#xff08;是不是有点GNU is not unix的味道;&#xff09;&#xff1a; 创建一个新线程在那个线程里等待等待指定时长后做任务 python标准库中就有这么一个定时器类&#xf…

关于JVM必备的一些知识

一、类加载 【加载】 - 【链接】-【初始化】 1.1 加载&#xff08;Loading&#xff09; 加载阶段是类加载过程的第一步&#xff0c;它的主要任务是通过类的全限定名&#xff08;Fully Qualified Class Name&#xff09;来获取类的二进制字节流&#xff08;binary data&#…