Electron Forge 开发环境与项目配置
前言
Electron Forge 是 Electron 官方推荐的脚手架和打包工具链,解决了手动配置 Electron 项目时的繁琐和坑点。它整合了 Webpack、Vite、esbuild 等多种构建方式,并内置了打包、分发、代码签名等生产级功能。本文将全面介绍如何用 Electron Forge 搭建高效的开发环境。
环境准备
必要工具
# Node.js >= 18.0(推荐 20 LTS)
node -v
# pnpm(比 npm 更快,推荐)
corepack enable pnpm
pnpm -v
# Git
git -vElectron Forge 脚手架
Electron Forge 提供多种模板:
| 模板 | 适用场景 | 构建工具 |
|---|---|---|
vite | 新项目首选,快 | Vite |
webpack | 需要精细控制构建流程 | Webpack |
esbuild | 极致的构建速度 | esbuild |
vite-typescript | TypeScript 项目 | Vite + TS |
# 创建 Vite + TypeScript 项目
pnpm create electron-app@latest my-app --template=vite-typescript
cd my-app
pnpm install
pnpm dev创建完成后,项目目录结构如下:
my-app/
├── package.json
├── forge.config.js ← Forge 打包配置
├── vite.main.config.mjs ← 主进程构建配置
├── vite.preload.config.mjs
├── vite.renderer.config.mjs
├── src/
│ ├── main.ts ← 主进程入口
│ ├── preload.ts ← 预加载脚本
│ └── renderer/ ← 渲染进程代码(Vite 入口)
│ ├── index.html
│ ├── main.ts
│ └── styles.css
└── resources/ ← 应用图标等资源package.json 关键字段
Electron 项目的 package.json 有几个 Electron 特有的关键字段:
{
"name": "my-electron-app",
"version": "1.0.0",
"description": "我的 Electron 应用",
"main": ".vite/build/main.js",
"author": "Your Name",
"license": "MIT",
"scripts": {
"start": "electron-forge start", // 开发启动
"package": "electron-forge package", // 打包(不生成安装包)
"make": "electron-forge make", // 生成平台安装包
"publish": "electron-forge publish" // 发布
},
"devDependencies": {
"@electron-forge/cli": "^7.0.0",
"@electron-forge/maker-squirrel": "^7.0.0",
"@electron-forge/maker-zip": "^7.0.0",
"electron": "^35.0.0"
}
}main 字段指向主进程的入口文件,必须准确。**scripts.start**是开发启动命令,使用 electron-forge start 会自动处理构建和启动。
Forge 配置详解
// forge.config.js
const { Fuses } = require('@electron-forge/plugin-fuses');
const { FuseV1Options, FuseVersion } = require('@electron/fuses');
module.exports = {
packagerConfig: {
name: 'MyElectronApp',
executableName: 'my-electron-app',
asar: true,
icon: './resources/icon',
// macOS 应用签名
osxSign: {},
// Windows 图标(需为 ico 格式)
win32metadata: {
CompanyName: 'My Company',
FileDescription: 'My Electron App',
ProductName: 'MyElectronApp',
},
},
rebuildConfig: {},
makers: [
// Windows: Squirrel 安装包
new MakerSquirrel({
name: 'MyElectronApp',
setupIcon: './resources/icon.ico',
}),
// macOS: DMG 镜像
new MakerDMG({
name: 'MyElectronApp',
icon: './resources/icon.icns',
}),
// Linux: zip
new MakerZIP({}, ['darwin', 'linux']),
],
plugins: [
{
name: '@electron-forge/plugin-auto-unpack-natives',
config: {},
},
// Vite 插件
new VitePlugin({
build: [
{
entry: 'src/main.ts',
config: 'vite.main.config.mjs',
target: 'main',
},
{
entry: 'src/preload.ts',
config: 'vite.preload.config.mjs',
target: 'preload',
},
],
renderer: [
{
name: 'main_window',
config: 'vite.renderer.config.mjs',
},
],
}),
// Electron Fuses 安全加固
new Fuses({
version: FuseVersion.V1,
[FuseV1Options.RunAsNode]: false,
[FuseV1Options.EnableCookieEncryption]: true,
[FuseV1Options.EnableNodeOptionsEnvironmentVariable]: false,
[FuseV1Options.EnableNodeCliInspectArguments]: false,
[FuseV1Options.EnableEmbeddedAsarIntegrityValidation]: true,
[FuseV1Options.OnlyLoadAppFromAsar]: true,
}),
],
};Vite 配置(主进程)
// vite.main.config.mjs
import { defineConfig } from 'vite';
export default defineConfig({
build: {
outDir: '.vite/build',
lib: {
entry: 'src/main.ts',
formats: ['cjs'],
fileName: () => 'main.js',
},
rollupOptions: {
external: ['electron', 'electron-log', 'path', 'fs', 'os'],
},
minify: false, // 开发环境不压缩,便于调试
},
});开发调试
热重载
使用 Vite 模板时,渲染进程默认支持热模块替换(HMR)——修改前端代码无需重启整个应用,主进程代码修改后会触发自动重启。
# 启动开发服务器
pnpm devDevTools 调试
在渲染进程中打开 DevTools:
// src/main.ts
import { BrowserWindow } from 'electron';
const win = new BrowserWindow({ width: 1200, height: 800 });
// 启动时打开 DevTools(仅开发模式)
if (process.env.NODE_ENV === 'development') {
win.webContents.openDevTools();
}主进程断点调试
Electron Forge + VS Code 配置断点调试:
// .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Main Process",
"type": "node",
"request": "launch",
"cwd": "${workspaceFolder}",
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron",
"windows": {
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/electron.cmd"
},
"args": ["."],
"outputCapture": "std",
"env": {
"NODE_ENV": "development"
}
}
]
}设置断点后按 F5 即可在主进程中逐行调试。
生产日志排查
渲染进程崩溃或异常时,使用 electron-log 收集日志:
// src/main.ts
import log from 'electron-log';
// 主进程日志
log.info('应用启动');
log.error('出错了', error);
// 捕获未处理的异常
process.on('uncaughtException', (error) => {
log.error('未捕获异常:', error);
});
process.on('unhandledRejection', (reason) => {
log.error('未处理的 Promise 拒绝:', reason);
});
// 渲染进程日志(需要 IPC)
log.info('渲染进程日志来自:', win.webContents.getURL());项目规范化
目录结构约定
src/
├── main.ts # 主进程入口(应用生命周期管理)
├── preload.ts # 预加载脚本(安全的 IPC 桥接)
├── renderer/ # 渲染进程代码(前端)
│ ├── index.html
│ ├── main.ts # 前端入口
│ ├── App.vue # 或 App.tsx
│ └── styles/
├── ipc/ # IPC 处理函数(可分离)
│ └── handlers.ts
└── shared/ # 主进程和渲染进程共享类型
└── types.tsTypeScript 配置
// tsconfig.json
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"declaration": true,
"outDir": "./dist"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist", ".vite"]
}常见问题
macOS 启动报错 “Electron failed to install correctly”
# 重新安装 Electron
pnpm rebuild electronWindows 上 electron 命令找不到
# 确认 node_modules/.bin 在 PATH 中
npx electron .pnpm 安装后运行报错
Electron 原生模块(node-gyp 编译)在 pnpm 下需要特殊处理:
pnpm add electron -D
pnpm rebuild或在 package.json 中添加:
{
"pnpm": {
"onlyBuiltDependencies": ["electron"]
}
}小结
- Electron Forge 是 Electron 官方推荐的脚手架和打包工具
- Vite 模板是新建项目的最佳选择,内置热重载和快速构建
package.json的main、scripts字段是 Electron 项目的核心配置forge.config.js控制打包行为、Makers(安装包格式)和安全加固选项- 生产构建使用
pnpm make,开发调试使用pnpm dev
下一篇文章我们将深入讲解 IPC 通信机制,掌握主进程与渲染进程之间双向异步通信的核心方法。
评论
Written by
AI-Writer
Related Articles
Electron 应用打包与分发
使用 electron-builder 配置多平台打包(Windows NSIS / macOS DMG / Linux AppImage),设置自动更新(electron-updater),配置代码签名(Authenticode / Apple Developer),搭建 GitHub Actions CI 流水线
Read MoreNode.js 原生模块调用
在 Electron 主进程中使用 npm 原生模块(sqlite3、sharp),Native Module 编译(node-gyp / electron-rebuild),纯 JS 替代方案以及多线程 Worker Threads 实践
Read MoreReact / Vue 与 Electron 集成
使用 electron-vite 工具链整合 Vite + React/Vue + Electron,配置路由(React Router / Vue Router),实现主进程与渲染进程状态共享(Zustand IPC 桥接)
Read More