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

news2024/12/24 22:14:02

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 packaged
    win.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-process
  renderer({
    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.coloradmin.cn/o/1709783.html

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

相关文章

网络工程师---第四十三天

1、网络地址转换请简述DNS服务器迭代查询与递归的区别? 2、请从技术方面简述RAIDO、RAID1、RAID3、 RAID5的特点? 3、请从层次结构、部署设备和功能配置方面描述层次化的网络结构? 4、请简述IPSECVPN和AH和ESP的区别? 5、请简述ID…

5G工业数采网关是什么?天拓四方

随着工业4.0时代的到来,数字化、网络化、智能化成为工业发展的新趋势。在这个过程中,5G工业数采网关作为一种关键设备,发挥着越来越重要的作用。本文将详细解析5G工业数采网关是什么,以及它在工业领域中的应用和重要性。 一、5G工…

Android Graphics图形栈SurfaceFlinger之间各种Layer以及对应Buffer之间的关系

Android Graphics图形栈SurfaceFlinger之间各种Layer以及对应Buffer之间的关系 SurfaceFlinger layer之间的对应关系

云衔科技:为什么推荐使用zoho crm客户管理系统?

在当今快速变化的商业环境中,企业对高效、智能化的客户关系管理(CRM)系统的需求日益增长。Zoho CRM,作为全球领先的企业级CRM解决方案提供商,凭借其全面的功能、高度的可定制性、以及无缝集成的生态系统,成…

4、xss-labs之level4、lecel5

一、level4 1、测试分析 level4跟之前的3一样的思路,闭合value的值,但是通过双引号闭合,然后使用onclick的属性弹窗绕过 输入3的payload: 2、所以构造payload payload:"οnclickalert(1)// 二、level5 1、测…

适用于Android的最佳数据恢复软件

如果您的 Android 设备崩溃,您需要找到一种方法来取回您的数据。幸运的是,有许多数据恢复程序可以帮助您恢复丢失的文件。有些是免费的,而另一些则需要付费。这是适用于Android设备的最佳数据恢复软件列表。 什么是数据恢复软件? …

基于盲源分离和半盲源分离的心电信号伪影消除方法(MATLAB 2018)

心电信号是通过测量放置在人体皮肤上的电极之间的电位差来获取的,其本身具有信号微弱、频段低、不稳定等特性。因此ECG信号在实际采集时极易受到不同噪声的影响,这会造成心电图本身的波形形态特征的失真,从而导致错误诊断和对患者的不当治疗。…

新建一个esri_sde_gists的服务

需求 新建一个esri_sde_gists的服务 步骤: 需要拷贝ora11gexe目标为新的目录,例如ora11gexe_gists 运行drivers找到etc下面的services文件,添加端口5152: 检查sde的library并创建: CREATE or REPLACE LIBRARY ST_S…

数据驱动的UI艺术:智能设计的视觉盛宴

数据驱动的UI艺术:智能设计的视觉盛宴 引言 在当今这个数据泛滥的时代,大数据不仅仅是一种技术手段,它更是一种艺术形式。当大数据遇上UI设计,两者的结合便催生了一种全新的艺术形式——数据驱动的UI艺术。本文将探讨如何将数据…

python内存马学习

python内存马学习 python内存马学习 python内存马学习环境搭建和复现分析payloadFlask 请求上下文管理机制bypass高版本flask内存马的利用before_request**after_request** teardown_requesterrorhandler相关例题H&NCTF 2024 ezFlask python内存马 环境搭建和复现 from fl…

go defer

type _defer struct {siz int32started boolopenDefer boolsp uintptrpc uintptrfn *funcval_panic *_paniclink *_defer }runtime._defer 结构体是延迟调用链表上的一个元素,所有的结构体都会通过 link 字段串联成链表。 只…

【区块链】外部应用程序与区块链进行交互

一,外部应用程序与区块链进行交互案例目标与流程 1.1案例目标 掌握FISCO BCOS应用环境的搭建 与使用(FISCO BCOSWeBASE)掌握基于Java SpringBoot的应 用程序后端项目搭建与开发。掌握应用程序后端与FISCO BCOS 链的交互。掌握应用程序前端…

二叉树(概念详解)

目录 树树的概念完全二叉树和满二叉树完全二叉树存储完全二叉树用数组存储堆 树 树是一种非线性的数据结构 树是根朝上的,叶子是朝下的 树是递归定义的【根N棵子树】 递归定义:大事化小,可以理解为套娃 树的子树之间是独立的,所…

【p-seamless-scroll】一个创建无缝滚动效果的 js 插件

p-seamless-scroll (github:https://github.com/pbstar/p-seamless-scroll)是一个创建无缝滚动效果的 js 插件。它有着轻量且高效的特性,支持丰富的自定义配置选项,提供了一系列 API 方法以及事件监听功能。 特点 丰…

【uniapp】uniapp页面介绍

目录 开发工具:HBuilderX介绍特点和功能 页面简介页面管理新建页面删除页面页面改名pages.json 设置应用首页 页面内容构成template模板区script 脚本区export default 外的代码export default 里的代码 style样式区 页面生命周期Vue2 页面及组件生命周期流程图Vue3…

养猫这5个必备神器你还没用?宠物空气净化器吸毛效果惊人!

养猫的铲屎官们,你们是否经常为家里的猫毛和异味感到困扰?尽管养猫能带来许多欢乐,但随之而来的猫毛和气味问题确实让人头疼。今天,我将为大家介绍养猫的五个必备神器,特别是宠物空气净化器,它在吸毛和去除…

官宣!马斯克的xAI获60亿美元融资,估值240亿美元

5月27日晚,马斯克旗下的大模型平台xAI在官网宣布获得60亿美元B轮融资,估值240亿美元。本次主要投资者包括Valor Equity Partners、红杉资本、国王控股、沙特王子-Bin Talal、Vy Capital等。 这也是大模型赛道史上最高单笔融资之一,超过Anthr…

Spring:事务(tx)

1. 简介 spring对jdbc进行封装&#xff0c;简化对数据库的操作 2. HelloWorld 1. 搭建模块 2.加入依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dependency><groupId>org.springframework</groupId><artifactId>s…

基于ERNIE Bot SDK开发智趣灯谜会游戏

项目背景 猜灯谜是中国传统节日元宵节中一种深受人们喜爱的民间游戏&#xff0c;它集趣味性、知识性和艺术性于一体&#xff0c;是中华文化的重要组成部分。猜灯谜&#xff0c;顾名思义&#xff0c;就是通过解读谜面来猜测谜底&#xff0c;谜底通常是各种物品、现象或概念。 猜…

驱动未来:IT行业的现状与发展趋势

前言 随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。本文将探讨IT行业的现状和未来发展趋势&#xff0c;并邀请行业领袖、技术专家和…