Vue3 Vite electron 开发桌面程序

Electron是一个跨平台的桌面应用程序开发框架,它允许开发人员使用Web技术(如HTML、CSS和JavaScript)构建桌面应用程序,这些应用程序可以在Windows、macOS和Linux等操作系统上运行。

Electron的核心是Chromium浏览器内核和Node.js运行时环境。Chromium内核提供了现代浏览器的功能,例如HTML5和CSS3支持,JavaScript引擎等,而Node.js运行时环境则提供了服务器端JavaScript的能力和模块系统,这使得开发人员可以使用Node.js的模块和工具来构建桌面应用程序。

Electron 案例

  1. Visual Studio Code:由Microsoft开发的跨平台代码编辑器,支持多种编程语言和插件扩展。使用Electron和TypeScript构建。
  2. Atom:由GitHub开发的跨平台代码编辑器,支持多种编程语言和插件扩展。使用Electron和CoffeeScript构建。
  3. Postman:由Postman Inc.开发的API测试和开发工具,允许用户轻松地测试和调试REST API。使用Electron和React构建。

image.png

创建项目 dev

# 创建Vue项目npm init vue 
# 安装依赖
npm install
# 一定要安装成开发依赖
npm install electron electron-builder -D 
# 安装超时 请使用某宝镜像 或者XX上网
npm config set electron_mirror=https://registry.npmmirror.com/-/binary/electron/

开发环境启动electron

我们希望npm run dev的时候直接把electron也启动起来而不是开两个启动一次vite再启动一次electron

第一步我们需要先建立一个文件夹

在根目录创建一个plugins编写vite插件帮我们启动electron

  • plugins
    • vite.electron.dev.ts //编写electron开发模式
    • vite.electron.build.ts //打包electron项目
  • index.html
  • src
    • main.ts
    • App.vue
    • background.ts //手动创建文件用于编写electron
  • package.json
  • tsconfig.json
  • vite.config.ts

background.ts

import { app, BrowserWindow } from 'electron'// 等待Electron应用就绪后创建BrowserWindow窗口
app.whenReady().then(async () => {const win = await new BrowserWindow({width: 800,height: 600,// 配置窗口的WebPreferences选项,用于控制渲染进程的行为webPreferences: {nodeIntegration: true, // 启用Node.js集成contextIsolation: false, // 禁用上下文隔离webSecurity: false, // 禁用web安全策略}})// 根据命令行参数加载URL或本地文件if (process.argv[2]) {win.loadURL(process.argv[2])} else {win.loadFile('index.html')}
})

这段代码创建了一个Electron应用程序的入口文件。该文件使用了Electron的appBrowserWindow模块来创建一个窗口。在应用程序准备就绪后,它会创建一个新的BrowserWindow对象,并将其设置为800x600像素的大小。窗口的webPreferences选项用于配置渲染进程的行为,例如启用Node.js集成、禁用上下文隔离和web安全策略等。

接着,该代码检查命令行参数,如果有参数则加载URL,否则加载本地文件index.html。在开发模式下,可以将URL指向本地的开发服务器,以便实现热更新和实时调试。在生产模式下,需要将URL指向本地的index.html文件,以便在本地运行Electron应用程序。

在这段代码中,app.whenReady()函数用于在Electron应用程序准备就绪后执行回调函数。该函数返回一个Promise对象,可以使用async/await语法来等待应用程序就绪后执行其他操作。在这个例子中,我们使用await关键字来等待BrowserWindow对象的创建完成。

vite.electron.dev.ts

// 导入需要使用的类型和库
import type { Plugin } from 'vite'
import type { AddressInfo } from 'net'
import { spawn } from 'child_process'
import fs from 'fs'// 导出Vite插件函数
export const viteElectronDev = (): Plugin => {return {name: 'vite-electron-dev',// 在configureServer中实现插件的逻辑configureServer(server) {// 定义初始化Electron的函数const initElectron = () => {// 使用esbuild编译TypeScript代码为JavaScriptrequire('esbuild').buildSync({entryPoints: ['src/background.ts'],bundle: true,outfile: 'dist/background.js',platform: 'node',target: 'node12',external: ['electron']})}// 调用初始化Electron函数initElectron()// 监听Vite的HTTP服务器的listening事件server?.httpServer?.once('listening', () => {// 获取HTTP服务器的监听地址和端口号const addressInfo = server?.httpServer?.address() as AddressInfoconst IP = `http://localhost:${addressInfo.port}`// 启动Electron进程let electronProcess = spawn(require('electron'), ['dist/background.js', IP])// 监听主进程代码的更改fs.watchFile('src/background.ts', () => {// 杀死当前的Electron进程electronProcess.kill()// 重新编译主进程代码并重新启动Electron进程initElectron()electronProcess = spawn(require('electron'), ['dist/background.js', IP])})// 监听Electron进程的stdout输出electronProcess.stdout?.on('data', (data) => {console.log(`日志: ${data}`);});})}}
}

configureServer是Vite的一个插件钩子函数,用于在Vite开发服务器启动时执行一些自定义逻辑。该函数接受一个ServerOptions对象作为参数,该对象包含有关当前Vite服务器的配置信息。在这个钩子函数中,您可以访问Vite服务器的HTTP服务器对象(httpServer),WebSocket服务器对象(wsServer)和Vite的构建配置对象(config)等。您可以使用这些对象来实现各种功能,例如自定义路由、添加中间件、实现实时重载和调试等。

esbuild.buildSync()

  • entryPoints:指定要编译的入口文件,这里是src/background.ts
  • bundle:指定是否打包所有依赖项,这里是true,表示需要打包所有依赖项。
  • outfile:指定输出文件的路径和名称,这里是dist/background.js
  • platform:指定编译的目标平台,这里是node,表示编译为Node.js可用的代码。
  • target:指定编译的目标JavaScript版本,这里是node12,表示编译为Node.js 12及以上版本可用的代码。
  • external:指定不需要被打包的外部依赖项,这里是['electron'],表示electron模块不需要被打包。

在这段代码中,esbuild会将src/background.ts文件编译为JavaScript 并且放入dist

fs.watch 主要实现热更新
每次background.ts 修改完成就会重新启动electron进程

image.png

vite.electron.build.ts

import type { Plugin } from 'vite'
import * as electronBuilder from 'electron-builder'
import path from 'path'
import fs from 'fs'// 导出Vite插件函数
export const viteElectronBuild = (): Plugin => {return {name: 'vite-electron-build',// closeBundle是Vite的一个插件钩子函数,用于在Vite构建完成后执行一些自定义逻辑。closeBundle() {// 定义初始化Electron的函数const initElectron = () => {// 使用esbuild编译TypeScript代码为JavaScriptrequire('esbuild').buildSync({entryPoints: ['src/background.ts'],bundle: true,outfile: 'dist/background.js',platform: 'node',target: 'node12',external: ['electron'],})}// 调用初始化Electron函数initElectron()// 修改package.json文件的main字段 不然会打包失败const json =  JSON.parse(fs.readFileSync('package.json', 'utf-8')) json.main = 'background.js'fs.writeSync(fs.openSync('dist/package.json', 'w'), JSON.stringify(json, null, 2))// 创建一个空的node_modules目录 不然会打包失败fs.mkdirSync(path.join(process.cwd(), "dist/node_modules"));// 使用electron-builder打包Electron应用程序electronBuilder.build({config: {appId: 'com.example.app',productName: 'vite-electron',directories: {output: path.join(process.cwd(), "release"), //输出目录app: path.join(process.cwd(), "dist"), //app目录},asar: true,nsis: {oneClick: false, //取消一键安装}}})}}
}

打包主要依靠electron-builder 这个库 他的参数是有很多的这儿只是简单演示

closeBundle 我们electron打包是需要index.html 所以我们先等vite打完包之后vite会自动调用这个钩子 然后在这个钩子里面打包electron

vite.config.ts

import { fileURLToPath, URL } from 'node:url'import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import {viteElectronDev} from './plugins/vite.electron.dev'
import {viteElectronBuild} from './plugins/vite.electron.build'
// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),viteElectronDev(),viteElectronBuild()],base:'./', //默认绝对路径改为相对路径 否则打包白屏resolve: {alias: {'@': fileURLToPath(new URL('./src', import.meta.url))}}
})

image.png

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

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

相关文章

Vol的学习

首先学习基础用法 1.查看系统基本信息 vol.py -f 路径 imageinfo 2.查看进程命令行 vol.py -f 路径 --profile系统版本 cmdline vol.py -f 路径 --profile版本 cmdscan 3.查看进程信息 vol.py -f 路径 --profile系统 pslist 通过树的方式返回 vol.py -f 路径 --profile系统…

HDFS架构刨析

HDFS架构刨析 概述HDFS架构图整体概述主角色:namenodefsimage内存元数据镜像文件edits log(Journal)编辑日志 从角色:datanode主角色辅助角色:secondarynamenode 重要特性主从架构分块存储机制副本机制namespace元数据…

新一代图像合成模型:Stable Diffusion XL(SDXL)上线!

几个使用Stable Diffusion XL 1.0生成的图像示例。 新的SDXL 1.0发布允许在本地计算机上运行的高分辨率人工智能图像合成。 周三,Stability AI发布了其下一代开源权重人工智能图像合成模型Stable Diffusion XL 1.0(SDXL)。它可以根据文本描述…

STM32CUBUMX配置RS485 modbus STM32(从机)亲测可用

———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动&#x…

【VUE】解决图片视频加载缓慢/首屏加载白屏的问题

1 问题描述 在 Vue3 项目中,有时候会出现图片视频加载缓慢、首屏加载白屏的问题 2 原因分析 通常是由以下原因导致的: 图片或视频格式不当:如果图片或视频格式选择不当,比如选择了无损压缩格式,可能会导致文件大小过大…

青蛙过河 [递推法]

青蛙过河 [递推法] 题目描述输入输出样例输入样例输出样例 递推解答A C 代码 题目描述 有一条河,左边一个石墩( A A A区)上有编号为 1 , 2 , 3 , 4 , … , n 1,2,3,4&am…

Django实现音乐网站 ⑵

使用Python Django框架制作一个音乐网站,在系列文章1的基础上继续开发,本篇主要是后台歌手表模块开发。 目录 表结构设计 歌手表(singer)结构 创建表模型 设置图片上传路径 创建上传文件目录 生成表迁移 执行创建表 后台管…

刷题笔记 day5

力扣 202 快乐数 首先来分析什么样的数是快乐数, 解题思路: 1)定义快慢指针 ; 2)快指针走两步,慢指针走一步 ;3)两个指针相遇时判断相遇的数值是否为1。 怎样处理 取各分位数的平…

软考A计划-系统集成项目管理工程师-信息文档和配置管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

【计算机视觉中的 GAN 】如何稳定GAN训练(3)

一、说明 在上一篇文章中,我们达到了理解未配对图像到图像翻译的地步。尽管如此,在实现自己的超酷深度GAN模型之前,您必须了解一些非常重要的概念。如本文所提的GAN模型新成员的引入:Wasserstein distance,boundary eq…

四、JVM-对象内存模型

Java对象内存模型 一个Java对象在内存中包括3个部分:对象头、实例数据和对齐填充 数据 内存 – CPU 寄存器 -127 补码 10000001 - 11111111 32位的处理器 一次能够去处理32个二进制位 4字节的数据 64位操作系统 8字节 2的64次方的寻址空间 指针压缩技术 JDK1.6出…

尝试多数据表 sqlite

C 唯一值得骄傲的地方就是 通过指针来回寻址 😂 提高使用的灵活性 小脚本buff 加成

【计算机视觉 | 目标检测 | 图像分割】arxiv 计算机视觉关于目标检测和图像分割的学术速递(7 月 17 日论文合集)

文章目录 一、检测相关(5篇)1.1 TALL: Thumbnail Layout for Deepfake Video Detection1.2 Cloud Detection in Multispectral Satellite Images Using Support Vector Machines With Quantum Kernels1.3 Multimodal Motion Conditioned Diffusion Model for Skeleton-based Vi…

从录取成绩的角度来看,浙大MPA面试的客观公正性是有一定依据的

时间即将来到八月份!不知道目前考生们今年的备考情况怎么样了,度过比较煎熬的三伏天,距离考研冲刺的时间越来越近! 提前批面试申请对于不同的项目以及不同的考生意义都不一样。比如真正的学霸人物对于提面的申请与不申请一般差别不…

关于K8s的Pod的详解(一)

关于K8s的Pod的详解(一) Pod和API server的通信加快Pod启动更改Pod的资源Pod 的持久卷的单个访问模式Pod 拓扑分布约束Pod 拓扑分布中的最小域数 Pod 作为k8s创建,调度,管理的基本单位。由上级的Controller对Node上安装的Kubelet发…

Pytorch深度学习之余弦退火学习率设置

1. 什么是余弦退火学习率? 余弦退火学习速率调度是改进深度神经网络学习过程的常用方法。当深度神经网络在大型数据集上训练时,它尤其有用,因为在大型数据集中,学习过程可能会陷入局部极小值。在训练过程中,学习率以不…

MongoDB文档--架构体系

阿丹: 在开始学习先了解以及目标知识的架构体系。就能事半功倍。 架构体系 MongoDB的架构体系由以下几部分组成: 存储结构:MongoDB采用文档型存储结构,一个数据库包含多个集合,一个集合包含多个文档。存储形式&#…

C语言假期作业 DAY 01

题目 1.选择题 1、执行下面程序,正确的输出是( ) int x5,y7; void swap() { int z; zx; xy; yz; } int main() { int x3,y8; swap(); printf("%d,%d\n",x, y)…

ZooKeeper原理剖析

1.ZooKeeper简介 ZooKeeper是一个分布式、高可用性的协调服务。在大数据产品中主要提供两个功能: 帮助系统避免单点故障,建立可靠的应用程序。提供分布式协作服务和维护配置信息。 2.ZooKeeper结构 ZooKeeper集群中的节点分为三种角色:Le…

自动驾驶感知系统-全球卫星定位系统

卫星定位系统 车辆定位是让无人驾驶汽车获取自身确切位置的技术,在自动驾驶技术中定位担负着相当重要的职责。车辆自身定位信息获取的方式多样,涉及多种传感器类型与相关技术。自动驾驶汽车能够持续安全可靠运行的一个关键前提是车辆的定位系统必须实时…