Electron + Vue 3 + Vite 实践

目录

前言

项目结构:

cpp 复制代码
my-app/
├─ electron/           # Electron 主进程代码
│  ├─ main.ts
│  └─ preload.ts
├─ src/                # 前端代码 (Vue)
│  ├─ App.vue
│  └─ main.ts
├─ package.json
├─ vite.config.ts
└─ tsconfig.json

工具选择:

  • Vite:更快的 HMR,现代构建工具。
  • electron-builder:打包和发布。
  • TypeScript:提升开发体验与类型安全。

一、Electron 主流程集成

1、主进程 main.ts

cpp 复制代码
import { app, BrowserWindow } from 'electron';
import path from 'path';

let mainWindow: BrowserWindow;

function createWindow() {
  mainWindow = new BrowserWindow({
    width: 1200,
    height: 800,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      contextIsolation: true,
      nodeIntegration: false
    }
  });

  if (process.env.NODE_ENV === 'development') {
    mainWindow.loadURL('http://localhost:5173'); // Vite Dev Server
  } else {
    mainWindow.loadFile(path.join(__dirname, '../dist/index.html'));
  }
}

app.whenReady().then(createWindow);

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') app.quit();
});

2、Preload 脚本 preload.ts

cpp 复制代码
import { contextBridge, ipcRenderer } from 'electron';

contextBridge.exposeInMainWorld('electronAPI', {
  sendMessage: (msg: string) => ipcRenderer.send('message', msg),
  onMessage: (callback: (event: any, data: any) => void) => ipcRenderer.on('message-reply', callback)
});

关键点:

  • 使用 contextBridge 替代 nodeIntegration = true。
  • Renderer 只能通过安全 API 调用 Node 功能。

二、Vue 调用 Electron

采用 Vue 3 + Composition API:

cpp 复制代码
<script setup lang="ts">
const sendMsg = () => {
  window.electronAPI.sendMessage('Hello Electron');
};

window.electronAPI.onMessage((_event, data) => {
  console.log('Received:', data);
});
</script>

<template>
  <button @click="sendMsg">Send Message</button>
</template>

注意:

  • window.electronAPI 来自 Preload 安全桥接。
  • 避免直接在 Renderer 中使用 Node API。

三、打包与跨平台

1、使用 electron-builder

在 package.json 添加:

json 复制代码
"build": {
  "appId": "com.example.app",
  "directories": { "output": "release" },
  "files": ["dist/**/*", "electron/**/*"],
  "mac": { "target": "dmg" },
  "win": { "target": "nsis" },
  "linux": { "target": "AppImage" }
}
  • dist:Vite 前端打包产物
  • electron:主进程 & preload
  • 注意 macOS 需要签名 (notarize)

2、打包流程

bash 复制代码
# 前端打包
vite build

# Electron 打包
electron-builder

四、实际开发注意事项

1、开发环境:

  • 使用 concurrently 启动 Vite 和 Electron:
json 复制代码
"dev": "concurrently \"vite\" \"electron .\""

2、Renderer Node 安全:

  • 永远不要在 Renderer 中直接启用 Node。
  • 所有文件操作通过 Preload/IPC。

3、跨平台文件路径:

  • 使用 path.join,避免 Windows/Unix 路径差异。
  • 打包时注意 __dirname 的路径。

4、多窗口 / 多进程优化:

  • 渲染复杂 SPA 页面时,优先复用窗口或 BrowserView。
  • 关闭窗口时记得 win = null 回收。
相关推荐
Howrun77715 分钟前
VSCode烦人的远程交互UI讲解
ide·vue.js·vscode
小迷糊的学习记录3 小时前
Vuex 与 pinia
前端·javascript·vue.js
利刃大大3 小时前
【Vue】Element-Plus快速入门 && Form && Card && Table && Tree && Dialog && Menu
前端·javascript·vue.js·element-plus
小毛驴8504 小时前
Vue 路由示例
前端·javascript·vue.js
TT哇7 小时前
【实习 】银行经理端两个核心功能的开发与修复(银行经理绑定逻辑修复和线下领取扫码功能开发)
java·vue.js
星光不问赶路人8 小时前
vue3使用jsx语法详解
前端·vue.js
weixin79893765432...9 小时前
Vue 组件的更新过程(编译系统 + 响应式系统 + 虚拟 DOM & Diff)
vue.js
我是伪码农9 小时前
Vue 智慧商城项目
前端·javascript·vue.js
小书包酱10 小时前
在 VS Code中,vue2-vuex 使用终于有体验感增强的插件了。
vue.js·vuex
Zhencode11 小时前
Vue3 响应式依赖收集与更新之effect
前端·vue.js