electron 踩坑之旅(七) —— 使用 Vite + Vue3 进行 Electron 项目环境搭建

748 阅读1分钟

Electron + Vue3 + TS + Vite 桌面应用开发

项目初体验

初始化项目

在项目安装之前先确定环境配置,当前环境使用的是

node -v
v16.19.0
npm -v
8.19.3
npm install -g yarn
yarn config set registry http://registry.npm.taobao.org/
npm install pnpm -g
pnpm config set registry https://registry.npmmirror.com/

通过 vite 提供的脚手架命令初始化项目, 这里使用 pnpm 进行初始化

# npm 6.x
npm create vite@latest electron-vite-vue-ts --template vue-ts
# npm 7+
npm create vite@latest electron-vite-vue-ts -- --template vue-ts
# yarn
yarn create vite electron-vite-vue-ts --template vue-ts
# pnpm
pnpm create vite electron-vite-vue-ts --template vue-ts

修改版本信息与配置 package.json

{
  "name": "electron-vite-vue-ts",
  "private": true,
  "version": "0.0.0",
  "scripts": {
    "dev": "vite",
    "build": "vue-tsc && vite build",
    "preview": "vite preview"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^4.1.0",
    "electron": "^24.1.2",
    "typescript": "^5.0.2",
    "vite": "^4.3.2",
    "vue": "^3.2.47",
    "vue-tsc": "^1.4.2"
  }
}

安装依赖并运行

pnpm install
pnpm run dev

electron 环境准备

安装 electron,因为国内网络环境问题大概率会安装失败,如果安装失败可以设置淘宝镜像源

pnpm config set electron_mirror "https://npm.taobao.org/mirrors/electron/"
pnpm add electron -D

创建主进程

//src\main\entry.ts
import { app, BrowserWindow } from "electron";

let mainWindow: BrowserWindow;

app.whenReady().then(() => {
  mainWindow = new BrowserWindow({});
  mainWindow.loadURL(process.argv[2]);
});

开发环境 Vite 插件

//plugins\electronDev.ts
import { ViteDevServer } from "vite";
export let devPlugin = () => {
    return {
        name: "dev-plugin",
        configureServer(server: ViteDevServer) {
            require("esbuild").buildSync({
                entryPoints: ["./src/main/entry.ts"],
                bundle: true,
                platform: "node",
                outfile: "./dist/entry.js",
                external: ["electron"],
            });
            server.httpServer.once("listening", () => {
                let { spawn } = require("child_process");
                let addressInfo = server.httpServer.address();
                let httpAddress = `http://${addressInfo.address}:${addressInfo.port}`;
                let electronProcess = spawn(require("electron").toString(), ["./dist/entry.js", httpAddress], {
                    cwd: process.cwd(),
                    stdio: "inherit",
                });
                electronProcess.on("close", () => {
                    server.close();
                    process.exit();
                });
            });
        },
    };
};

使用插件

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

import { devPlugin } from "./plugins/electronDev";

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

运行项目

pnpm run dev