当前位置: 首页 > article >正文

创建Electron35 + vue3 + electron-builder项目,有很过坑,记录过程

环境: node v20.18.0 npm 11.1.0
用到的所有依赖:
  "dependencies": {"core-js": "^3.8.3","vue": "^3.2.13","vue-router": "^4.5.0"},"devDependencies": {"@babel/core": "^7.12.16","@babel/eslint-parser": "^7.12.16","@vue/cli-plugin-babel": "~5.0.0","@vue/cli-plugin-eslint": "~5.0.0","@vue/cli-service": "~5.0.0","cross-env": "^7.0.3","dotenv-webpack": "^8.1.0","electron": "^35.0.0","electron-builder": "^25.1.8","eslint": "^7.32.0","eslint-plugin-vue": "^8.0.3"},

安装@vue/cli

// 已经安装可以忽略
npm install -g @vue/cli

创建一个新的 Vue 项目

vue create my-electron-vue-app
  • 进入项目目录
cd my-electron-vue-app
  • 修改vue.config.js
// 加上这个,build后,发布的页面不会出现白板
module.exports = {publicPath: process.env.NODE_ENV === 'production' ? './' : '/'
};

添加Electron镜像地址

添加.npmrc文件,里面加上。不配置这个会有很多electron相关的文件下载不了。

electron_mirror=https://npmmirror.com/mirrors/electron/

安装 Electron

npm install electron --save-dev
  • 创建Electron入口文件main.js
mkdir electron
touch electron/main.js
// electron/main.js
// app 模块,它控制应用程序的事件生命周期。
// BrowserWindow 模块,它创建和管理应用程序 窗口。
const { app, BrowserWindow, ipcMain } = require('electron')
// 部引入 Node.js 中的 path 模块
const path = require('path')const process = require('process')// 添加一个createWindow()方法来将index.html加载进一个新的BrowserWindow实例
function createWindow () {// Create the browser window.const mainWindow = new BrowserWindow({width: 800,height: 600,webPreferences: {nodeIntegration: true,contextIsolation: false,//预加载// __dirname 字符串指向当前正在执行脚本的路径 (本项目,指向项目的根文件夹)。// path.join API 将多个路径段联结在一起,创建一个跨平台的组合路径字符串。preload: path.join(__dirname, 'preload.js')}})// and load the index.html of the app.if (process.env.NODE_ENV === 'development') {mainWindow.loadURL('http://localhost:8080');// Open the DevTools.// mainWindow.webContents.openDevTools()} else {mainWindow.loadFile(path.join(__dirname, '../dist/index.html'));}}// 在 Electron 中,只有在 app 模块的 ready 事件被激发后才能创建浏览器窗口。 
// 您可以通过使用 app.whenReady() API来监听此事件。 
// 在whenReady()成功后调用createWindow()。
app.whenReady().then(() => {createWindow()app.on('activate', function () {// 在macOS上,当单击dock图标并且没有其他窗口打开时,通常会在应用程序中重新创建一个窗口if (BrowserWindow.getAllWindows().length === 0) createWindow()})
})// 在Windows和Linux上,关闭所有窗口通常会完全退出一个应用程序。
// 为了实现这一点,监听 app 模块的 'window-all-closed' 事件,
// 并在用户不是在 macOS (darwin) 上运行时调用 [app.quit()][app-quit]
app.on('window-all-closed', function () {if (process.platform !== 'darwin') app.quit()
})
  • 创建Electron预加载文件preload.js
touch electron/preload.js
// electron/preload.js
/*** 预加载* 预加载脚本在渲染器进程加载之前加载,并有权访问两个 渲染器全局 (例如 window 和 document) 和 Node.js 环境(例如 process)*/ 
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
// package.json
{...// 加入"main": "electron/main.js""main": "electron/main.js","scripts": {...// 本地启动命令electron:serve"electron:serve": "set NODE_ENV=development&& electron ."},...
}

安装Electron打包程序electron-builder

npm install electron-builder --save-dev
  • 修改package.json添加命令及build配置
// package.json
{..."scripts": {..."electron:build": "set NODE_ENV=production&& electron-builder"},// electron打包配置"build": {"appId": "com.example.yourapp","productName": "YourApp","directories": {"output": "dist_electron"},"files": ["dist/**/*","electron/*"],"win": {"target": "nsis","icon": "build/icon.ico"},"mac": {"target": "dmg","icon": "build/icon.icns"},"linux": {"target": "AppImage","icon": "build/icon.png"}},...
}
  • 也可以把electron打包配置到单独的electron-builder.yml文件。好处是可以注释。
appId: com.example.yourapp
productName: YourApp
copyright: Copyright © 2025 MyApp
directories:output: dist_electron
files:- "dist/**/*"- "electron/*"
asar: true
win:target: nsisicon: build/icon.ico
mac:target: dmgicon: build/icon.icns
linux:target: AppImageicon: build/icon.png
nsis:oneClick: false # 是否一键安装#allowElevation: true # 允许请求提升权限allowToChangeInstallationDirectory: true # 允许修改安装目录createDesktopShortcut: true # 创建桌面快捷方式createStartMenuShortcut: true # 创建开始菜单快捷方式

安装配置env环境变量

  • 安装 dotenv-webpack
npm install dotenv-webpack --save-dev
  • 修改vue.config.js
const Dotenv = require('dotenv-webpack');
module.exports = {configureWebpack: {plugins: [new Dotenv({path: `./.env.${process.env.NODE_ENV}`,})]}
};
  • 安装cross-env
npm install cross-env --save-dev
  • 修改package.json 启动配置
{..."scripts": {// "serve": "vue-cli-service serve","serve": "cross-env NODE_ENV=development vue-cli-service serve",// "build": "vue-cli-service build","build": "cross-env NODE_ENV=production vue-cli-service build",...},}
  • 创建 .env 文件
touch .env.development
touch .env.production
// .env.development
API_URL=https://dev.api.example.com
// .env.production
API_URL=https://pro.api.example.com

安装vue-router配置

npm install vue-router
// src/router/index.js
import { createRouter, createWebHistory, createWebHashHistory } from 'vue-router';
import HelloWorld from '../components/HelloWorld.vue';const routes = [{ path: '/', component: HelloWorld }
];const router = createRouter({// 打包用createWebHashHistory,如果用createWebHistory,页面会出现白板。history: process.env.NODE_ENV === 'production'? createWebHashHistory(process.env.BASE_URL): createWebHistory(process.env.BASE_URL),routes,
});

执行命令

  • electron本地启动
npm run electron:serve
  • electron打包
// 先执行vue的打包
npm run build
// 再执行electron的打包
npm run electron:build

相关文章:

创建Electron35 + vue3 + electron-builder项目,有很过坑,记录过程

环境: node v20.18.0 npm 11.1.0 用到的所有依赖: "dependencies": {"core-js": "^3.8.3","vue": "^3.2.13","vue-router": "^4.5.0"},"devDependencies": {"ba…...

elasticsearch是哪家的

Elasticsearch:数据搜索与分析的领航者 在当今这个信息爆炸的时代,快速且准确地处理海量数据成为了众多企业和组织追求的目标。而Elasticsearch正是在这个背景下脱颖而出的一款强大的开源搜索引擎。它是由位于美国加利福尼亚州的Elastic公司所开发和维护…...

nginx基础http基础

目录 nginx简介正向代理&反向代理正向代理反向代理What Is a Reverse Proxy Server? High-Performance Load Balancing (负载均衡)Problem(问题)Solution(解决方案)常见负载均衡算法Round Robin(轮询)…...

5. MySQL 存储引擎(详解说明)

5. MySQL 存储引擎(详解说明) 文章目录 5. MySQL 存储引擎(详解说明)1. 查看存储引擎2. 设置系统默认的存储引擎3. 设置表的存储引擎3.1 创建表时指定存储引擎3.2 修改表的存储引擎 4. 引擎介绍4.1 InnoDB 引擎:具备外键支持功能的事务存储引擎4.2 MyISAM 引擎&…...

基于LabVIEW的伺服阀高频振动测试闭环控制系统

为实现伺服阀在设定位置上下快速移动(1kHz控制频率)的振动测试目标,需构建基于LabVIEW的闭环控制系统。系统需满足高速数据采集、实时控制算法(如PID或自适应控制)、高精度电流驱动及传感器反馈处理等需求。结合用户提…...

97.在 Vue 3 中使用 OpenLayers 根据两行根数 (TLE) 计算并显示卫星轨迹(EPSG:3857)

前言 在许多卫星应用场景中,我们需要 基于 TLE(Two-Line Element Set, 两行根数)计算卫星轨迹,并在地图上进行可视化。本文将使用 Vue 3 OpenLayers satellite.js,实现 实时计算卫星轨迹,并在地图上动态更…...

Android Coil总结

文章目录 Android Coil总结概述添加依赖用法基本用法占位图变形自定义ImageLoader取消加载协程支持缓存清除缓存监听 简单封装 Android Coil总结 概述 Coil 是一个用于 Android 的 Kotlin 图像加载库,旨在简化图像加载和显示的过程。它基于 Kotlin 协程&#xff0…...

fastjson漏洞#不出网#原理#流量特征

原理 本质是java的反序列化漏洞,由于引进了自动检测类型的(autotype)功能,fastjson在对json字符串反序列化的时候,会读取type内容,会试图将json内容反序列化成这个对象,并调用这个类的setter方…...

云计算:虚拟化、容器化与云存储技术详解

在上一篇中,我们深入探讨了网络安全的核心技术,包括加密、认证和防火墙,并通过实际案例和细节帮助读者全面理解这些技术的应用和重要性。今天,我们将转向一个近年来迅速发展的领域——云计算。云计算通过提供按需访问的计算资源,彻底改变了IT基础设施的构建和管理方式。本…...

使用 marked.min.js 实现 Markdown 编辑器 —— 我的博客后台选择之旅

最近,我决定为个人博客后台换一个编辑器。之前的富文本编辑器虽然功能齐全,但生成的 HTML 代码繁杂,维护起来非常麻烦。为了追求更简洁高效的写作体验,我开始研究 Markdown 编辑器,并最终选择了 marked.min.js。 1. 传…...

Linux系统基于ARM平台的LVGL移植

软硬件介绍:Ubuntu 20.04 ARM 和(Cortex-A53架构)开发板 基本原理 LVGL图形库是支持使用Linux系统的Framebuffer帧缓冲设备实现的,如果想要实现在ARM开发板上运行LVGL图形库,那么就需要把LVGL图形库提供的关于帧缓冲设…...

LeetCode 2070.每一个查询的最大美丽值:排序 + 二分查找

【LetMeFly】2070.每一个查询的最大美丽值:排序 二分查找 力扣题目链接:https://leetcode.cn/problems/most-beautiful-item-for-each-query/ 给你一个二维整数数组 items ,其中 items[i] [pricei, beautyi] 分别表示每一个物品的 价格 和…...

电力场景绝缘子缺陷分割数据集labelme格式1585张4类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):1585 标注数量(json文件个数):1585 标注类别数:4 标注类别名称:["broken part","broken insulat…...

【计算机网络】深入解析 HTTP 协议的概念、工作原理和通过 Fiddler 抓包查看 HTTP 请求/响应的协议格式

网络原理— HTTP 1. 什么是HTTP? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议: HTTP 往往是基于传输层的 TCP 协议实现的 (HTTP1.0,HTTP1.1,HTTP2.0 均为TCP,HTTP3基于UDP实现) 我们平时打开一个网站,就是通过HTTP协议来…...

IPFS:下一代互联网传输协议

IPFS:下一代互联网传输协议 1. 引言2. IPFS概述3. IPFS的核心优势3.1 去中心化3.2 高效性3.3 安全性3.4 持久性3.5 可扩展性 4. IPFS的工作原理4.1 内容寻址4.2 分布式哈希表(DHT)4.3 文件分块4.4 版本控制4.5 网络协议 5. IPFS的应用场景5.1…...

线上接口tp99突然升高如何排查?

当线上接口的 TP99 突然升高时,意味着该接口在 99% 的情况下响应时间变长,这可能会严重影响系统的性能和用户体验。可以按照下面的步骤进行排查。这里我们先说明一下如何计算tp99:监控系统计算 TP99(第 99 百分位数的响应时间&…...

SpringBoot优雅关机,监听关机事件,docker配置

Spring Boot 提供了多种方法来实现优雅停机(Graceful Shutdown),这意味着在关闭应用程序之前,它会等待当前正在处理的请求完成,并且不再接受新的请求。 一、优雅停机的基本概念 优雅停机的主要步骤如下: …...

在【k8s】中部署Jenkins的实践指南

🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Jenkins简介 2、k8s简介 3、什么在…...

Unity DOTS从入门到精通之 C# Job System

文章目录 前言安装 DOTS 包C# 任务系统Mono 环境DOTS 环境运行作业NativeContainer 前言 作为 DOTS 教程,我们将创建一个旋转立方体的简单程序,并将传统的 Unity 设计转换为 DOTS 设计。 Unity 2022.3.52f1Entities 1.3.10 安装 DOTS 包 要安装 DOTS…...

Spring Boot 本地缓存工具类设计与实现

在 Spring Boot 应用中,缓存是提升性能的重要手段之一。为了更方便地使用缓存,我们可以设计一套通用的本地缓存工具类,封装常见的缓存操作,简化开发流程。本文将详细介绍如何设计并实现一套 Spring Boot 本地缓存工具类&#xff0…...

【Godot4.4】浅尝Godot中的MVC

概述 基于一个Unity的视频。学习了一下基本的MVC概念,并尝试在Godot中实现了一下。 原始的MVC: Godot中的MVC: Model、View和Controller各自应该实现的功能如下: Model: 属性(数据字段)数据存取方法数据更新信号 View: 控…...

如何解决前端的竞态问题

前端的竞态问题通常是指多个异步操作的响应顺序与发起顺序不一致,导致程序出现不可预测的结果。这种问题在分页、搜索、选项卡切换等场景中尤为常见。以下是几种常见的解决方法: 1. 取消过期请求 当用户发起新的请求时,取消之前的请求&…...

Elasticsearch为索引设置自动时间戳,ES自动时间戳

文章目录 0、思路1、配置 ingest pipeline2、在索引映射中启用_source字段的时间戳3、使用 index template 全局设置时间戳4、写入测试数据5、验证结果6、总结 在使用 Elasticsearch 进行数据存储和检索时,时间戳字段是一个非常重要的组成部分。它可以帮助我们追踪数…...

计算机网络:计算机网络的组成和功能

计算机网络的组成: 计算机网络的工作方式: 计算机网络的逻辑功能; 总结: 计算机网络的功能: 1.数据通信 2.资源共享 3.分布式处理:计算机网络的分布式处理是指将计算任务分散到网络中的多个节点(计算机或设备&…...

FPGA设计时序约束用法大全保姆级说明

目录 一、序言 二、时序约束概览 2.1 约束五大类 2.2 约束功能简述 2.3 跨时钟域约束 三、时序约束规范 3.1 时序约束顺序 3.2 约束的优先级 四、约束示例 4.1 设计代码 4.2 时序结果 4.2.1 create_clock 4.2.2 create_generated_clock 4.2.3 Rename_Auto-Derive…...

云服务运维智能时代:阿里云操作系统控制台

阿里云操作系统控制台 引言需求介绍操作系统使用实例获得的帮助与提升建议 引言 阿里云操作系统控制台是一款创新型云服务器运维工具,专为简化用户的运维工作而设计。它采用智能化和可视化的方式,让运维变得更加高效、直观。借助AI技术,控制…...

硬件学习笔记--48 磁保持继电器相关基础知识介绍

目录 1.磁保持继电器工作原理 2.磁保持继电器内部结构及组成部分 3.磁保持继电器主要参数 4.总结 1.磁保持继电器工作原理 磁保持继电器利用永磁体的磁场和线圈通电产生的磁场相互作用,实现触点的切换。其特点在于线圈断电后,触点状态仍能保持&#…...

【云岚到家】-实战问题(上)

【云岚到家】-实战问题(上) 基础架构项目涉及那些角色云岚的业务流程?云岚家政包括那些模块项目采用什么架构如何开发一个接口?RESTful风格的去定义一个接口如何开发一个接口的service方法接口的异常处理怎么实现的?Sp…...

简记_硬件系统设计之需求分析要点

目录 一、 功能需求 二、 整体性能需求 三、 用户接口需求 四、 功耗需求 五、 成本需求 六、 IP和NEMA防护等级需求 七、 认证需求 功能需求 供电方式及防护 供电方式:市电供电、外置直流稳压电源供电、电池供电、PoE(Power Over Ether…...

K8s 1.27.1 实战系列(五)Namespace

Kubernetes 1.27.1 中的 ​Namespace​(命名空间)是集群中实现多租户资源隔离的核心机制。以下从功能、操作、配置及实践角度进行详细解析: 一、核心功能与特性 ​1、资源隔离 Namespace 将集群资源划分为逻辑组,实现 Pod、Service、Deployment 等资源的虚拟隔离。例如,…...