electron首次创建项目
·
个人记录,可以参考一下
第一步
创建目录
mkdir my-electron-vue && cd my-electron-vue
初始化
npm init -y
安装依赖
npm install electron vue@3 vue-router@4
npm install -D vite @vitejs/plugin-vue concurrently wait-on
目录结构
my-electron-vue/
├── package.json
├── vite.config.js
├── src/
│ ├── main/
│ │ └── index.js # 主进程
│ ├── preload/
│ │ └── index.js # 预加载脚本
│ └── renderer/ # Vue 前端
│ ├── index.html
│ ├── main.js
│ ├── App.vue
│ └── components/
│ └── Hello.vue
1. package.json
{
"name": "my-electron-vue",
"version": "1.0.0",
"main": "src/main/index.js",
"scripts": {
"dev": "concurrently \"npm run dev:vite\" \"wait-on http://localhost:5173 && electron .\"",
"dev:vite": "vite",
"build": "vite build && electron-builder",
"postinstall": "electron-builder install-app-deps"
}
}
2. src/main/index.js(主进程)
const { app, BrowserWindow } = require('electron')
const path = require('path')
const createWindow = () => {
const win = new BrowserWindow({
width: 1200,
height: 800,
webPreferences: {
preload: path.join(__dirname, '../preload/index.js'),
contextIsolation: true,
nodeIntegration: false
}
})
// 开发环境加载 Vite 服务,生产环境加载打包文件
if (process.env.VITE_DEV_SERVER_URL) {
win.loadURL(process.env.VITE_DEV_SERVER_URL)
win.webContents.openDevTools()
} else {
win.loadFile(path.join(__dirname, '../renderer/dist/index.html'))
}
}
app.whenReady().then(createWindow)
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') app.quit()
})
3. src/preload/index.js(预加载脚本)
const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('electronAPI', {
send: (channel, data) => ipcRenderer.send(channel, data),
on: (channel, callback) => ipcRenderer.on(channel, callback)
})
4. vite.config.js
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
export default defineConfig({
plugins: [vue()],
root: path.join(__dirname, 'src/renderer'),
base: './',
build: {
outDir: path.join(__dirname, 'src/renderer/dist'),
emptyOutDir: true
}
})
(
标准 Vite 只能处理渲染进程(Vue 前端),但 Electron 还有:
• 主进程(Node.js 后端):需要 CommonJS 格式
• 预加载脚本(中间层):需要特殊的安全配置
electron-vite 让你用一个配置文件管理三个环境,而不需要写多个 vite.config.js。
)
| 场景 | 标准 Vite | electron-vite |
|---|---|---|
| 配置数量 | 3 个(主进程、preload、renderer 各一个) | 1 个统一配置 |
| 开发启动 | 手动分别启动 | 一键 electron-vite dev |
| 热更新 | 只支持渲染进程 | 主进程 + 渲染进程 都支持热更新 |
| 构建命令 | 分别构建三次 | 一次 electron-vite build 全搞定 |
| 特性 | Webpack | Vite |
|---|---|---|
| 开发模式启动 | 先打包所有模块,再启动服务器 | 直接启动,按需编译 |
| 编译速度 | 慢(项目越大越慢) | 快(几乎秒开) |
| 热更新 (HMR) | 重新编译整个模块链 | 只更新变更的模块 |
| 底层实现 | 基于 Node.js 的 JavaScript 打包 | 基于浏览器原生 ES Modules |
| 生产构建 | 自己实现打包逻辑 | 用 Rollup 打包 |
| 场景 | Webpack | Vite |
|---|---|---|
| 默认配置 | 几乎为零,必须手动配 | 开箱即用,零配置启动 |
| 配置复杂度 | 高(loader/plugin 概念多) | 低(rollup 插件兼容) |
| 配置文件长度 | 通常 100+ 行 | 通常 20-50 行 |
| 维度 | Webpack | Vite |
|---|---|---|
| 成熟度 | 2012 年发布,生态庞大 | 2020 年发布,快速增长 |
| 插件数量 | 海量(但质量参差不齐) | 丰富(rollup 插件通用) |
| 框架支持 | 所有框架都支持 | Vue 3 首选,React/Svelte 支持好 |
| 企业项目 | 存量项目多 | 新项目首选 |
| 特性 | ES Modules (ESM) | CommonJS (CJS) |
|---|---|---|
| 语法 | import/export | require/module.exports |
| 加载时机 | 静态编译时(启动时确定依赖) | 动态运行时(执行到才加载) |
| 加载方式 | 异步加载 | 同步加载 |
| 浏览器支持 | ✅ 原生支持(现代浏览器) | ❌ 不支持(需打包工具转换) |
| Node.js 支持 | ✅ 原生支持(.mjs 或 type: module) | ✅ 默认支持 |
| ** tree-shaking** | ✅ 支持(天然可静态分析) | ❌ 难以支持(动态特性多) |
| this 指向 | undefined | module.exports |
Vite 选择 ES Modules:
| Vite 的优势 | 原理 |
|---|---|
| 冷启动快 | 浏览器原生 import,无需先打包 |
| 按需编译 | 请求哪个模块,服务端编译哪个 |
| 天然支持 HMR | 静态结构让替换模块更容易 |
| 自动 Tree-shaking | 编译时就能确定哪些代码未使用 |
5. src/renderer/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Electron + Vue</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="./main.js"></script>
</body>
</html>
6. src/renderer/main.js
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')
7. src/renderer/App.vue
<template>
<div class="app">
<h1>🚀 Electron + Vue 3 运行成功</h1>
<p>Node版本: {{ nodeVersion }}</p>
<Hello />
</div>
</template>
<script setup>
import { ref } from 'vue'
import Hello from './components/Hello.vue'
const nodeVersion = ref(process.versions?.node || 'N/A')
</script>
<style>
.app { text-align: center; padding: 50px; }
</style>
8. src/renderer/components/Hello.vue
<template>
<div class="hello">
<h2>组件测试</h2>
<button @click="count++">点击次数: {{ count }}</button>
</div>
</template>
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
其他方式:
使用官方模板(更规范)
使用 electron-vite 脚手架(也是你熟悉的结构)
npm create electron-vite@latest my-app
选 Vue 模板
cd my-app
npm install
npm run dev
启动项目:
cd my-electron-vue
npm run dev
更多推荐
所有评论(0)