【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插件就打造好了~~~

结束语

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

相关推荐
光影少年5 分钟前
vue2与vue3的全局通信插件,如何实现自定义的插件
前端·javascript·vue.js
As977_6 分钟前
前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)
前端·css·学习
susu10830189118 分钟前
vue3 css的样式如果background没有,如何覆盖有background的样式
前端·css
Ocean☾10 分钟前
前端基础-html-注册界面
前端·算法·html
Rattenking10 分钟前
React 源码学习01 ---- React.Children.map 的实现与应用
javascript·学习·react.js
Dragon Wu12 分钟前
前端 Canvas 绘画 总结
前端
CodeToGym16 分钟前
Webpack性能优化指南:从构建到部署的全方位策略
前端·webpack·性能优化
~甲壳虫18 分钟前
说说webpack中常见的Loader?解决了什么问题?
前端·webpack·node.js
~甲壳虫21 分钟前
说说webpack proxy工作原理?为什么能解决跨域
前端·webpack·node.js
Cwhat23 分钟前
前端性能优化2
前端