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

将 Vue 3 + Vite + TS 项目打包为 .exe 文件

使用 electron-builder打包:

一、安装依赖

npm install electron electron-builder --save-dev

如果安装时出现网络错误,就使用镜像安装
在项目根目录下新建.npmrc 文件,添加以下内容:

electron_mirror=https://npmmirror.com/mirrors/electron/
electron_headers_mirror=https://npmmirror.com/mirrors/electron-headers/

然后再次执行npm install electron electron-builder --save-dev即可安装成功!

二、创建 Electron 入口文件

在项目根目录下创建 electron/main.js 文件

import { app, BrowserWindow } from 'electron';
import path from 'path';
import { fileURLToPath } from 'url';// 兼容 ESM 的 __dirname
const __dirname = path.dirname(fileURLToPath(import.meta.url));let win;function createWindow() {win = new BrowserWindow({width: 1920,height: 1080,webPreferences: {nodeIntegration: true,contextIsolation: false,},});// 开发环境下加载 Vite 开发服务器if (process.env.NODE_ENV === 'development') {win.loadURL('http://localhost:5173');} else {// 生产环境下加载打包后的文件win.loadFile(path.join(__dirname, '../dist/index.html'));}win.webContents.openDevTools();
}app.whenReady().then(createWindow);// 所有窗口关闭时退出应用(macOS 除外)
app.on('window-all-closed', () => {if (process.platform !== 'darwin') app.quit();
});// macOS 下点击 Dock 图标重新打开窗口
app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) createWindows();
});// 只在开发模式下启用热重载
if (process.env.NODE_ENV === 'development') {// 开发模式下的热重载逻辑require('electron-reload')(__dirname, {electron: path.join(__dirname, '..', 'node_modules', '.bin', 'electron'),});
}

三、修改 package.json:添加/修改以下配置:

{"main": "electron/main.js","scripts": {"electron:serve": "vite build && electron .","electron:build": "vite build && electron-builder --dir"},"build": {"productName": "test","files": ["dist/**/*","electron/**/*"],"win": {"target": "nsis"},"mac": {"target": "dmg"},"linux": {"target": "AppImage"}}
}

四、构建应用

npm run electron:build

可能会遇到的问题:

1、打包过程中出现下载资源失败:
(1)可以使用淘宝镜像下载
(2)可以直接复制下载失败的链接,然后手动下载后,粘贴到电脑C盘%LOCALAPPDATA%\electron-builder\Cache路径下

2、打包后点击.exe出现白屏或黑屏:
这里一定要改路由模式为hash模式,我之前写的是createWebHistory打包后是黑屏,改成createWebHashHistory就好了
在这里插入图片描述

在这里插入图片描述

3、如果前端有多个页面显示,页面之间没有点击按钮的跳转,是通过改地址栏路由的方式打开的,那么electron打包后点击,exe只会显示首页,又不像浏览器一样可以改地址栏怎么办:
修改electron/main.js文件,在main.js 中启动两个窗口,分别加载两个地址就可以实现,点击.exe同时打开两个窗口,以下是修改的代码

import { app, BrowserWindow } from 'electron';
import path from 'path';
import { fileURLToPath } from 'url';// 兼容 ESM 的 __dirname
const __dirname = path.dirname(fileURLToPath(import.meta.url));let mainWin;    // 页面1
let faultWin;   // 页面2async function createWindows() {//页面1mainWin = new BrowserWindow({width: 1920,height: 1080,webPreferences: {nodeIntegration: true,contextIsolation: false,},});//页面2faultWin = new BrowserWindow({width: 1920,height: 1080,webPreferences: {nodeIntegration: true,contextIsolation: false,},});// 加载页面if (process.env.NODE_ENV === 'development') {await mainWin.loadURL('http://localhost:3000');await faultWin.loadURL('http://localhost:3000/#/fault-recognition');} else {await mainWin.loadFile(path.join(__dirname, '../dist/index.html'));await faultWin.loadFile(path.join(__dirname, '../dist/index.html'), {hash: '#/fault-recognition',});}// 可选:开发时自动打开 DevTools(可以去掉)mainWin.webContents.openDevTools();faultWin.webContents.openDevTools();
}// 启动应用
app.whenReady().then(createWindows);// 所有窗口关闭时退出应用(macOS 除外)
app.on('window-all-closed', () => {if (process.platform !== 'darwin') app.quit();
});// macOS 下点击 Dock 图标重新打开窗口
app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) createWindows();
});

文章转载自:
http://breastwork.elldm.cn
http://apocrypha.elldm.cn
http://afraid.elldm.cn
http://artware.elldm.cn
http://ammonoid.elldm.cn
http://ambiguously.elldm.cn
http://berried.elldm.cn
http://carding.elldm.cn
http://brainwashing.elldm.cn
http://cacophonize.elldm.cn
http://apprentice.elldm.cn
http://carmine.elldm.cn
http://chromium.elldm.cn
http://cartelize.elldm.cn
http://actinozoan.elldm.cn
http://anamorphism.elldm.cn
http://cage.elldm.cn
http://alfreda.elldm.cn
http://centenary.elldm.cn
http://barrio.elldm.cn
http://autochthonism.elldm.cn
http://albeit.elldm.cn
http://chewie.elldm.cn
http://buyable.elldm.cn
http://choirgirl.elldm.cn
http://bandsaw.elldm.cn
http://avigator.elldm.cn
http://antedate.elldm.cn
http://acoasm.elldm.cn
http://adamic.elldm.cn
http://www.dtcms.com/a/281735.html

相关文章:

  • 711SJBH构建制造业信息化人才培训体系的对策-开题报告
  • 21-C#的委托简单使用-1
  • Datawhale 25年7月组队学习coze-ai-assistant Task1学习笔记:动手实践第一个AI Agent—英伦生活口语陪练精灵
  • yolov5、yolov8、yolov11、yolov12如何训练及轻量化部署-netron-onnx
  • echarts折线图的 线条的样式怎么控制
  • Python os模块完全指南:从入门到实战
  • python编程实现GUI界面的排序与查找算法动态模拟演示程序
  • Sa-Token使用要点
  • mongoDB安装初始化及简单介绍
  • 2025/7/15——java学习总结
  • Pandas 和 NumPy 使用文档整理
  • 大宗现货电子盘交易系统核心功能代码解析
  • QT6 源,六章事件系统(8)QEvent 的孙子类:QEnterEvent 光标进入
  • 无穿戴动捕如何凭借摄像头视觉识别算法,赋能高校专业教学革新?
  • python进阶
  • 145-变分模态分解VMD与平稳小波变换SWT信号降噪算法实现!
  • 4G模块 A7680通过MQTT协议连接到onenet(新版)
  • WebAPIs基本认知,DOM基础介绍
  • 基于Springboot+UniApp+Ai实现模拟面试小工具五:权限校验参数校验及日志功能实现
  • Ubuntu 22.04 安装 mysql-server与 postgreSQL 服务端
  • el-tooltip 快速滚动的时候出现残影如何解决 vue3
  • 30.安卓逆向2-frida hook技术-hook So文件(获取app加载的所有模块、导入函数、导出函数、hook SO函数)
  • 区块链发展史全景长图
  • 强化学习Reinforcement Learning
  • 基于Python的图像文字识别系统
  • Glide双内存缓存加载机制详细介绍
  • K型热电偶电动势以及温度对照表
  • 驱动开发系列61- Vulkan 驱动实现-SPIRV到HW指令的实现过程(2)
  • [Science]论文 视黄素与细胞修复
  • 2025-07-15通过边缘线检测图像里的主体有没有出血