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

news2024/12/23 2:49:52

说明

本文介绍一下 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页面成功!

在这里插入图片描述

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

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

相关文章

经典机器学习算法——决策树

优质博文&#xff1a;IT-BLOG-CN 树模型是机器学习中最常用的一类模型&#xff0c;包括随机森林、AdaBoost、GBDT&#xff08;XGBoost和Lightgbm&#xff09;等&#xff0c;基本原理都是通过集成弱学习器的即式来进一步提升准确度。这里的弱学习器包括线性模型和决策树模型&…

DC30V36V60V100V转9V、12V/1.5A方案 车灯驱动芯片IC H5028L ,高性价比,皮实耐抗

DC24V、30V、36V、60V、100V转9V、12V/1.5A方案&#xff0c;以及车灯驱动芯片IC&#xff0c;这通常涉及到电源转换和驱动电路的设计。这些方案的目标是将一个较高的直流电压&#xff08;如24V、30V、36V、60V或100V&#xff09;转换为较低但稳定的直流电压&#xff08;如9V或12…

EigenLayer生态全解析:再质押与AVS崛起的序章

基于以太坊网络的再质押协议EigenLayer提出了利用为以太坊网络验证而质押的ETH来与其他协议共享安全性和资本效率&#xff0c;同时为协议参与者提供额外利息。在AVS、再质押、积分系统等概念的推动下&#xff0c;逐渐形成一个庞大的生态系统&#xff0c;从2024年初到现在EigenL…

[前端]NVM管理器安装、nodejs、npm、yarn配置

NVM管理器安装、nodejs、npm、yarn配置 NVM管理器安装 nvm(Node.js version manager) 是一个命令行应用&#xff0c;可以协助您快速地 更新、安装、使用、卸载 本机的全局 node.js 版本。 nvm下载地址&#xff1a;https://github.com/coreybutler/nvm-windows/releases 1.全部…

分类预测 | Matlab实现CNN-LSTM-SAM-Attention卷积长短期记忆神经网络融合空间注意力机制的数据分类预测

分类预测 | Matlab实现CNN-LSTM-SAM-Attention卷积长短期记忆神经网络融合空间注意力机制的数据分类预测 目录 分类预测 | Matlab实现CNN-LSTM-SAM-Attention卷积长短期记忆神经网络融合空间注意力机制的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Mat…

模电期末复习(四)功率放大电路

功率放大电路 4.1 功率放大电路的主要特点4.1.1 对放大电路的要求4.1.2 放大电路中三极管的工作状态4.1.3 放大电路的分析方法 4.2 互补对称式功率放大电路4.2.1 电路的组成和工作原理4.2.2 互补对称电路主要参数的估算 4.3 采用复合管的互补对称式放大电路4.3.1 复合管的接法及…

【计算机毕业设计】理发店管理系统产品功能说明——后附源码

&#x1f389;**欢迎来到我的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 一名来自世界500强的资深程序媛&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 在深度学习任务中展现出卓越的能力&#xff0c;包括但不限于…

绝地求生:PUBG巅峰在线人数再次突破70W:荣都、杜卡迪功不可没!

根据黑盒游戏人数显示&#xff0c;进入2024年后&#xff0c;PUBG在线人数稳定在60W左右。 绝地求生自去年世界赛结束以来&#xff0c;一直处于不愠不火的状态&#xff0c;外挂横行加上没有新游戏元素加入&#xff0c;日活人数仅剩余30&#xff5e;40W。 荣都、杜卡迪上线 而20…

JavaSE基础篇-2

一、数组操作 【先写几个练习】 public class Demo01Array {public static void main(String[] args) {//1.创建Random对象以及数组Random rd new Random();int[] arr new int[10];//2.定义一个变量,统计个数 countint count 0;//3.循环随机循环存for (int i 0; i < ar…

【LInux学习】Linux项目自动化构建工具-make/Makefile

文章目录 &#x1f302;背景&#x1f302;make/Makefile的使用&#x1f302;make/Makefile原理&#x1f302;项目清理&#x1f302;make/Makefile的语法补充 &#x1f302;背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文…

C++模版初阶----函数模版、类模版

C模版初阶 1. 泛型编程2. 函数模板2.1 函数模板概念2.2函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 函数模版的匹配原则 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化 总结 1. 泛型编程 泛型编程 : 编写与类型无关的通用代码&#xff0c;是代码复用的一种手段…

模电期末复习(三)放大电路的频率响应

放大电路的频率响应 3.1 频率响应的一般概念3.1.1 幅频特性和相频特性3.1.2 下限频率、上限频率和通频带3.1.3 频率失真3.1.4 波特图3.1.5高通电路和低通电路 3.2 三极管的频率参数3.2.1 共射截止频率3.2.2 特征频率3.2.3 共基截止频率 3.3 单管共射放大电路的频率响应3.3.1 三…

Chrome 侧边栏开发示例

前言 最近做项目&#xff0c;需要开发浏览器扩展&#xff0c;但是考虑页面布局兼容性问题&#xff0c;使用了Chrome114开始的侧边栏&#xff0c;浏览器自带的能力毕竟不会出现兼容性问题&#xff0c;不过Chrome123开始&#xff0c;侧边栏居然又可以选择固定右侧扩展栏了&#…

IDEA中Vue开发环境搭建

1. IDEA安装Vue.js 文件>设置>插件>搜索Vue.js并安装。 2. 安装Node.js 官网地址&#xff1a;https://nodejs.org 安装包下载地址&#xff1a;https://nodejs.org/en/download 下载并安装&#xff0c;安装时&#xff0c;勾选添加系统变量选项。 # 如果正确安装…

Spring AI Summary

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Spring AI is a project that aims to streamline the development of AI applications by providing abstractions and reusable components that can be easily integrate…

Jmeter-非GUI模式下运行jmeter脚本-适用于服务器上持续集成测试

背景 大部分Jmeter脚本都是部署在Linux上运行&#xff0c;利用Jenkins做接口自动化&#xff0c;定时巡检任务。 执行命令 1.进入jmeter的目录&#xff0c;bin文件夹 cd C:\path\to\jmeter\bin2.运行脚本文件 jmeter -n -t D:\{脚本文件目录}\xxx.jmx -l D:\{脚本文件目录}…

Java代码基础算法练习-逆序输出-2024.04.22

任务描述&#xff1a; 输入10个数字&#xff08;数字取值范围&#xff1a;0~1000&#xff09;&#xff0c;然后逆序输出。 任务要求&#xff1a; 代码示例&#xff1a; package April_2024;import java.util.Scanner;/*** 输入10个数字&#xff08;限定在0~1000范围内&#x…

Rust基本数据类型-切片

一、切片是什么&#xff0c;怎么用 1、切片是什么 切片并不是 Rust 独有的概念&#xff0c;在 Go 语言中就非常流行&#xff0c;它允许你引用集合中部分连续的元素序列&#xff0c;而不是引用整个集合。 对于字符串而言&#xff0c;切片就是对 String 类型中某一部分的引用&…

FFmpeg开发笔记(二十一)Windows环境给FFmpeg集成AVS3解码器

AVS3是中国AVS工作组制定的第三代音视频编解码技术标准&#xff0c;也是全球首个已推出的面向8K及5G产业应用的视频编码标准。AVS工作组于2019年3月9日完成第三代AVS视频标准&#xff08;AVS3&#xff09;基准档次的制订工作&#xff0c;参考软件的测试表明&#xff0c;AVS3基准…

webpack-babel2

浏览器的兼容性问题 浏览器的兼容性问题不知包括随屏幕大小而变化&#xff0c;还包括针对浏览器支持的特性&#xff08;如css特性&#xff0c;js特性&#xff09; 做处理。 目前市场上有很多浏览器&#xff1a;Chrome,Safari,IE,Edge等&#xff0c;要根据它们的市场占有率来决…