electron:vue3+vite打包案例

1、安装electron

首先设置镜像源,否则安装会非常非常慢。

打开npm的配置文件。

npm config edit

修改配置项。

registry=https://registry.npmmirror.com

electron_mirror=https://cdn.npmmirror.com/binaries/electron/

electron_builder_binaries_mirror=https://npmmirror.com/mirrors/electron-builder-binaries/

镜像源设置好后,就可以npm install electron了。

2、安装concurrently

concurrently是本地运行electron需要用到的插件,npm install concurrently即可。

3、electron的main.js和preload.js文件

在项目根目录下,创建electron文件夹,在该文件夹下创建main.js和preload.js。

main.js代码如下:

const {app,BrowserWindow
} = require('electron')
const path = require('node:path')const createWindow = () => {const win = new BrowserWindow({width: 800,height: 600,webPreferences: {preload: path.join(__dirname, 'preload.js')}})// 连接本机前端页面的端口号win.loadURL("http://localhost:3000")win.webContents.openDevTools()
}app.whenReady().then(() => {createWindow()
})// 关闭所有窗口时,退出
app.on('window-all-closed', () => {if (process.platform !== 'darwin') {app.quit()}
})

preload.js代码如下:

由于本案例只是一个demo,功能简单,preload里并无功能性代码,只是为了保证代码项目结构完整性,对应了main.js里的preload: path.join(__dirname, 'preload.js')

const { contextBridge } = require('electron')contextBridge.exposeInMainWorld('versions', {node: () => process.versions.node,chrome: () => process.versions.chrome,electron: () => process.versions.electron// 除函数之外,我们也可以暴露变量
})

在package.json里设置main的路径,也就是我们在根目录下创建的electron文件下的main.js。script里添加启动命令命令。

"main": "electron/main.js",
"scripts": {"dev": "concurrently \"vite\" \"electron .\""}

运行npm run dev,concurrently 会同时启动vite和electron,只启动electron的话,页面会是一片空白。

本地运行结果如下,打开了调试工具:

4、安装electron-builder

electron-builder是用来将项目打包成exe文件的。

之前已经设置了镜像源,此时只需要npm install electron-builder即可。

打包一共需要两个步骤,先用vite打包成dist,然后用electron-builder打包成exe。

所以在package.json的script里,我们将这两个步骤合并一下:

"scripts": {"dev": "concurrently \"vite\" \"electron .\"","build": "vite build && electron-builder"},

还需要进行其他打包设置,比如设置icon路径,icon也放在根目录下的electron文件夹里,target设置为nsis,会生成安装程序的exe;files是打包后需要包含的文件,dist是vite build生成的文件夹,electron文件夹下有main.js和preload.js,package.json里包含了重要的配置信息,所以把它们都放在打包里;directories的output是electron-builder打包后的文件夹名称,设置为release,跟dist文件夹同级。

"build": {"appId": "electron_multiple_languages","win": {"icon": "electron/icon.ico","target": "nsis"},"files": ["dist/**/*","electron/**/*","package.json"],"directories": {"output": "release"}},

打包后不需要显示调试工具了,main.js里需要判断生产环境还是开发环境:

如果是生产环境,需要从dist文件夹的index.html入口,如果是开发环境,连接本地,打开调试工具。

注意端口号不一定是3000,根据你项目实际的端口号来写。

if(app.isPackaged){win.loadFile(path.join(__dirname, '../dist/index.html'))}else{// 连接本机前端页面的端口号win.loadURL("http://localhost:3000")win.webContents.openDevTools()}

执行npm run build命令。

首次使用electron-builder打包时,会到github上去下载winCodeSign和nsis的二进制文件,由于网络问题经常失败。

可以直接去镜像源地址里下载它们:

winCodeSign-2.6.0

nsis需要下载两个包:

CNPM Binaries Mirror

下载好,解压,放在cache目录下:

打包过程中还会遇到其他问题,比如:

icon的分辨率不合规,必须是256*256;

package.json里缺少author和description;

electron和electron-builder必须在devDependencies里。

具体问题按照错误提示来修改即可。

打包后的目录结构:

5、删除dist和release

每次生成的dist文件夹里文件名不相同,如果想要反复打包,dist里的文件是无法自动覆盖的,最好每次都删除dist和release文件夹,需要借助插件rimraf。

npm install rimraf安装,增加删除命令:

"scripts": {"clean": "rimraf dist release","dev": "concurrently \"vite\" \"electron .\"","build": "npm run clean && vite build && electron-builder"},

7、白屏问题

双击release文件夹下的setup.exe文件,安装程序,会在桌面创建快捷方式,双击启动程序,但是会发现一片空白。

这个问题卡了好几个小时,一遍一遍问deepseek,终于找到了问题所在,打包后文件加载要用相对路径,需要在vite.config.js里设置base:'./'

注意,在vite.config.js里是设置base,如果是vue.config.js,是设置publicPath,根据自己项目实际情况来写。

最终运行结果:

完整代码:

electron文件夹下的main.js

const {app,BrowserWindow
} = require('electron')
const path = require('node:path')const createWindow = () => {const win = new BrowserWindow({width: 800,height: 600,webPreferences: {preload: path.join(__dirname, 'preload.js')}})if(app.isPackaged){win.loadFile(path.join(__dirname, '../dist/index.html'))}else{// 连接本机前端页面的端口号win.loadURL("http://localhost:3000")win.webContents.openDevTools()}
}app.whenReady().then(() => {createWindow()
})// 关闭所有窗口时,退出
app.on('window-all-closed', () => {if (process.platform !== 'darwin') {app.quit()}
})

electron文件夹下的preload.js

const { contextBridge } = require('electron')contextBridge.exposeInMainWorld('versions', {node: () => process.versions.node,chrome: () => process.versions.chrome,electron: () => process.versions.electron// 除函数之外,我们也可以暴露变量
})

package.json

{"name": "electron_multiple_languages","version": "0.0.0","author": "demo@163.com","main": "electron/main.js","scripts": {"clean": "rimraf dist release","dev": "concurrently \"vite\" \"electron .\"","build": "npm run clean && vite build && electron-builder"},"build": {"appId": "electron_multiple_languages","win": {"icon": "electron/icon.ico","target": "nsis"},"files": ["dist/**/*","electron/**/*","package.json"],"directories": {"output": "release"}},"dependencies": {"concurrently": "^9.2.0","rimraf": "^6.0.1","vue": "^3.2.8"},"devDependencies": {"@vitejs/plugin-vue": "^1.6.0","@vue/compiler-sfc": "^3.2.6","electron": "^37.2.5","electron-builder": "^26.0.12","vite": "^2.5.2"}
}

vite.config.js

import {defineConfig
} from 'vite'
import vue from '@vitejs/plugin-vue'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue()],base: './', // 确保资源使用相对路径
})

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

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

相关文章

traceroute命令调试网络

文章目录 @[toc] 一、核心原理与参数解析 1. 工作原理 2. 关键参数 二、六大运维场景实战 场景1:内网服务器无法访问公网 场景2:跨国访问延迟高(电商业务卡顿) 场景3:VPN分流异常(流量泄露) 场景4:检测DNS劫持 场景5:防火墙规则验证 场景6:云服务跨区延迟优化 三、高…

自己本地搭建的服务器怎么接公网?公网IP直连服务器方法,和只有内网IP直接映射到互联网

​ 你是不是也遇到过这样的问题:在家里或者公司搭建了一个服务器,但是不知道怎么通过公网IP直接访问它?别急,其实很简单!今天就给大家分享几种方法,手把手教你如何实现公网IP直连服务器,和无公网…

MATLAB中文乱码的解决方法

文章目录问题描述解决方法问题描述 对于matlab脚本输出乱码: ‘ʮ����Ф����һ�����й�&#xff…

工业场景反光衣识别准确率↑32%:陌讯多模态融合算法实战解析

原创声明本文为原创技术解析,核心数据与算法逻辑引用自《陌讯技术白皮书》,禁止任何形式的未经授权转载。一、行业痛点:反光衣识别的场景难题在建筑施工、道路养护、仓储物流等工业场景中,作业人员反光衣穿戴规范检测是安全生产的…

北京JAVA基础面试30天打卡05

一、Redis 的持久化机制有哪些?** Redis 提供两种主要的持久化机制: ✅ RDB(Redis DataBase)快照持久化 定期将 Redis 中的数据以“快照”的形式写入磁盘(生成 .rdb 文件)。启动 Redis 时会加载 .rdb 文件恢…

深入理解 Maven POM 文件:核心配置详解

前言 在 Java 开发领域,Apache Maven 是一个强大的项目管理和构建自动化工具。而pom.xml文件,作为 Maven 项目的“心脏”,定义了项目的方方面面。本文将带你深入了解pom.xml中最常用和最重要的配置项,帮助你快速掌握 Maven 的核心…

嵌入式学习的第四十天-51单片机

一、基本框架第一阶段:1980年、Intel英特尔MCS-51系列:8051型号单片机、工业控制领域、由MCU市场->CPU市场。1、CPU(Central Processing Unit,中央处理单元)‌是计算机的核心部件,负责执行计算机指令和处…

Linux(17)——Linux进程信号(上)

目录 一、信号速识 ✍️生活中的信号 ✍️技术上的信号 ✍️信号的发送和记录 ✍️信号处理概述 二、产生信号 ✍️通过终端产生信号 ✍️通过函数发送信号 ✍️通过软件产生信号 ✍️通过硬件产生信号 一、信号速识 ✍️生活中的信号 你在网上买了很多件商品&…

使用pytest对接口进行自动化测试

上篇博客中讲述了什么是接口测试,已经自动化接口测试流程,这篇博客总结如何实现接口自动化测试(一)requestsrequests库是Python对HTTP通信的一个工具,将http协议操作封装成简单的接口,能够让我们高效的编写…

信息安全及防火墙总结

1.1 信息安全现状及挑战信息安全概述 信息安全:防止任何对数据进行未授权访问的措施,或者防止造成信息有意无意泄漏、破坏、 丢失等问题的发生,让数据处于远离危险、免于威胁的状态或特性。 网络安全:计算机网络环境下的信息安全。…

20250808组题总结

A - A Pak Chanek 有一个包含 nnn 个正整数的数组aaa。由于他正在学习如何计算两个数字的向下取整平均值,他希望在他的数组 aaa 上进行练习。当数组 aaa 至少有两个元素时,Pak Chanek 将执行以下三步操作: ∙\bullet∙选择两个不同的索引 ii…

【Python 语法糖小火锅 · 第 5 涮 · 完结】

一、糖味一句话 Python 3.10 的 match-case 把「类型 值 嵌套」一次性拆开, 可读性 10,bug 数 10,if-elif 可以安心退休了。二、1 行示例 3 连发 # ① 值匹配 match status:case 200: msg "ok"case 404: msg "not found&q…

写 SPSS文件系统

写入 SPSS 系统文件(.sav、.zsav) 以下为相关的 SPSS 命令(以大写形式 CAPS 呈现) savFileName : str SPSS 数据文件的文件名 以 .sav 结尾的文件使用旧版压缩方案压缩。 以 _uncompressed.sav 结尾的文件不压缩,这在需…

云服务器--阿里云OSS(1)【阿里云OSS简单介绍以及环境准备】

一、阿里云OSS简介 定义:阿里云OSS(Object Storage Service)是阿里云提供的对象存储服务,支持海量数据的存储和管理。 存储方式:基于“对象存储”,文件以对象形式存储,无需管理文件系统结构。 …

R语言代码加密(1)

1、使用Compiler包library(compiler) cmpfile("1.R")#实现对R脚本的整体加密 compiler::loadcmp("1.Rc")#调用R脚本存在问题是,该方法仅对脚本进行加密。在加载生成的Rc文件后,脚本内具体函数,是可以看到具体内容的。针对…

【面试场景题】通过LinkedHashMap来实现LRU与LFU

文章目录一、LRU与LFU的概念1. LRU(Least Recently Used,最近最少使用)2. LFU(Least Frequently Used,最不经常使用)二、LinkedHashMap的特性三、用LinkedHashMap实现LRU实现代码:原理说明&…

第5章 Excel公式与函数应用指南(2):数学函数

5.2 数学函数 Excel作为强大的数据处理工具,其内置的数学函数体系为用户提供了丰富的计算能力。从基础的四则运算到复杂的指数对数计算,从简单的数值舍入到专业的矩阵运算,Excel的数学函数几乎可以满足各类计算需求。 本节将重点为您解析七个常用且实用的数学函数:求和函…

mysql复制连接下的所有表+一次性拷贝到自己的库

1.导出链接下的所有数据mysqldump -h 地址 -u 数据库名 -p --all-databases --single-transaction --master-data2 > all_dbs.sql2.导入自己的库mysql -h 127.0.0.1 -u root -p < all_dbs.sql3.指定导出某些库mysqldump -u root -p --databases db1 db2 db3 > /path/t…

开发手札:UnrealEngine和Unity3d坐标系问题

最近把一套网络模块和一套组件模块从u3d改造到ue4。网络模块通用性很高&#xff0c;毕竟协议都是通用网络协议&#xff0c;改造后没啥问题。但是改造组件模块的时候就遇到了问题。首先&#xff0c;unity3d的坐标系是标准左手坐标系&#xff0c;如下&#xff1a;同时自己的几何算…

QML 鼠标穿透

事件&#xff1a; 有一个输入框(TextField)&#xff0c;需要实现鼠标悬浮时改变边框颜色&#xff0c;鼠标移出后恢复原来边框颜色&#xff1b; 这时如果需要实现此功能&#xff0c;就得使用到MouseArea&#xff0c;鼠标操作区域填充满整个TextField。 然后实现鼠标移入移入出的…