Vite + Vue3 + Electron 创建打包桌面程序

10 【Vite + Vue3 + Electron 创建打包桌面程序】

1.使用 Vite 构建 Electron 项目

1.1 创建 Vite 应用,安装 Electron 依赖

创建一个 Vite 项目

npm init vite@latest

安装 Electron 相关依赖

npm install electron -D
npm install vite-plugin-electron -D 

1.2 在 vite.config.ts 中,配置 Electron 入口文件

image-20230112210747636

根据上方官网提示,创建 electron/main/index.ts,与 src 目录同级

image-20230112210930657

配置 Electron 入口文件 —— 打开 vite.config.ts,引入 electron/main/index.ts

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import electron from 'vite-plugin-electron'export default defineConfig({plugins: [vue(), electron({main: {// 配置 Electron 入口文件entry: 'electron/main/index.ts',    }})]
})

这么配置,就启动一个 Vite 应用就行。

1.3 编写 electron / index.ts

1.3.1 app、BrowserWindow

在 electron 依赖中,可以引入 app、BrowserWindow:

  • app 控制应用程序的事件生命周期(相当于应用程序)
  • BrowserWindow 创建并控制浏览器窗口(相当于打开桌面弹框)

实例化 BrowserWindow 对象,创建一个窗口,在内部通过 nodeIntegration、contextIsolation 集成网页和 Node.js(也就是在渲染进程中,可以调用 Node.js 方法)

1.3.2 使用 win.loadURL 加载窗口 / Vite 环境变量

使用 win.loadURL 加载窗口,接收的网址是指:Vite 启动后,会在本地运行一个服务,把这个服务网址丢进去就行

  • 使用 Vite 自带的环境变量 VITE_DEV_SERVER_HOST
  • 如果是 undefined,就换成 VITE_DEV_SERVER_HOSTNAME(现在应该采用这个了)
  • ps:在 Vite 3.2.41中,使用 VITE_DEV_SERVER_URL 表示 Vite 服务器本地路径

关于 Vite 环境变量,可以去终端看下

image-20230112211200258

1.3.3 使用 app.whenReady() 初始化app

最后,使用 app.whenReady() 初始化app(在 Electron 完成初始化时触发)

初始化完成后,再挂载上面创建的 桌面应用程序窗口

1.3.4 整理 electron/main/index.ts

  • 开发环境下,我们访问的是 Vite 本地服务
  • 打包之后,我们访问的是 dist 静态文件

要修改 win.loadURL 中的路径参数,判断下当前是生产环境,还是开发环境

electron/main/index.ts中,写入下方代码

// app 控制应用程序的事件生命周期(相当于应用程序)
// BrowserWindow 创建并控制浏览器窗口(相当于打开桌面弹框)
import { app, BrowserWindow } from 'electron'
import { join } from 'node:path'// 定义全局变量,获取窗口实例
let win: BrowserWindow | null;/*** 创建一个窗口*/
const createWindow = () => {win = new BrowserWindow({title: 'Main window',icon: join(process.env.PUBLIC, 'favicon.ico'),webPreferences: {preload: join(__dirname, '../preload/index.js'),// 集成网页和 Node.js,也就是在渲染进程中,可以调用 Node.js 方法nodeIntegration: true,contextIsolation: false,}})// 集成网页和 Node.js 后,需要加载// 这里接收的网址是指:Vite 启动后,会在本地运行一个服务,把这个服务网址丢进去就行if (process.env.VITE_DEV_SERVER_URL) {win.loadURL(process.env.VITE_DEV_SERVER_URL)// Open devTool if the app is not packagedwin.webContents.openDevTools()} else {win.loadFile(join(process.env.DIST, 'index.html'))}}// 初始化app(在 Electron 完成初始化时触发),挂载上面创建的 桌面应用程序窗口
app.whenReady().then(createWindow)

1.4 配置 package json,运行项目

1.4.1 运行项目后,出现的两个报错

启动项目后,出现下面两个报错

image-20230112211622286

image-20230112211645212

综上所述,需要在 package.json 中,增加 main 字段,去掉 type 字段

{"name": "electron-vue-vite","version": "1.0.0","main": "dist-electron/main/index.js","description": "Electron + Vue + Vite.","author": "dselegent","license": "MIT","keywords": ["electron","rollup","vite","vue3","vue"],"scripts": {"dev": "vite","build": "vue-tsc --noEmit && vite build","preview": "vite preview"},"devDependencies": {"@vitejs/plugin-vue": "^4.0.0","electron": "^22.0.0","electron-builder": "^23.6.0","typescript": "^4.9.4","vite": "^4.0.3","vite-plugin-electron": "^0.11.1","vite-plugin-electron-renderer": "^0.11.4","vue": "^3.2.45","vue-tsc": "^1.0.16"}
}
1.4.2 开发环境运行效果

运行项目 npm run dev

2.打包 Electron 桌面程序

3.1 安装打包依赖,调整打包命令

安装打包依赖 electron-builder

npm install electron-builder -D 

安装完成后,在 package json 中,配置 build 命令

"build": "vue-tsc --noEmit && vite build && electron-builder",

3.2 增加 electron-builder 相关配置

appId、productName… —— 应用基本信息信息

win、mac —— 不同类型设备配置

nsis—— 桌面应用程序安装过程的配置

在根目录配置electron-builder.json5

/*** @see https://www.electron.build/configuration/configuration*/
{appId: 'com.electron.desktop',asar: true,icon: 'public/favicon.ico',copyright: 'Copyright © 2022 electron',directories: {// 输出路径output: 'release/${version}',},productName: 'electron',files: ['dist-electron', 'dist'],// mac 配置mac: {artifactName: '${productName}_${version}.${ext}',target: ['dmg'],},// windows 配置win: {target: [{target: 'nsis',arch: ['x64'],},],artifactName: '${productName}_${version}.${ext}',},// 应用程序的安装过程配置nsis: {// 关闭了一键集成,因此会走 下一步、下一步、下一步... 进行安装oneClick: false,perMachine: false,allowToChangeInstallationDirectory: true,deleteAppDataOnUninstall: false,},
}

3.3 nsis(桌面应用程序安装过程)配置一览

{ // 一键安装程序、或者辅助安装程序(默认是一键安装)"oneClick": false,// 是否允许请求提升,如果为 false,则用户必须使用提升的权限重新启动安装程序(仅作用于辅助安装程序)"allowElevation": true, // 是否允许修改安装目录(仅作用于辅助安装程序)"allowToChangeInstallationDirectory": true,// 安装程序图标的路径"installerIcon": "public/timg.ico",// 卸载程序图标的路径"uninstallerIcon": "public/timg.ico",// 安装时头部图片路径(仅作用于辅助安装程序)"installerHeader": "public/timg.ico",// 安装时标题图标(进度条上方)的路径(仅作用于一键安装程序)"installerHeaderIcon": "public/timg.ico",// 安装完毕界面图片的路径,图片后缀.bmp,尺寸 164*314(仅作用于辅助安装程序)"installerSidebar": "public/installerSiddebar.bmp",// 开始卸载界面图片的路径,图片后缀.bmp,尺寸 164*314(仅作用于辅助安装程序)"uninstallerSidebar": "public/uninstallerSiddebar.bmp",// 控制面板中的卸载程序显示名称"uninstallDisplayName": "${productName}${version}",// 是否创建桌面快捷方式"createDesktopShortcut": true,// 是否创建开始菜单快捷方式"createStartMenuShortcut": true,// 用于快捷方式的名称,默认为应用程序名称"shortcutName": "TestApp",// NSIS 包含定制安装程序脚本的路径,安装过程中自行调用 (可用于写入注册表 开机自启动等操作)"include": "script/installer.nsi",// 用于自定义安装程序的 NSIS 脚本的路径"script": "script/installer.nsi",// 是否在卸载时删除应用程序数据(仅作用于一键安装程序)"deleteAppDataOnUninstall": false,// 完成后是否运行已安装的应用程序(对于辅助安装程序,应删除相应的复选框)"runAfterFinish": true,// 是否为开始菜单快捷方式和程序文件目录创建子菜单,如果为 true,则使用公司名称"menuCategory": false,
}

3.4 执行打包,安装应用

npm run build

打包成功后,生成的文件都放到了 release 目录下(之前是这么配置的)

双击 exe 结尾的文件,就能运行桌面应用程序了

image-20230112212528749

3.5 主进程接收渲染进程消息时,在控制台输出乱码

加上 chcp 65001 输出中文

加上 cross-env NODE_ENV=development 实现自定义开发时的环境变量

最终 dev 命令如下:

"dev": "chcp 65001 && cross-env NODE_ENV=development vite"

4.实现 渲染进程 / 主进程 通信(IPC)

4.1 让 Vite 支持 ipcRenderer

使用 ipcRenderer 进行通信

默认情况下,Vite 不支持 ipcRenderer,得安装插件 vite-plugin-electron-renderer 让他支持,同时安装了 vite-plugin-electron-renderer

修改 vite.config.ts

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import electron from 'vite-plugin-electron'
import renderer from 'vite-plugin-electron-renderer'export default defineConfig({plugins: [vue(), electron({main: {entry: 'electron/main/index.ts',}}), // Use Node.js API in the Renderer-processrenderer({nodeIntegration: true,}),],build:{emptyOutDir: false,}
})

这样,就实现了让 Vite 支持 ipcRenderer

4.2 渲染进程发送消息,主进程接收消息

渲染进程使用 ipcRenderer.send() 发送消息

在 vue 文件中,添加一个按钮,点击后通过 ipcRenderer 给主进程发消息

import { ipcRenderer } from 'electron'const open = () => {ipcRenderer.send('message', 12321)
}

主进程使用 ipcMain.on() 接收消息

electron/ main/index.ts文件中,引入 ipcMain,监听.vue文件发出的消息

import { app, BrowserWindow, ipcMain } from 'electron'// 这段代码在 createWindow 创建窗口函数内执行
ipcMain.on('message', (_, value) => {console.log(value, '来了')
})

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

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

相关文章

拉格朗日插值及牛顿差商方法的实现(Matlab)

一、问题描述 拉格朗日插值及牛顿差商方法的实现。 二、实验目的 掌握拉格朗日插值和牛顿差商方法的原理,能够编写代码实现两种方法;能够分析多项式插值中的误差。 三、实验内容及要求 利用拉格朗日插值及牛顿差商方法估计1980 年的人口,并…

FreeRTOS_信号量_学习笔记

信号量的特性 消息队列用于传输多个数据,但是有时候我们只需要传递状态,这个状态值需要用一个数值表示。套用队列笔记中的流水线例子,可以理解为流水线上工件的数量。 信号:起通知作用 量:还可以用来表示资源的数量 当…

场景文本检测识别学习 day10(MMdetection)

配置文件(config) 由于在大型项目中,一种模型需要分:tiny、small、big等很多种,而它们的区别主要在网络结构,数据的加载,训练策略等,且差别很多都很小,所以如果每个模型都手动从头写一份&#…

三十、openlayers官网示例解析Double click, Drag and Zoom——第二次点击鼠标拖拽缩放地图效果、取消地图双击放大事件

这篇展示了如何在地图上添加第二次按下鼠标移动鼠标实现拖拽缩放地图效果。 官网demo地址: Double click, Drag and Zoom 官网介绍文字的翻译如下: 示例比较简单,直接贴代码: const map new Map({//添加第二次点击拖拽缩放地图i…

【Postman接口测试】第二节.Postman界面功能介绍(上)

文章目录 前言一、Postman前言介绍二、Postman界面导航说明三、使用Postman发送第一个请求四、Postman 基础功能介绍 4.1 常见类型的接口请求 4.1.1 查询参数的接口请求 4.1.2 表单类型的接口请求 4.1.3 上传文件的表单请求 4.1.4 JSON 类…

vue 展示svg矢量图可缩放拖动

使用插件&#xff1a;svg-pan-zoom <template> <!-- svg图--><div id"svgContainer"></div> </template><script> import svgPanZoom from svg-pan-zoom import svgFile from ../datav/img/220kVscb.svg // 路径根据实际情况调…

go-zero 实战(1)

环境准备 go 版本 go version go1.22.2 linux/amd64 goctl 安装 goctl&#xff08;官方建议读 go control&#xff09;是 go-zero微服务框架下的代码生成工具。使用 goctl 可以显著提升开发效率&#xff0c;让开发人员将时间重点放在业务开发上&#xff0c;其功能有&#xff1a…

关于我转生从零开始学C++这件事:升级Lv.25

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ OK了老铁们&#xff0c;又是一个周末&#xff0c;大伟又来继续给大家更新我们的C的内容了。那么根据上一篇博…

uniapp中使用mockjs模拟接口测试总结(swiper轮播图示例)

完整总结下在uni-app中如何使用Mock.js模拟接口测试&#xff0c;这在后台接口未就绪的情况下非常有用。同时也给出个首页swiper轮播图的mock接口使用。网上的文章都不太完整&#xff0c;这里总结下完整的使用示例&#xff0c;同时也支持h5和小程序平台&#xff0c;分享给需要的…

OrangePi AIpro初体验:开启嵌入式开发之旅

概述 随着物联网和智能设备时代的到来&#xff0c;单板电脑因其独特的优势成为创新项目和教育实践的重要工具。在众多单板电脑中&#xff0c;香橙派以其出色的性能和亲民的价格&#xff0c;十分吸引博主这初涉嵌入式开发的新手。博主有幸被CSDN邀请对OrangePi AIpro进行测评。…

QT学习(20):QStyle和自定义样式

QStyle 样式&#xff08;继承自QStyle类&#xff09;代表控件的绘制并封装GUI的外观。QStyle是一个封装了GUI外观的抽象基类。Qt使用QStyle去执行几乎所有的内置控件的绘制&#xff0c;确保控件外观和原生控件风格风格相同。 class Q_WIDGETS_EXPORT QStyle : public QObject{…

区块链技术和应用二

前言 学习长安链的一些基本原理 官网&#xff1a;长安链开源文档 b站课程&#xff1a;区块链基础与应用 一、共识算法 1.1 POW工作量证明 最长链共识&#xff0c;没听明白 1.2 51%攻击 二、区块链的发展 2.1 区块链1.0到3.0 2.2 共有链、联盟链、私有链 2.3 发展趋势 2.4 扩…

2024年4月—马克思主义基本原理概论真题及答案解析(上海自考)

目录 1.选择题 2.简答题 3.论述题 1.选择题 2.简答题

MagicLens:新一代图像搜索技术和产品形态

MagicLens&#xff1a;Self-Supervised Image Retrieval with Open-Ended Instructions MagicLens: 自监督图像检索与开放式指令 作者&#xff1a;Kai Zhang&#xff0c; Yi Luan&#xff0c; Hexiang Hu&#xff0c; Kenton Lee&#xff0c; Siyuan Qiao&#xff0c; Wenhu …

C# 泛型函数

1.非约束 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace MyGeneirc {public class GeneircMethod{/// <summary>/// 泛型方法解决&#xff0c;一个方法&#xff0c;满足不同参数类型…

我的心情JSP+Servlet+JDBC+MySQL

系统概述 本系统采用JSPServletJDBCMySQL技术进行开发&#xff0c;包括查看我的心情列表&#xff0c; 编辑我的心情信息、新增我的心情。使用方法 将项目从idea中导入&#xff0c;然后配置项目的结构&#xff0c;包括jdk,库&#xff0c;模块&#xff0c;项目&#xff0c;工件…

他用AI,抄袭了我的AI作品

《大话西游》里面有一句经典台词&#xff1a;每个人都有一个妈&#xff0c;但是“你妈就一定是你妈吗&#xff1f;” 用AI创作的艺术作品&#xff0c;也走进类似的困境&#xff1a;如何证明你用AI生成的作品&#xff0c;就是你的作品&#xff1f; 近日&#xff0c;腾讯科技独…

信息学奥赛初赛天天练-14-阅读程序-字符数组、唯一分解定理应用

更多资源请关注纽扣编程微信公众号 1 2019 CSP-J 阅读程序1 (程序输入不超过数组或字符串定义的范围&#xff1b;判断题正确填√,错误填&#xff1b;除特殊说明外&#xff0c;判断题1.5分&#xff0c;选择题3分&#xff0c;共计40分) 1 输入的字符串只能由小写字母或大写字母组…

Rust最新版安装(v1.78.0+)

系统&#xff1a;Windows 11 专业版 23H2rustc&#xff1a;1.78.0 配置环境变量和设置配置文件 新建文件夹“C:\Rust\Rustup”和“C:\Rust\Cargo”。【以管理员身份运行】打开CMD 设置系统环境变量&#xff0c;如下设置RUSTUP_DIST_SERVER&#xff0c;其余同理 C:\Windows\S…

shell脚本的基础应用

规范脚本的构成 #&#xff01;/bin/bash # 注释信息 可执行的语句 执行脚本的方法 有1.添加x权限 ,绝对路经&#xff0c;或者相对路径2. 使用解释器 不需加x,root...bash...bash..echo 3,用source&#xff0c; 开机root ...bash ...echo bash -x /opt/test01.sh &#xff…