Electron 安装以及搭建一个工程

news2024/11/17 17:53:16

安装Node.js

在使用Electron进行开发之前,需要安装 Node.js。 官方建议使用最新的LTS版本。
检查 Node.js 是否正确安装:

# 查看node版本
node -v
# 查看npm版本
npm -v

注意
开发者需要在开发环境安装 Node.js 才能编写 Electron 项目,但是 Electron 应用程序 不使用系统本地的 Node.js 环境来运行它的代码。
Electron 应用程序 使用它内置的 Node.js 运行时。 这意味着 终端用户 不需要安装 Node.js 环境也可以运行Electron 应用程序。

安装Electron

Electron 应用程序遵循与其他 Node.js 项目相同的结构。

首先创建一个文件夹my-electron-app并在vscode 编译器中打开文件夹。

初始化 npm 包:

npm init

init 初始化命令会提示开发者在项目初始化配置中设置一些值,有几条规则需要遵循:

  • entry point 应为 main.js
  • authordescription 可为任意值,但对于应用打包是必填项。

生成的 package.json 文件应该像这样:

{
  "name": "my-electron-app",
  "version": "1.0.0",
  "description": "一个测试用的electron项目",
  "main": "main.js",
  "author": "zhangSan", 
  "license": "ISC"
}

在项目中安装electron

npm install --save-dev electron

# 可以简写
npm i electron -D

注意 :electron是开发依赖。

electron依赖非常难下载,总是下载到中途就失败了。

查看官方文档:

在运行 npm install electron 时,有些用户会偶尔遇到安装问题。
在大多数情况下,这些错误都是由网络问题导致,而不是因为 electron npm 包的问题。 如 ELIFECYCLEEAI_AGAINECONNRESETETIMEDOUT 等错误都是此类网络问题的标志。 最佳的解决方法是尝试切换网络,或是稍后再尝试安装。

fine,意思是网络问题咯,千M网下载不下来也是离谱啊…

解决方案

  1. 如果通过 npm 安装失败,你也可以尝试通过从 electron/electron/release 直接下载 Electron

  2. 如果安装失败并报错EACCESS,可能需要修复npm权限。

  3. 如果上述报错持续出现,unsafe-perm 标志可能需要被设置为 true:

npm install electron --unsafe-perm=true
  1. 在较慢的网络上, 最好使用 --verbose 标志来显示下载进度:
npm install --verbose electron
  1. 如果需要强制重新下载文件, 并且 SHASUM 文件将 force_no_cache 环境变量设置为 true

我直接使用了第3点和第4点:

npm install electron -D --unsafe-perm=true --verbose

历时半个小时,这个依赖终于下载成功了! 感天动地!!

package.json 配置文件中的scripts字段下增加一条start命令:

{
  "scripts": {
    "start": "electron ."
  }
}

package.json 文件应该像这样:

{
  "name": "my-electron-app",
  "version": "1.0.0",
  "description": "一个测试用的electron项目",
  "main": "main.js",
  "scripts": {
    "start": "electron ."
  },
  "author": "zhangSan",
  "license": "ISC",
  "devDependencies": {
    "electron": "^32.1.2"
  }
}

执行start命令能在开发模式下打开应用:

npm start

执行命令直接就报错了:
没有找到模块main.js,请确认 package.json 中的 main 入口是合法的。
在这里插入图片描述

运行主进程

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

执行 npm start 期间,Electron 将依据应用中 package.json配置下main字段中配置的值查找此文件。

在项目的根目录下创建一个名为 main.js 的空文件。

再次执行 npm start ,不再报错,应用成功启动。但是,它不会做任何事,开发者也看不到启动的应用窗口,因为 main.js 是空白文件,没有添加任何代码!

main.js 中编写代码,创建⼀个基本窗⼝:

// main.js运⾏在应⽤的主进程上,⽆法访问Web相关API
// main.js主要负责:控制⽣命周期、显示界⾯、控制渲染进程等其他操作。
// 从electron中引入app、BrowserWindow
// app模块: 控制应用程序的事件生命周期。
// BrowserWindow模块: 创建和管理应用程序 窗口
const { app, BrowserWindow } = require('electron')

function createWindow() {
  const win = new BrowserWindow({
    width: 500, // 窗口宽度
    height: 300  // 窗口高度
  })
}
// 在 Electron 中,只有在 app 模块的 ready 事件被激发后才能创建浏览器窗口。 
app.on('ready', () => {
  // 当app准备好以后,创建窗口
  createWindow()
})

注意
可以通过使用 app.whenReady() API来监听 app 模块的 ready 事件:

app.whenReady().then(() => {
  createWindow()
})

再次执行 npm start ,应用启动成功,并且能看到应用窗口:

下图是应用自带的菜单:
在这里插入图片描述
如果不要菜单,需要在创建窗口时配置:autoHideMenuBar: true

修改 main.js,在窗口中展示一个远程页面:

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

function createWindow() {
  const win = new BrowserWindow({
    width: 500,
    height: 300,
    autoHideMenuBar: true
  })
  // 展示一个远程页面
  win.loadURL('https://lol.qq.com/main.shtml')
  
  // 可以在这里添加窗口的其他配置和事件处理
}
app.on('ready', () => {
  // 当app准备好的时候,创建窗口
  createWindow()
})

执行npm start,查看效果:
在这里插入图片描述


关于BrowserWindow的更多配置项,请参考官网:BrowserWindow实例属性

加载本地页面

在Electron中,各个窗口显示的内容可以是本地HTML文件,也可以是一个远程url。

创建 pages/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'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;"
    />
    <title>Hello Electron!</title>
  </head>
  <body>
    <h1>Hello Electron!</h1>
  </body>
</html>

修改 mian.js 加载本地⻚⾯:

// 加载⼀个本地⻚⾯
win.loadFile('./pages/index.html')

执行npm start,查看效果:
在这里插入图片描述
可以通过快捷键ctrl+shift+i,打开控制台:
在这里插入图片描述

CSP配置说明

语法:

Content-Security-Policy: <policy-directive>; <policy-directive>

这是一个用于设置网页内容安全策略(Content Security Policy,简称 CSP)的 HTML 标签:

<meta
  http-equiv="Content-Security-Policy"
  content="default-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;"
/>

上述配置的说明:

  • default-src 'self'
    • default-src :配置加载策略,适⽤于所有未在其它指令中明确指定的资源类型。
    • self :仅允许从同源的资源加载,禁⽌从不受信任的外部来源加载,提⾼安全性。
  • style-src 'self' 'unsafe-inline'
    • style-src :指定样式表(CSS)的加载策略。
    • self :仅允许从同源的资源加载,禁⽌从不受信任的外部来源加载,提⾼安全性。
    • unsafe-inline :允许在HTML⽂档内使⽤内联样式。
  • img-src 'self' data:
    • img-src :指定图像资源的加载策略。
    • self :表示仅允许从同源加载图像。
    • data: :允许使⽤ data: URI 来嵌⼊图像。这种URI模式允许将图像数据直接嵌
      ⼊到HTML或CSS中,⽽不是通过外部链接引⽤。

HTTP 响应头 Content-Security-Policy 允许站点管理者控制用户代理能够为指定的页面加载哪些资源。除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点。

关于 CSP 的详细说明请参考:MDN-Content-Security-Policy、Electron Security

如果没有配置CSP,控制台会有⼀个安全警告:
在这里插入图片描述

管理窗口的生命周期

创建窗口

  1. 通常在主进程中创建窗口,可以使用 BrowserWindow 类来创建窗口实例。
const { app, BrowserWindow } = require('electron')

function createWindow() {
  const win = new BrowserWindow({
    width: 500,
    height: 300,
    autoHideMenuBar: true
  })
  // 展示一个远程页面
  win.loadURL('https://lol.qq.com/main.shtml')
  
  // 可以在这里添加窗口的其他配置和事件处理
}
app.on('ready', () => {
  // 当app准备好的时候,创建窗口
  createWindow()
})

窗口的显示与隐藏

  1. win.show():显示窗口。通常在应用启动后或在特定事件触发时调用。
  2. win.hide():隐藏窗口。可以在需要隐藏窗口的情况下调用,比如最小化到系统托盘时。

窗口最小化、最大化、恢复

  1. win.minimize():将窗口最小化到任务栏或 Dock。
  2. win.maximize():最大化窗口。
  3. win.unmaximize():如果窗口处于最大化状态,可以使用 win.unmaximize()恢复到原始大小。

窗口事件监听

  1. closed 事件:

    • 当窗口关闭时触发。在这个事件处理函数中,可以进行一些清理工作,比如释放资源。
    • win.on('closed', () => { mainWindow = null; });
  2. resize 事件:
    当窗口大小改变时触发。可以在这个事件处理函数中根据新的窗口大小调整应用的布局或进行其他相应的处理。

  3. move 事件:
    当窗口位置改变时触发。可以用于记录窗口位置或进行与窗口位置相关的操作。

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

在Windows 和 Linux 系统:关闭所有窗口会完全退出应用程序。

为了实现这一点,需要监听 app 模块的 'window-all-closed' 事件。如果用户不是在 macOS(darwin) 上运行程序,则调用 app.quit()

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit()
})

如果没有窗口打开则打开一个窗口 (macOS)

在 Linux 和 Windows 上,应用根本不存在是否被激活的说法,应用要么是有进程,要么是没进程。

但是,在 macOS 上,应用已经不运行了,但是应用处于未激活状态:应用在没有打开任何窗口的情况下也继续运行。
如果激活应用,则检查应用是否 有窗口,没有窗口就在激活应用时会打开新的窗口。

监听 app 模块的 activate 事件来实现:如果没有任何浏览器窗口是打开的,则调用 createWindow() 方法。

// 当app准备好后,执⾏createWindow创建窗⼝
app.on('ready', () => {
  createWindow();
  // 当应⽤被激活时
  app.on('activate', () => {
    // 如果当前应⽤没有窗⼝,则创建⼀个新的窗⼝
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
  });
});

完整的 main.js 如下:

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

function createWindow() {
  const win = new BrowserWindow({
    width: 500, // 窗口宽度
    height: 300, // 窗口高度
    autoHideMenuBar: true // 隐藏菜单栏
  });

  // 在窗口中加载一个远程页面
  win.loadFile('./pages/index.html');
}
app.on('ready', () => {
  // 当app准备好的时候,创建窗口
  createWindow();

  // 在Windows & Linux,应用的所有窗口关闭时,退出应用程序
  app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') app.quit()
  })

  // 在macOS,当应⽤被激活时
  app.on('activate', () => {
    // 如果当前应⽤没有窗⼝,则创建⼀个新的窗⼝
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
  });
});

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

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

相关文章

Vue之axios请求

Vue之axios请求 axios请求, 是Vue前端框架非常重要的一部分, 今天我们就讲解axios请求, 到底有什么作用, 以及会告诉大家axios的常见用法。 axios请求, 是网页向后端发起请求, 后端吧数据给我们网页, 这是一个前后端交互的过程。当我们学会了axios, 我们可以实现前端和后端练…

如何评估婚恋交友小程序的投资回报率

在这个数字化的时代&#xff0c;越来越多的人选择通过手机应用程序寻找自己的另一半。随着婚恋交友小程序的兴起&#xff0c;编辑h17711347205如何评估这类产品的投资回报率&#xff08;ROI&#xff09;成为了投资者和运营者关注的重点。本文将探讨如何有效地评估婚恋交友小程序…

生活中重大决定,除了你自己,谁也帮不了你!

随着年龄增长&#xff0c;越来越发现&#xff1a;生活是非常现实&#xff0c;更现实的社会&#xff0c;自己除了自己&#xff0c;谁也帮不了你。 因此&#xff0c;一个人的生活是好是坏&#xff0c;往往取决于我们自己的努力程度&#xff0c;越努力才会越幸运。没有伞的孩子&am…

程序设计题(65—72)

第六十五题 题目 请编写函数fun&#xff0c;它的功能是&#xff1a;计算下列级数和&#xff0c;和值由函数值返回。 例如&#xff0c;当n10&#xff0c;x0.3时&#xff0c;函数值为1.349859。 #include <conio.h> #include <stdio.h> #include <math.h> #…

万博智云CEO王嘉在华为全联接大会:以创新云应用场景,把握增长机遇

一、大会背景 2024年9月19-21日&#xff0c;第九届华为全联接大会将在上海世博展览馆和上海世博中心举办。作为华为的旗舰盛会&#xff0c;本次大会以“共赢行业智能化”为主题邀请了众多思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁&#xff0c;从战略、产业、…

同比和环比怎么算?有什么区别一文讲清楚,附同比环比计算器

大家好&#xff0c;这里是效率办公指南&#xff01; &#x1f4ca; 在数据分析和财务报告中&#xff0c;同比和环比是两个常用的指标&#xff0c;它们帮助我们评估数据的时间序列变化。今天&#xff0c;我们将详细介绍同比和环比的定义、它们之间的区别以及如何计算这两个重要…

【漏洞复现】孚盟云oa AjaxSendDingdingMessage接口 存在sql注入漏洞

》》》产品描述《《《 孚盟与阿里强强联手将最受青睐的经典C系列产品打造成全新的孚盟云产品&#xff0c;让用户可以用云模式实现信息化管理&#xff0c;让用户的异地办公更加流畅&#xff0c;大大降低中小企业在信息化上成本&#xff0c;用最小的投入享受大型企业级别的信息化…

CSS 浏览器兼容问题探讨

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 浏览器介绍 css 选择器兼容介绍 ie6 微型盒子兼容解决方法 ie6双倍margin div中放入一个img元素导致div高度多出几像素 非 VIP 用户可前往公众号回复“css”进行免费阅读 浏览器介绍 在国内,常见的网页浏览…

Java:插入排序

目录 排序的概念 插入排序 直接插入排序 哈希排序 排序的概念 排序&#xff1a;所谓的排序&#xff0c;就是使一串记录&#xff0c;按照某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个…

代码写得是真优雅呀!

工作多年后&#xff0c;越发觉得代码整洁真的是太重要了&#xff01;尤其是在团队开发中&#xff0c;写出优雅工整的代码&#xff0c;能让同事更乐于跟你合作。 下面&#xff0c;将通过命名、类、函数、测试这四个章节,使我们的代码变得整洁。 1.为什么要保持代码整洁? 不整…

大厂面试真题-说一下Mybatis的缓存

首先看一下原理图 Mybatis提供了两种缓存机制&#xff1a;一级缓存&#xff08;L1 Cache&#xff09;和二级缓存&#xff08;L2 Cache&#xff09;&#xff0c;旨在提高数据库查询的性能&#xff0c;减少数据库的访问次数。注意查询的顺序是先二级缓存&#xff0c;再一级缓存。…

牛肉高脂猫粮,福派斯猫粮新选择?乳鸽猫粮

福派斯鲜肉宠粮品牌近期对其旗舰产品——无麸质牛肉高脂猫粮单品进行了全面的配方和包装升级&#xff0c;这一举措不仅提升了产品的市场竞争力&#xff0c;更从多个维度确保了宠物食品的安全性与便捷性。 专业解析 "福派斯牛肉高脂猫粮&#xff0c;凭借其卓越的高肉配方&a…

javaweb 实验3

我发现了有些人喜欢静静看博客不聊天呐&#xff0c; 但是ta会点赞。 这样的人呢帅气低调有内涵&#xff0c; 美丽大方很优雅。 说的就是你&#xff0c; 不用再怀疑哦 实验三 Web基础-JavaScript 目的&#xff1a; 1、 理解和掌握Javascript基本语法 2、 掌握JavaScr…

【JAVA开源】基于Vue和SpringBoot的足球俱乐部管理后台

博主说明&#xff1a;本文项目编号 T 051 &#xff0c;文末自助获取源码 \color{red}{T051&#xff0c;文末自助获取源码} T051&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

多跳问答中的语言模型知识编辑增强

人工智能咨询培训老师叶梓 转载标明出处 大模型在整合实时知识更新方面常常遇到困难&#xff0c;这可能导致回答过时或不准确。尤其当处理多跳问题时&#xff0c;挑战进一步增加&#xff0c;因为这类问题需要模型更新和整合与问题相关的多个知识点。图 1为传统基于相似度的搜索…

一个神级 Python 日志管理库:Loguru

大家好&#xff0c;在Python开发过程中&#xff0c;日志记录是不可或缺的一部分&#xff0c;它帮助开发者了解应用程序的运行状态和发现潜在错误。尽管Python自带的logging模块功能全面&#xff0c;但其配置复杂且不够直观。 这时&#xff0c;Loguru库以其简单易用和功能强大而…

Java基础扫盲(二)

想看Java基础扫盲&#xff08;一&#xff09;的可以观看我的上篇文章Java基础扫盲 目录 String为什么设计为不可变的 String有长度限制吗 为什么JDK9将String的char[]改为byte[] 泛型中K,T,V,E,Object,?等都代表什么含义 怎么修改一个类中使用了private修饰的String类型…

电子连接器信号完整性仿真实训教程 一

电子连接器信号完整性仿真学习除需要熟悉软件的基本操作外&#xff0c;还需要基本的实际操作练习才能完全掌握&#xff0c;学以致用。因此推出几期实训教程&#xff0c;教程中将不再详细讲怎么一步一步操作软件&#xff0c;重点讲一些步骤&#xff0c;及一些技巧。也会将连接器…

Spring Boot实战:构建在线商城系统

1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的大环境让那些止步不前&#…

QQ机器人搭建

使用QQ官方机器人Python SDK和三方框架搭建QQ群聊机器人 文章目录 使用QQ官方机器人Python SDK和三方框架搭建QQ群聊机器人前言编写机器人代码机器人监听群聊进行文字回复机器人监听群聊进行图片回复机器人监听群聊进行文件发送机器人监听群聊进行视频发送机器人监听群聊进行语…