Electron+Vue3整合-开发时整合-全部ts开发 + 一条命令启动vue3和electron两个服务

说明

本文介绍一下 Electron + Vue3 的整合的中级操作。

实现的效果是 :
1、一个正常的Vue3项目;
2、整合加入 Electron 框架 :
	 开发时只执行一条命令,启动 vue 项目 后 再启动 electron;
	 electron 的开发使用 typescript;
	 支持 electron 的 ts 文件修改的热更新,无需重新启动服务。
注意 : 
	本文中的electron 使用的是 ts 的方式进行开发的;
	因此,在执行electron 项目之前,需要先将它的 ts 编译成 js,然后运行electron。

步骤一:创建vue3项目

常规操作,不再赘述。

# 创建项目
npm create vue@latest

# 进入到项目目录
cd <your project dir>

# 安装依赖
npm install

# 启动访问
npm run dev

正经的vue项目启动成功!

在这里插入图片描述

此时的项目目录结构如下:是一个标准的vue3的项目结构

projectName
	| -- node_modules     # 依赖包的位置
	| -- public                   # 一些静态资源
	| -- src                       # 源文件目录
	| -- .gitignore             # git忽略配置文件 
	| -- env.d.ts            
	| -- index.html           # vue主页面
	| -- package.json      # 项目配置文件
	| -- tsconfig.json       # typescript 配置文件
	| -- vite.config.ts       # vite 配置文件

步骤二 :引入Electron

1、安装Electron

# 安装Electron
npm install --save-dev electron

# 安装 esbuild ,编译文件时会用到
npm install --save-dev esbuild

2、项目根目录下创建一个electron的工作目录

# 进入到项目的根目录
cd <your project name>

# 创建electron目录
mkdir electron

3、在electron目录下创建主进程 electronMain.ts 文件

主要干了两个事儿 : 1.创建主窗口;2.接收【插件】参数,加载vue的页面进来。
此时,窗口加载的页面是动态的,会根据【步骤三】定义的插件传过来的参数进行加载。


/**
 * electron 的主进程
 */

// 导入模块
const { app, BrowserWindow  } = require('electron')

const path = require('node:path')

// 创建主窗口
const createWindow = () => {
  const win = new BrowserWindow({
    width: 800,
    height: 600,
  })


  //  ********** 核心操作: 加载当前vue 的地址 ********** 
  let devUrl = process.argv[2]
  if(devUrl){ // 存在路径,则证明是开发环境,直接加载
    win.loadURL(devUrl)
  }else{ // 不存在路径,则我们先默认加载百度吧
    win.loadURL('https://www.baidu.com')
  }
 
}

// 应用准备就绪,加载窗口
app.whenReady().then(() => {
    createWindow()

    // mac 上默认保留一个窗口
    app.on('activate', () => {
        if (BrowserWindow.getAllWindows().length === 0) createWindow()
    })

    console.log('--- app ready ---')
})

// 关闭所有窗口 : 程序退出 : windows & linux
app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') app.quit()
})


步骤三 : 自定义插件(重点)

本插件的功能:
1、先对 electron 的 ts 文件执行编译;
2、获取 vue 项目的页面访问端口,组装完整的页面访问路径;
3、将完整的页面访问路径传递给electron主进程;
4、启动electron住进程,加载vue的页面。

1、新建插件目录

# 进入到项目的根目录
cd <your project name>

# 创建插件目录
mkdir plugins

2、新建插件文件

插件文件名称为 : vite.electron.dev.ts

插件的主要功能 :
1、编译electron的ts文件为 js 文件;
2、监听 vite 服务启动;
3、组装 vue3 服务的页面访问地址;
4、使用 spawn 的方式,将组装的地址传递给electron主进程;
5、监听electron 的文件变动,实现热更新。

插件的内容基本确定,可以直接copy使用。
// 开发环境插件

import type { Plugin } from "vite";

import type { AddressInfo } from "net";

// 引入子进程:node 中的进程传参数法
import { ChildProcess, spawn } from "child_process";
// 引入 electron 
import electron from 'electron';

// 引入 文件模块
import fs from 'fs'
// 引入esbuild,把 electron 的 ts 打包成 js 
import { BuildResult, buildSync } from "esbuild";

// 手动定义一个方法,用于进行打包的工作
const electronBuild2Js = () => {

    // 每次都先删除target目录,然后执行新的编译动作
    let targetExistFlag = fs.existsSync('targetdev')
    if(targetExistFlag){
        console.log('targetdev目录存在,执行删除')
        fs.rmSync('targetdev',{recursive:true})
    }else{
        console.log('targetdev目录不存在,无需删除')
    }

    // 把electron 的 入口 ts 文件进行打包操作
    let buildRes :BuildResult =  buildSync({
        entryPoints:['electron/**/*.ts','electron/**/*.js'],
        bundle:true,
        outdir:'targetdev/electron',
        // outfile:'target/electron/electronMain.js',
        platform:'node',
        target:'node20',
        external:['electron']
    })

    console.log('编译 electron ts 文件结果 : ',buildRes)
}

// 插件函数
export const ElectronDevPlugin = ():Plugin =>{
    return{
        name:'electron-dev-plugin',
        // 配置服务的钩子,比较有用
        configureServer(server){
            
           // 打包
           electronBuild2Js();
          
            // 监听这个服务,可以获取到服务相关的信息
            server.httpServer?.on('listening',()=>{
                const addressInfo:AddressInfo = server.httpServer?.address() as AddressInfo;
                console.log('服务的信息 : ',addressInfo)
                console.log('服务的端口 : ',addressInfo.port)
                // 拼接一下当前服务的完整地址,传递给Electron 启动服务的时候使用
                const devUrl = `http://localhost:${addressInfo.port}`
                console.log('服务的完整地址 : ',devUrl)

                // 把服务启动的信息,当作参数,传递给electron的进程中
                // 执行 electron 命令,启动一个窗口,且 日志标准重定向到 主程序的控制台中
                let  electronProcess = spawn(electron,['target/electron/electronMain.js',devUrl],{ stdio: 'inherit' }) as ChildProcess

                // 监听 electron 的文件是否有改变,如果有,则自动更新一下
                fs.watch('electron',()=>{
                    console.log(' electron 的文件发生改变了')
                    // 先将之前的electron进程关闭
                    electronProcess.kill()
                    // 在重新打包一下
                    electronBuild2Js()
                    // 最后重新启动一下
                    electronProcess = spawn(electron,['target/electron/electronMain.js',devUrl],{ stdio: 'inherit' }) as ChildProcess

                })
                
            })
        }
    }
}

3、在vite配置文件中引入插件

vite 的配置文件是 vite.config.mts
在该文件中添加上述自定义的插件。
文件内容节选如下:

import { defineConfig } from 'vite'

// 导入自定义的插件
import {ElectronDevPlugin} from './plugins/vite.electron.dev'

export default defineConfig({
  // 插件配置
  plugins: [
    ...
    ElectronDevPlugin()
  ],
   
   // 。。。其他的配置内容

})

4、在tsconfig配置文件中添加包含

添加自定义插件 ts 文件的包含配置,否在,在 vite.config.mts 文件中引入时有错误提示。
tsconfig的配置文件是 : tsconfig.node.json
主要修改的内容如下:

{
  "extends": "@tsconfig/node20/tsconfig.json",
  "include": [
    "vite.config.*",
    "vitest.config.*",
    "cypress.config.*",
    "nightwatch.conf.*",
    "playwright.config.*",
    "plugins/**/*"   // 就是添加了这一行
  ],
  
  // 其他的常规配置
}

步骤四 : 修改 package.json 文件脚本

主要是 :
1.配置 启动脚本 , 此时实际上就是一个普通的 vite 命令
启动完成 vue 项目后,通过我们自定义的插件,再启动electron服务;
4.删除文件中的 type:“module” 行,否则会有一个警告!

{
  "name": "electron03vuetest01",
  "version": "1.0.0",
  "private": true,
  
  "scripts": {
    "devall":"vite", // 我们自定义的脚本命令,一键启动
    // 其他的脚本命令 。。。
  },

  // 其他的依赖 等配置信息
}

步骤五 : 启动测试

在命令行中,直接执行命令 :

npm run devall

效果:
1、vite 正常启动 vue3 项目;
2、electron 的 ts 文件被成功编译;
3、electron 启动成功,窗体展示成功。

启动日志如下 :


> electron-vue@0.0.0 devall
> vite & electron .

targetdev目录存在,执行删除
▲ [WARNING] The glob pattern "electron/**/*.js" did not match any files [empty-glob]

编译 electron ts 文件结果 :  {......}
服务的信息 :  { address: '127.0.0.1', family: 'IPv4', port: 5178 }
服务的端口 :  5178
服务的完整地址 :  http://localhost:5178

  VITE v5.2.9  ready in 167 ms

  ➜  Local:   http://localhost:5178/
  ➜  Network: use --host to expose

运行效果 : electron 启动成功且加载vue页面成功!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Office疑难杂症-Word页码重复无法修改

在现代办公环境中&#xff0c;Microsoft Office 套件扮演着不可或缺的角色&#xff0c;尤其是 Word 文档处理软件&#xff0c;在日常生活和工作中的应用广泛。然而&#xff0c;即使是这样成熟的软件&#xff0c;也不免有一些令人头疼的技术问题。本文将详细介绍如何解决Word中页…

深度学习之图像分割从入门到精通——基于unet++实现细胞分割

模型 import torch from torch import nn__all__ [UNet, NestedUNet]class VGGBlock(nn.Module):def __init__(self, in_channels, middle_channels, out_channels):super().__init__()self.relu nn.ReLU(inplaceTrue)self.conv1 nn.Conv2d(in_channels, middle_channels, …

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测

回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测 目录 回归预测 | Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BO-RF贝叶斯优化随机森林多变量回归预测&#xff1b; 2.输入7个特征&#xf…

互联网技术知识点总览——数据库知识点框架

简介 本文对数据库的知识点整体框架进行梳理和分享如下&#xff1a;

Vue3+TS版本Uniapp:封装uni.request请求配置

作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 封装请求配置项 封装拦截器封装uni.request 封装拦截器 uniapp的封装逻辑不同于Vue3项目中直接使用axios.create()方法创建实例&#xff08;在create方法中写入请求…

Oracle中的视图

1- 什么是视图 视图是一个虚拟表 视图是由sql查询语句产生的 视图真实存在 但是不存储数据 视图中的数据 只是对 基表(源数据表) 中的数据的引用 总的来说 视图可以简化数据 用户&#xff0c;订单&#xff0c;物流 三个表进行关联 吧很复杂的sql查询语句存储成一个视图 …

【 AIGC 研究最新方向(下)】面向平面、视觉、时尚设计的高可用 AIGC 研究方向总结

目前面向平面、视觉、时尚等设计领域的高可用 AIGC 方向有以下 4 种&#xff1a; 透明图层生成可控生成图像定制化SVG 生成 本篇&#xff08;下篇&#xff09;介绍 3、4&#xff0c;上篇在&#xff1a;https://blog.csdn.net/weixin_44212848/article/details/138035279?spm…

CSS——高级选择器

层次的选择器&#xff1a; <1> 后代选择器&#xff1a; 格式&#xff1a; 标签1 标签2{} 解释&#xff1a; 标签1 不生效&#xff0c;被标签1 嵌套中的 标签2才生效 举例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charse…

JVM常见的垃圾回收器

1、回收方法区&#xff1a; 方法区回收价值很低&#xff0c;主要回收废弃的常量和无用的类。 方法区中的存储&#xff1a; 方法区中存储的是加载的类的信息&#xff0c;常量&#xff0c;静态变量&#xff0c;即时编译后的代码等数据&#xff0c;所以回收的对象也就是这些内…

go+react实现远程vCenter虚拟机管理终端

文章目录 React-VcenterDemoQuick Start React-Vcenter 基于go & react实现远程vSphere vcenter虚拟机终端console页面&#xff0c;提供与vcenter管理中的Launch Web Console相同的功能。 项目地址&#xff1a;react-vcenter Demo URL: http://localhost:3000 Quick St…

【leetcode面试经典150题】66. 分隔链表(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

第24天:安全开发-PHP应用文件管理模块显示上传黑白名单类型过滤访问控制

第二十四天 一、PHP文件管理-显示&上传功能实现 如果被抓包抓到数据包&#xff0c;并修改Content-Type内容 则也可以绕过筛查 正常进行上传和下载 二、文件上传-$_FILES&过滤机制实现 无过滤机制 黑名单过滤机制 使用 explode 函数通过点号分割文件名&#xff0c;…

基于Java+SpringBoot+Mybaties-plus+Vue+elememt 小区物业管理系统 的设计与实现

一.项目介绍 系统分为管理员 和 业主 两块&#xff1a; 管理员点击进入到系统操作界面&#xff0c;可以对首页、业主信息管理、管理员信息管理、 楼栋和房屋信息管理、物业费管理、地下停车位管理、公告信息管理、报修信息管理、 投诉管理以及个人信息等功能模块 …

温湿度LCD显示并上传服务器

项目需求 通过温湿度传感器将值传到LCD1602&#xff0c;并实时通过蓝牙透传到手机。 硬件介绍 温湿度传感器 DHT11温湿度传感器 DHT11_温湿度传感器数据格式-CSDN博客 LCD1602LCD1602-CSDN博客 HC-01 继电器模块 硬件接线 LCD1602 D0~D7 --> A0~A7VDD, A --> 5v…

MercadoLibre(美客多)入仓预约系统操作流程-自动化约号(开篇)

目录 一、添加货件信息 二、输入货件信息 三、选择发货 四、填写交货日期 五、注意事项 MercadoLibre&#xff08;美客多&#xff09;于2021年10月18号上线了新预约入仓系统&#xff0c;在MercadoLibre美客多平台上&#xff0c;新入仓预约系统是一项非常重要的功能&#x…

23种设计模式之抽象工厂

简单工厂和工厂方法 关注 产品等级 抽象工厂 关注 产品族 对于比较稳定的产品&#xff0c;抽象工厂更有效率&#xff08;一个工厂生产很多产品族&#xff09; 抽象工厂代码例子加深理解

探索UWB模块的潜力:智能家居与物联网的连接者

UWB模块具有精准定位、快速响应、低能耗等特点&#xff0c;在智能家居领域展现出了巨大的潜力&#xff0c;正逐渐成为智能家居与物联网的重要连接者。本文将探讨UWB模块在智能家居与物联网中的关键作用、应用场景以及未来发展趋势&#xff0c;旨在为推动智能家居技术的创新和发…

Springboot的Test单元测试操作

Springboot的Test单元测试操作 简单总结需要操作的步骤 1&#xff0c;导入依赖 2&#xff0c;创建目录&#xff08;目录和启动类的目录保持一致&#xff09; 3&#xff0c;添加注解 4&#xff0c;写方法测试 1&#xff0c;导入依赖 <dependency><groupId>org.spri…

C++修炼之路之多态---多态的原理(虚函数表)

目录 一&#xff1a;多态的原理 1.虚函数表 2.原理分析 3.对于虚表存在哪里的探讨 4.对于是不是所有的虚函数都要存进虚函数表的探讨 二&#xff1a;多继承中的虚函数表 三&#xff1a;常见的问答题 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗--…

(51单片机)第十一章-串行口应用提高

11.1 方式0应用 在第6章中&#xff0c;已经对51单片机的串行口结构做过详细介绍&#xff0c;并且通过实例讲解了串行口的4种工作方式中方式1的具体用法&#xff0c;本节详细讲述串行口方式0的用法。 串行口方式0被称为同步移位寄存器的输入/输出方式&#xff0c;主要用于扩展并…