Electron | 桌面应用的开发神器

初探 Electron

教程将介绍 Electron 打包应用的全过程,从本地测试,打包,到 GitHub 自动化。讲解 Electron Forge 和 Electron Builder 的用法,以及如何在 GitHub Actions 中自动化生成和发布应用。

官方资源

  • Electron Documentation
  • Electron-builder 官方文档
  • Electron-Forge 文档
  • Electron-Forge 打包教程

Electron 通过 JavaScript、HTML 和 CSS 来构建跨平台的桌面应用。它通过将 Chromium 和 Node.js 集成到同一个运行时环境中,使开发者能够维护一个单一的代码库,并在 Windows、macOS 和 Linux 上运行。Electron 的设计消除了需要针对每个平台进行原生应用开发的复杂性。

类似工具

Tauri 是一个较新的框架,提供了更现代的技术栈和更高的安全性。Electron 由于其历史悠久和强大的社区支持,仍然保持着广泛的使用。以下是对两种工具的简要比较:

  • Electron:

    • 优点: 社区庞大,支持广泛,文档丰富。
    • 缺点: 性能开销较大,应用体积较大。
  • Tauri:

    • 优点: 更小的资源占用,增强的安全性,允许更紧密地与系统原生功能集成。
    • 缺点: 相对较新,社区和资源较少。

快速示例

以下是一个简单的 Electron 应用开发示例,包含创建过程和基础命令。

开发环境准备

系统版本信息:

npm -v
6.14.18
❯ node -v
v20.11.0

npm 使用低版本,避免一些卡顿问题。

创建应用

示例使用 Vue 和 JavaScript:

npm create vite@latest electron-demo

electron-npm-create
项目的目录结构如下所示:

.
├── index.html
├── package.json
├── public
│   └── vite.svg
├── README.md
├── src
│   ├── App.vue
│   ├── assets
│   │   └── vue.svg
│   ├── components
│   │   └── HelloWorld.vue
│   ├── main.js
│   └── style.css
└── vite.config.js

4 directories, 10 files

最初考虑用 pnpm 来实践,但由发现 pnpm 对 Electron 的支持存在问题,暂时弃用,详情参阅:知乎文章。

安装与启动

建议配置 npm 镜像以加速下载过程:

# npm config set registry https://r.cnpmjs.org
npm install
npm run dev

安装 Electron 过程中的下载可能需要较长时间:

npm install electron

添加和修改 Electron 配置

这份代码可以参考官网给的 examples。

为了确保 Electron 应用能够正确地引用资源文件(如 CSS 和 JavaScript),需要对 vite.config.js 文件进行适当的修改。这包括设置资源的加载路径为相对路径,以预防文件找不到的问题。

修改 vite.config.js 如下:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// 配置基本路径为相对路径
export default defineConfig({
  base: './',  // 确保打包后的资源可以正确加载
  plugins: [vue()],
})

接下来,我们需要添加一个 main.js 文件,这个文件是 Electron 应用的入口,负责控制应用生命周期和创建原生浏览器窗口。

// main.js

// 控制应用生命周期和创建原生浏览器窗口的模组
const { app, BrowserWindow } = require('electron')
const path = require('path')

function createWindow () {
  // 创建浏览器窗口
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })

  // 加载 index.html
  mainWindow.loadFile('dist/index.html') // 此处跟electron官网路径不同,需要注意

  // 打开开发工具
  // mainWindow.webContents.openDevTools()
}

// 这段程序将会在 Electron 结束初始化
// 和创建浏览器窗口的时候调用
// 部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(() => {
  createWindow()

  app.on('activate', function () {
    // 通常在 macOS 上,当点击 dock 中的应用程序图标时,如果没有其他
    // 打开的窗口,那么程序会重新创建一个窗口。
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

// 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 因此,通常对程序和它们在
// 任务栏上的图标来说,应当保持活跃状态,直到用户使用 Cmd + Q 退出。
app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
})

// 在这个文件中,你可以包含应用程序剩余的所有部分的代码,
// 也可以拆分成几个文件,然后用 require 导入。

添加 preload.js 文件以在渲染进程中安全地使用 Node.js 模块:

// preload.js

// 所有Node.js API都可以在预加载过程中使用。
// 它拥有与Chrome扩展一样的沙盒。
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])
  }
})

最后,更新 package.json 文件以包括新的启动脚本,使 Electron 能够运行。

{
  "name": "electron-demo",
  "private": true,
  "version": "0.0.0",
  "main": "main.js",  // 新增
  //"type": "module", 创建项目自带的这个要删除,否则会有问题
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview",
    "electron:serve": "electron ."  //新增 electron运行命令
  },
  "dependencies": {
    "electron": "^27.0.0",
    "vue": "^3.3.4"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^4.2.3",
    "vite": "^4.4.5"
  }
}

打包和运行 Vue 项目

为了部署 Electron 应用,首先需要对 Vue 项目进行打包。这可以通过以下命令实现:

npm run build

打包完成后,通过下列命令启动 Electron 应用:

npm run electron:serve

应用运行效果如图所示:

Electron Vue App

热更新开发

为了提升开发效率,可以设置热更新,使得在开发过程中对代码的修改能够即时反映在 Electron 应用中。首先需要修改 main.js 文件中的内容加载方式,从加载本地文件改为加载开发服务器地址:

mainWindow.loadURL("http://localhost:5173")  // 更改为开发服务器的 URL

为了确保 Electron 能够在 Vite 开发服务器启动后运行,需引入 concurrentlywait-on 两个 npm 包。concurrently 允许同时运行多个命令,而 wait-on 确保 Electron 在服务器可访问后再启动。

首先,安装这两个工具:

npm install -D concurrently wait-on

然后,更新 package.json 中的 scripts 部分,添加用于启动开发环境的命令:

"electron": "wait-on tcp:5173 && electron .",  // 新增,等待端口5173
"electron:serve": "concurrently -k \"npm run dev\" \"npm run electron\"" // 新增,同时运行 Vite 和 Electron

现在,通过执行 npm run electron:serve,Electron 应用将自动启动并加载 Vite 的开发服务器,实现实时的热更新功能。

环境分离和打包配置

在开发和生产环境中运行 Electron 应用通常需要不同的配置。特别是在涉及到资源加载方式时,比如开发环境中可能从本地服务器加载,而生产环境则从文件系统加载打包后的资源。

环境变量设置

为了在不同环境下切换配置,我们使用 NODE_ENV 环境变量来区分生产环境 (production) 和开发环境 (development)。您也可以根据需要配置额外的环境,如 release

首先,我们组织 Electron 相关的文件到一个单独的目录以便管理:

# 在项目根目录下操作
mkdir -p electron
mv main.js electron/
mv preload.js electron/

修改 main.js 文件以使用环境变量来决定加载的资源类型:

const { app, BrowserWindow } = require('electron')
const path = require('path')
const NODE_ENV = process.env.NODE_ENV  // 获取环境变量
// const NODE_ENV = 'development'  // 判断开发或生产模式(建议写成这种,开发模式就可以用,等即将打包了再把这个变量换成打包模式)

function createWindow () {
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })

  // 根据环境变量决定加载的内容
  mainWindow.loadURL(
    NODE_ENV === 'development'
    ? 'http://localhost:5173'
    : `file://${path.join(__dirname, '../dist/index.html')}`
  )

  // 在开发环境中自动打开开发者工具
  if (NODE_ENV === "development") {
    mainWindow.webContents.openDevTools()
  }
}
更新 package.json

更新 package.json 来适应新的文件结构,并确保 NODE_ENV 在启动时正确设置:

{
  "name": "electron-demo",
  "private": true,
  "version": "0.0.0",
  "main": "electron/main.js",  // 更新入口文件路径
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview",
    "electron": "wait-on tcp:5173 && electron .",
    "electron:serve": "concurrently -k \"npm run dev\" \"npm run electron\""
  },
  "devDependencies": {
    "electron": "^30.0.2",
    "vue": "^3.4.21",
    "@vitejs/plugin-vue": "^5.0.4",
    "concurrently": "^8.2.2",
    "vite": "^5.2.0",
    "wait-on": "^7.2.0"
  }
}

当设置环境变量 const NODE_ENV = 'development' 时,热更新效果:

Electron Hot Reload

应用打包

打包 Electron 应用之前,需确保已经安装了必要的库,以简化环境设置并支持跨平台打包:

  • cross-env: 用于统一不同操作系统之间的环境变量设置。
  • electron-builder: 助力将 Electron 应用打包成可分发的格式。

安装这些工具的命令如下:

npm install -D cross-env electron-builder
打包配置

接下来,在 package.json 中配置打包相关的参数,以确保应用按预期构建。

scripts 部分,添加用于一键打包的命令:

"electron:build": "vite build && electron-builder"

针对打包过程的详细配置如下所示:

"build": {
  "appId": "com.dweb.electron-demo",
  "productName": "ElectronDemo",
  "copyright": "Copyright © 2024 Rex Wang",
  "mac": {
    "category": "public.app-category.utilities"
  },
  "nsis": {
    "oneClick": false,
    "allowToChangeInstallationDirectory": true
  },
  "files": [
    "dist/**/*",
    "electron/**/*"
  ],
  "directories": {
    "buildResources": "assets",
    "output": "dist_electron"
  }
}

配置详解:

  • appId: 应用的全局唯一标识符,常用反向域名格式。
  • productName: 应用的名称。
  • copyright: 版权信息。
  • mac/nsis: 平台特定的配置项,如 macOS 应用类别、Windows 安装程序配置等。
  • files: 指定包含在最终应用包中的文件和目录。
  • directories: 定义资源目录和输出目录,便于管理打包资源。
多平台打包

根据需要打包的平台,可以在 package.json 中设置特定的构建目标和体系结构:

  • Mac: 支持 ARM 和 Intel 架构。
  • Windows: 支持常见体系结构,可打包成安装程序或便携式应用。
  • Linux: 支持 .deb.AppImage 格式。

例如,Mac 平台的配置示例:

"mac": {
  "category": "public.app-category.utilities",
  "target": [
    {"target": "dmg", "arch": ["x64", "arm64"]},
    {"target": "dir", "arch": ["x64", "arm64"]}
  ]
}
执行打包

通过下列命令启动打包过程:

npm run electron:build

打包工具会根据当前操作系统和设置的配置自动选择合适的打包方式。例如,ARM 架构的 Mac 输出如下:

  • building        target=macOS zip arch=arm64 file=dist_electron/ElectronDemo-0.0.0-arm64-mac.zip
  • Detected arm64 process, HFS+ is unavailable. Creating dmg with APFS - supports Mac OSX 10.12+

完成打包后,dist_electron 目录下将包含所有生成的文件,例如 Mac 平台的输出结构如下所示:

dist_electron
├── ElectronDemo-0.0.0-arm64.dmg
├── ElectronDemo-0.0.0.dmg
├── mac
│   └── ElectronDemo.app
└── mac-arm64
    └── ElectronDemo.app

.app 文件可直接运行,而 .dmg 文件提供了标准的安装流程。类似地,Linux 平台会生成 .AppImage 和其他分发格式。由于 Electron 应用内嵌了浏览器,打包文件的体积通常较大,例如 Linux 和 Mac 平台的 .AppImage/.dmg 文件大小通常在 100MB 左右。

小结

本例使用 Electron 框架将一个 Vue.js 项目转换成一个跨平台的桌面应用。

关键步骤回顾:

  1. 初始化:创建项目,打包运行,并用 Electron 运行
  2. 热更新开发:设置热更新,利用环境变量和配置文件适配开发和生产环境
  3. 打包与分发:使用 electron-builder 和相关工具,将应用打包成可分发的格式,支持多平台发布。

简单来说,在原项目基础上,安装 Electron 依赖,并添加配置文件 main.js, preload.js 然后打包构建。

接下来部分是介绍 Electron Forge,一个更常用的打包利器。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GDPU unity游戏开发 角色控制器与射线检测

在你的生活中,你一直扮演着你的角色,别被谁控制了。 小试 1. 创建一个角色控制器,通过键盘控制角色控制器的移动,角色控制器与家具发生碰撞后,通过Debug语句打印出被碰撞物体的信息(搜索OnControllerColliderHit的使用…

windows系统安装Ubuntu子系统

安装前先在 控制面板 中打开 程序与功能选项 ,点击 启用或关闭Windows功能: 勾选 适用于 Linux的Windows子系统 和 虚拟机平台 、 Hyper-v 。 重启电脑后再 Microsoft Store Windows应用商店 中下载合适的Ubuntu版本。 运行Ubuntu程序,如出现…

picoCTF-Web Exploitation-Most Cookies

Description Alright, enough of using my own encryption. Flask session cookies should be plenty secure! server.py http://mercury.picoctf.net:53700/ Hints How secure is a flask cookie? 我们先下载server.py,分析逻辑 from flask import Flask, render…

2024年,Web开发新趋势!

随着我们迈入新的一年,现在正是审视2024年网页开发领域开始流行哪些趋势的绝佳时机。回顾2023年的一系列更新,以下是来年一些热门话题的概览。 自主托管有回归的趋势 近些年,自主托管一直是网页开发者和公司托管其应用程序的默认方式。开发…

绿盟之旅——一段安全实习结束

去年,因为着急找实习,拿着简历就开始海投,当时想的是有人让我去就谢天谢地了,第一个约我面试的就是绿盟,也很顺利的通过了面试,当时让我选择在上海还是北京,我选择的是上海,因为学校…

体验GM CHM Reader Pro,享受高效阅读

还在为CHM文档的阅读而烦恼吗?试试GM CHM Reader Pro for Mac吧!它拥有强大的功能和出色的性能,能够让你轻松打开和阅读CHM文件,享受高效、舒适的阅读体验。无论是学习、工作还是娱乐,GM CHM Reader Pro都能成为你的得…

探索数据结构(让数据结构不再成为幻想)

目录 什么是数据结构 数据与结构 什么是算法 复杂度分析 时间复杂度与空间复杂度 时间复杂度 思考: 空间复杂度 常数阶O(1) 对数阶O(logn) 线性阶O(n) 以下为空间复杂度为O(n) 线性对数阶O(nlogn) 平方阶O(n) 指数阶O(2^n) 什么是数据结构 数据结构…

OpenCompass 大模型评测实战学习笔记

大模型开源开放评测体系 “司南” (OpenCompass2.0),用于为大语言模型、多模态模型等提供一站式评测服务。其主要特点如下: 开源可复现:提供公平、公开、可复现的大模型评测方案 全面的能力维度:五大维度设计,提供 70…

AR系列路由器配置VLAN间通信

AR路由器是华为公司推出的企业级路由器产品系列,具有高可靠性、高性能和易管理等特点。AR 系列路由器提供的功能包括路由转发、安全接入、语音、视频、无线等多种业务,支持各种接入方式和协议,并且可以方便地进行扩展和升级。 实验拓扑图&…

动态路由-链路状态路由协议ospf案例

实验拓扑和要求如图 ospf实验 1.设置各个接口地址 2.测试ar5到ar6的连通性 3.配置ospf协议,routerid,area, 详细的网络信息,等待网络收敛后, 查看ospf信息,路由表信息,再次测试连通性 注意区域…

React 第二十七章 Hook useCallback

useCallback 是 React 提供的一个 Hook 函数,用于优化性能。它的作用是返回一个记忆化的函数,当依赖发生变化时,才会重新创建并返回新的函数。 在 React 中,当一个组件重新渲染时,所有的函数都会被重新创建。这可能会…

使用 PXE+Kickstart 批量网络自动装机

前言: 正常安装系统的话使用u盘一个一个安装会非常慢,所以批量安装的技术就出来了。 一、 概念 PXE (Preboot eXecute Environment,预启动执行环境)是由 Intel 公司开发的技术,可以让计算机通过网络来启动…

Scoop国内安装、国内源配置

安装配置源可参考gitee上的大佬仓库,里面的步骤、代码都很详细,实测速度也很好 glsnames/scoop-installer 也可以结合其它bucket使用 使用Github加速网站,也可以换做其他代理方式,自行测试 例如:https://mirror.ghprox…

【pkuseg】由于网络策略组织下载请求,因此直接在github中下载细分领域模型medicine

【pkuseg】由于网络策略组织下载请求,因此直接在github中下载细分领域模型medicine 写在最前面解决方案pkuseg是什么?报错原因报错详情 🌈你好呀!我是 是Yu欸 🌌 2024每日百字篆刻时光,感谢你的陪伴与支持…

OFDM802.11a的FPGA实现(十三)加窗(含verilog和matlab代码)

原文链接(相关文章合集):OFDM 802.11a的xilinx FPGA实现 1.前言 添加循环前缀后,对数据还要进行加窗(Windowing)操作。加窗操作可以使OFDM 符号在带宽之外的功率谱密度下降得更快。 2.加窗 对OFDM符号“加窗”意味着令符号周期边缘的幅度…

分形视角观察Linux世界一切皆文件的设计哲学

一切皆文件 我们知道在Linux的世界里,一切皆文件。 而在前面的博客也说过,Linux世界里对文件进行读写、或进行输入/输出,很好地模拟了图灵机模型,所以,它的描述能力是非常强的! 图例 常见文件 一切皆…

外观模式详解

外观模式 1 概述 有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就…

商场学习之微服务

前言 寒假前在新电脑上配置了java环境,maven仓库,node,js,navicat,MySQL,linux,vmware等环境,创建了6个mysql数据库,77张表。 如此多的表,字段,去手写基础…

2024年天津市静海区教师招聘报名流程(建议电脑)

2024年天津市静海区教师招聘报名流程(建议电脑) #报名 #教师招聘 #教师招聘考试 #教招 #天津教师招聘 #天津教师招聘考试 #24年天津教师招聘 #24年天津市教师招聘考试 #天津市静海区教师招聘 #静海区教师招聘考试 #静海区教师编 #静海区#

1065: 无向图的连通分量计算

解法&#xff1a; dfs求连通性 1.设节点表vis[] 2.遍历节点表dfs标记&#xff0c;每次得到一个连通分量 #include<iostream> #include<vector> using namespace std; int arr[100][100]; void dfs(vector<bool>& vis, int v) {//不用终止条件&#x…