【Electron+Vite】打造vite插件

前言

这篇文章将带大家实现下打造vite插件,并以electron的桌面应用展现出来。

一、环境搭建

  1. 创建vite项目

yarn create vite xxx --template vue-ts

  1. 安装Electron (由于我的电脑是window系统,直接装electron会报错,所以采用以下解决办法)
  • npm install -g cnpm --registry=https://registry.npmmirror.com
  • cnpm install --save-dev electron

二、创建Electron,打造桌面应用

  1. 目录结构:创建main目录,并在该目录下创建mainEntry.ts文件
  1. 编写Electron(此时这样引入electron 没有用的,要用到接下来的vite 进行编译)
javascript 复制代码
import { app, BrowserWindow } from 'electron'

let mianWindow: BrowserWindow;

app.whenReady().then(() => { //electron 一准备好就执行
  mianWindow = new BrowserWindow({}); //创建一个新的浏览器窗口
  mianWindow.loadURL(process.argv[2]) //electron 内置了谷歌的进程,所以会有process
  //process.argv[2] 该代码是用于读取在进程中输入的指令
})

三、结合vite+electron打造vite插件

  1. 目录结构:创建plugin文件夹,并在此文件夹内创建devPlugin.ts文件
  1. devPlugin.ts文件初步编写
javascript 复制代码
// 打造 vite 插件
import { ViteDevServer } from 'vite' //vite中自带的钩子函数

export let devPlugin = () => {//实现在开发环境下的插件
  return {
    name: 'dev-plugn', //插件名
    //主要是完成主进程的编译工作
    configureServer(server: ViteDevServer) { // vite在启动HTTP服务时,该钩子函数就会执行
    
    /*执行一些操作*/
   }
  }
}
  1. configureServer 函数编写,实现主进程的编译工作(主要是先把electron的ts文件转为js文件,然后再监听vite启动服务的事件,创建一个进程,启动electron应用并且electron应用的地址为继承过来的文件所在地址)
javascript 复制代码
// 打造 vite 插件
import { ViteDevServer } from 'vite'

export let devPlugin = () => {//开发环境下的插件
  return {
    name: 'dev-plugn',
    //主要是完成主进程的编译工作
    configureServer(server: ViteDevServer) { // vite在启动HTTP服务时,该钩子函数就会执行
    
      require('esbuild').buildSync({ //esbuild 是vite内置打包模块
        entryPoints: ["./src/main/mainEntry.ts"], //入口文件
        bundle: true, //进行打包
        platform: 'node', // node平台做编译
        outfile: './dist/mainEntry.js', //出口文件
        external: ['electron'] // 排除掉electron 也就是不用深入读取electron模块
      })
      
      server.httpServer?.once("listening", () => {//监听vite启动服务的那一刻
        let { spawn } = require('child_process') //开一个进程
        let addressInfo = server.httpServer?.address() //获取vite运行的地址
        // httpAddress --- vue页面启动的路径
        let httpAddress = `http://${addressInfo.address}:${addressInfo.port}`
        //启动electron应用  require('electron'):引入了electron进来; './dist/mainEntry.js':相当于去执行了./src/main/mainEntry.ts
        let electronProcess = spawn(require('electron').toString(), ['./dist/mainEntry.js', httpAddress], { 
          cwd: process.cwd(), //运行文件所在目录的绝对路径
          stdio: 'inherit' //单开出来的桌面应用的页面路径也是继承过来的
        })
        
        electronProcess.on('close', () => { //关闭
          server.close()
          process.exit()
        })
      })
    }
  }
}
  1. devPlugin.ts文件生效(在vite.config.ts文件中引入devPlugin并且调用一下)
javascript 复制代码
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import { devPlugin } from './plugin/devPlugin';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [devPlugin(),vue()],
})

注:

在引入import { devPlugin } from './plugin/devPlugin'; 时可能会报错,所以在tsconfig.node.json 文件下在include下修改为:

"include": ["vite.config.ts","./plugin/devPlugin.ts"]

四、效果

浏览器下的:

桌面应用electron下的:

至此,一个在开发环境下的简单的vite插件就打造好了~~~

结束语

本篇文章就到此为止啦,由于本人经验水平有限,难免会有纰漏,对此欢迎指正 。如觉得本文对你有帮助的话,欢迎点赞收藏❤❤❤。要是您觉得有更好的方法,欢迎评论,提出建议!

相关推荐
熊猫钓鱼>_>15 分钟前
动态网站发布部署核心问题详解
前端·nginx·容器化·网页开发·云服务器·静态部署
方也_arkling16 分钟前
elementPlus按需导入配置
前端·javascript·vue.js
爱吃大芒果27 分钟前
Flutter for OpenHarmony 实战: mango_shop 资源文件管理与鸿蒙适配
javascript·flutter·harmonyos
我的xiaodoujiao30 分钟前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 44--将自动化测试结果自动推送至钉钉工作群聊
前端·python·测试工具·ui·pytest
沛沛老爹32 分钟前
Web开发者转型AI:多模态Agent视频分析技能开发实战
前端·人工智能·音视频
David凉宸37 分钟前
vue2与vue3的差异在哪里?
前端·javascript·vue.js
Irene199138 分钟前
JavaScript字符串转数字方法总结
javascript·隐式转换
笔画人生42 分钟前
Cursor + 蓝耘API:用自然语言完成全栈项目开发
前端·后端
AC赳赳老秦1 小时前
外文文献精读:DeepSeek翻译并解析顶会论文核心技术要点
前端·flutter·zookeeper·自动化·rabbitmq·prometheus·deepseek
小宇的天下1 小时前
Calibre 3Dstack --每日一个命令day18【floating_trace】(3-18)
服务器·前端·数据库