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 回收。
相关推荐
vipbic11 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
kaiking_g15 小时前
vue项目中,静态导入 vs 动态导入 详解
前端·javascript·vue.js
Hyyy15 小时前
为什么 macOS 应用一换 Bundle ID,之前授予的权限就全失效了?
macos·electron
不法19 小时前
uniapp map地图导航/地图路线
前端·vue.js·uni-app
卓怡学长21 小时前
w263基于springboot + vue 健康饮食管理系统
java·数据库·vue.js·spring boot·spring·intellij-idea
无情的西瓜皮1 天前
MCP 协议实战:从零搭建一个 MCP 服务器(Node.js 版)
vue.js·人工智能·typescript·node.js
万亿少女的梦1681 天前
基于Spring Boot、Vue.js和MySQL的超市管理系统设计与实现
java·vue.js·spring boot·mysql·管理系统
李明卫杭州1 天前
Vue2 portal-target 组件与 Vue3 的针对性优化
前端·javascript·vue.js
江华森1 天前
Vue Router 与 SPA 原理深度解析
前端·javascript·vue.js
糖墨夕1 天前
第一章:为什么你要学 AI Agent?—— 从"切图仔"到全栈的进化之路
前端·javascript·vue.js