Skip to content

Electron打包工具

打包工具选型

  • Electron-Builder
  • Electron-Forge

核心定位差异

特性Electron-BuilderElectron-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-BuilderElectron-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-BuilderElectron-Forge
打包速度⭐⭐⭐⭐⭐ 快⭐⭐⭐⭐ 中等
首次打包3-5 分钟5-8 分钟
增量构建✅ 支持⚠️ 部分支持
包体积更小(优化好)略大
内存占用中等

社区生态对比

指标Electron-BuilderElectron-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 的优势:

  1. Monorepo 支持完美

    javascript
    directories: {
      app: 'packages/main',
    }
  2. 自定义构建流程

    json
    "build": "pnpm -F renderer build && pnpm build:electron"
  3. 灵活的资源管理

    javascript
    extraResources: [
      { from: 'resources', to: './' },
      { from: 'packages/main/src/pages', to: './pages' },
    ];
  4. 已集成自动更新

    javascript
    // 你的 update-handler.js 可以无缝使用
    const { autoUpdater } = require('electron-updater');

总结建议

当前项目继续使用Electron-Builder

  • Monorepo 结构:Builder 支持更好
  • 自动更新:已经集成了 electron-updater
  • 成熟稳定:13.5k stars,社区活跃
  • 文档完善:遇到问题容易解决
  • 性能优秀:打包速度快,体积小
  • 灵活性高:不干涉你的开发流程

什么情况下考虑更换Electron-Forge?

  • ❌ 你是 Electron 新手
  • ❌ 需要官方支持(Builder 社区支持更好)
  • ❌ 希望一体化工具(但会牺牲灵活性)

基于 MIT 许可发布