Electron打包工具
打包工具选型
- Electron-Builder
- Electron-Forge
核心定位差异
| 特性 | Electron-Builder | Electron-Forge |
|---|---|---|
| 定位 | 独立打包工具 | 完整开发生态系统 |
| 官方支持 | 社区维护(非官方) | Electron 官方工具 |
| 关注点 | 专注打包和分发 | 覆盖开发全流程 |
| 年龄 | 更成熟(2016年) | 较新(2017年重构) |
配置方式对比
Electron-Builder
javascript
// electron-builder.config.js
module.exports = {
appId: 'com.lmx.electron',
productName: 'vue3-simple-electron',
directories: {
output: 'dist',
buildResources: 'resources',
},
win: {
target: 'nsis',
icon: 'resources/icons/',
},
nsis: {
oneClick: false,
allowToChangeInstallationDirectory: true,
},
};特点:
- ✅ 配置简洁直观
- ✅ 单一配置文件
- ✅ 声明式配置
- ✅ 文档完善
Electron-Forge
javascript
// forge.config.js
module.exports = {
packagerConfig: {
asar: true,
icon: 'resources/icons/icon',
},
makers: [
{
name: '@electron-forge/maker-squirrel',
config: {
setupIcon: 'resources/icons/icon.ico',
},
},
{
name: '@electron-forge/maker-zip',
platforms: ['darwin'],
},
],
plugins: [
{
name: '@electron-forge/plugin-webpack',
config: {
/* webpack config */
},
},
],
};特点:
- ✅ 插件化架构
- ✅ 更灵活
- ⚠️ 配置较复杂
- ⚠️ 学习曲线陡峭
工具功能对比
| 功能 | Electron-Builder | Electron-Forge |
|---|---|---|
| 多平台打包 | ✅ 优秀 | ✅ 良好 |
| 自动更新 | ✅ 内置(electron-updater) | ⚠️ 需要额外配置 |
| 代码签名 | ✅ 全平台支持 | ✅ 支持 |
| 增量更新 | ✅ 支持 | ❌ 不支持 |
| 打包速度 | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 包体积优化 | ✅ 内置优化 | ⚠️ 需手动配置 |
| ASAR 打包 | ✅ 默认启用 | ✅ 默认启用 |
| 开发工具链 | ❌ 不提供 | ✅ 完整工具链 |
安装器支持对比
Electron-Builder
javascript
win: {
target: ['nsis', 'portable', 'zip', 'msi'];
}
mac: {
target: ['dmg', 'pkg', 'mas', 'mas-dev'];
}
linux: {
target: ['AppImage', 'deb', 'rpm', 'snap', 'pacman'];
}Windows 安装器:
- ✅ NSIS(最流行)
- ✅ Squirrel.Windows
- ✅ MSI
- ✅ Portable(绿色版)
- ✅ AppX(Windows Store)
macOS 安装器:
- ✅ DMG(最常用)
- ✅ PKG
- ✅ Mac App Store(MAS)
- ✅ ZIP
Linux 安装器:
- ✅ AppImage(通用)
- ✅ DEB(Debian/Ubuntu)
- ✅ RPM(RedHat/CentOS)
- ✅ Snap
- ✅ Pacman(Arch Linux)
Electron-Forge
javascript
makers: [
'@electron-forge/maker-squirrel', // Windows
'@electron-forge/maker-zip', // macOS
'@electron-forge/maker-deb', // Linux
'@electron-forge/maker-dmg', // macOS
'@electron-forge/maker-wix', // Windows MSI
];支持较少:
- ⚠️ 主要支持主流格式
- ⚠️ 一些高级格式需插件
- ⚠️ NSIS 需要额外插件
自动更新对比
Electron-Builder
javascript
const { autoUpdater } = require('electron-updater');
autoUpdater.setFeedURL({
provider: 'generic',
url: 'https://your-server.com/updates',
});
autoUpdater.checkForUpdatesAndNotify();特点:
- ✅ 内置
electron-updater - ✅ 支持多种更新源(GitHub、S3、Generic)
- ✅ 增量更新(Windows)
- ✅ 分阶段发布
- ✅ 自动下载和安装
支持的更新方式:
javascript
{
publish: [
{
provider: 'github',
owner: 'your-org',
repo: 'your-repo',
},
{
provider: 's3',
bucket: 'your-bucket',
},
{
provider: 'generic',
url: 'https://your-cdn.com/updates',
},
];
}内网更新策略可以参考当前项目实现, 下载更新文件替换的安装目录内的文件的方式
Electron-Forge
javascript
// 需要手动集成
publishers: [
{
name: '@electron-forge/publisher-github',
config: {
repository: {
owner: 'your-org',
name: 'your-repo',
},
},
},
];特点:
- ⚠️ 不内置自动更新
- ⚠️ 需要手动集成
electron-updater - ⚠️ 配置较复杂
项目结构支持
Electron-Builder
javascript
// 当前项目结构(Monorepo)
vue3-simple-electron/
├── packages/
│ ├── main/ # 主进程
│ └── renderer/ # 渲染进程
├── resources/ # 资源文件
└── electron-builder.config.js
// 配置支持
{
directories: {
app: 'packages/main', // ✅ 支持指定主进程目录
output: 'dist',
},
extraResources: [ // ✅ 灵活的资源配置
{ from: 'resources', to: './' }
]
}Electron-Forge
your-app/
├── src/
│ ├── main.js
│ └── renderer/
├── forge.config.js
└── package.json
// 默认期望传统结构,Monorepo 需额外配置开发体验对比
Electron-Builder
优点:
- ✅ 专注打包,不干涉开发流程
- ✅ 与任何构建工具兼容(Webpack、Vite、Rollup)
- ✅ 你可以自由选择开发工具
你的项目示例:
json
{
"scripts": {
"dev": "concurrently \"pnpm -F renderer dev\" \"pnpm -F main dev\"",
"build": "pnpm -F renderer build && pnpm build:electron"
}
}Electron-Forge
优点:
- ✅ 提供完整开发工具链
- ✅
electron-forge start一键启动 - ✅ 内置 Webpack/Vite 插件
缺点:
- ⚠️ 必须使用 Forge 的工具链
- ⚠️ 自定义构建流程较困难
工具性能对比
| 指标 | Electron-Builder | Electron-Forge |
|---|---|---|
| 打包速度 | ⭐⭐⭐⭐⭐ 快 | ⭐⭐⭐⭐ 中等 |
| 首次打包 | 3-5 分钟 | 5-8 分钟 |
| 增量构建 | ✅ 支持 | ⚠️ 部分支持 |
| 包体积 | 更小(优化好) | 略大 |
| 内存占用 | 低 | 中等 |
社区生态对比
| 指标 | Electron-Builder | Electron-Forge |
|---|---|---|
| GitHub Stars | ~13.5k ⭐ | ~6.5k ⭐ |
| 周下载量 | ~300k | ~50k |
| Issue 响应 | 快 | 中等 |
| 文档质量 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| 社区插件 | 丰富 | 较少 |
| 商业支持 | ✅ 有 | ❌ 无 |
实际项目案例
使用Electron-Builder的知名项目:
- ✅ VS Code(部分)
- ✅ 1Password
- ✅ Insomnia
- ✅ Hyper Terminal
- ✅ Postman
- ✅ Notion(部分)
使用Electron-Forge的项目:
- ✅ Slack(早期)
- ✅ Discord(早期)
- ✅ 一些小型开源项目
迁移难度对比
从 Builder 迁移到 Forge
bash
# 需要重构大量配置
- 重写 forge.config.js
- 调整项目结构
- 修改构建脚本
- 重新配置 CI/CD从 Forge 迁移到 Builder
bash
# 只需添加配置文件
npm install electron-builder
# 创建 electron-builder.config.js
# 修改 package.json scripts如何选在构建工具
Electron-Builder
适合场景:
- ✅ 需要完善的自动更新系统
- ✅ 多平台打包需求(Windows + macOS + Linux)
- ✅ 需要增量更新
- ✅ Monorepo 项目结构
- ✅ 自定义构建流程
- ✅ 商业项目(有技术支持)
- ✅ 已有构建工具(Vite、Webpack)
当前项目高度匹配Electron-Builder:
javascript
// ✅ Monorepo 结构
packages/
├── main/
└── renderer/
// ✅ 自定义构建
"build": "pnpm -F renderer build && pnpm build:electron"
// ✅ 多种打包格式
target: ['nsis', 'portable']Electron-Forge
适合场景:
- ✅ 新手入门项目
- ✅ 需要官方支持
- ✅ 简单的打包需求
- ✅ 希望使用完整工具链
- ✅ 不需要复杂的更新机制
- ✅ 标准项目结构
基于当前项目分析
根据 package.json 和 electron-builder.config.js:
当前使用 Electron-Builder 的优势:
✅ Monorepo 支持完美
javascriptdirectories: { app: 'packages/main', }✅ 自定义构建流程
json"build": "pnpm -F renderer build && pnpm build:electron"✅ 灵活的资源管理
javascriptextraResources: [ { from: 'resources', to: './' }, { from: 'packages/main/src/pages', to: './pages' }, ];✅ 已集成自动更新
javascript// 你的 update-handler.js 可以无缝使用 const { autoUpdater } = require('electron-updater');
总结建议
当前项目继续使用Electron-Builder
- ✅ Monorepo 结构:Builder 支持更好
- ✅ 自动更新:已经集成了
electron-updater - ✅ 成熟稳定:13.5k stars,社区活跃
- ✅ 文档完善:遇到问题容易解决
- ✅ 性能优秀:打包速度快,体积小
- ✅ 灵活性高:不干涉你的开发流程
什么情况下考虑更换Electron-Forge?
- ❌ 你是 Electron 新手
- ❌ 需要官方支持(Builder 社区支持更好)
- ❌ 希望一体化工具(但会牺牲灵活性)