Electron 中的打包与分发
打包是将 Electron 应用从开发环境转换为可分发的独立桌面安装包的过程(Windows: .exe/.msi;macOS: .dmg/.app;Linux: .deb/.rpm/.AppImage)。官方推荐使用成熟的打包工具,避免手动操作。以下基于 2025 年最新实践总结。
1. 主流打包工具对比
| 工具 | 优点 | 缺点/注意事项 | 支持平台 | 推荐场景 |
|---|---|---|---|---|
| electron-builder | 配置最简单、功能最全(自动更新、代码签名、多种格式、多语言安装器) | 依赖较多,偶尔配置复杂 | Win/mac/Linux | 首选,大多数项目 |
| electron-forge | 官方推荐,模块化(支持多种 maker),与 Webpack/Vite 集成好 | 配置稍繁琐,自动更新需额外插件 | Win/mac/Linux | 喜欢模块化、需要自定义流程 |
| electron-packager | 最轻量、简单快速 | 只打包不生成安装器,需手动签名/公证 | Win/mac/Linux | 快速原型、内部分发 |
| electron-updater + builder | 与 builder 结合实现自动更新 | – | – | 所有需要自动更新的应用 |
2025 年推荐:electron-builder(社区最活跃,文档最全)。
2. 使用 electron-builder 打包(推荐流程)
安装:
npm install --save-dev electron-builder
package.json 配置(关键部分):
{
"name": "my-app",
"version": "1.0.0",
"main": "main.js",
"scripts": {
"build": "electron-builder",
"dist:win": "electron-builder --win",
"dist:mac": "electron-builder --mac",
"dist:linux": "electron-builder --linux"
},
"build": {
"appId": "com.example.myapp",
"productName": "MyApp",
"directories": {
"output": "dist" // 输出目录
},
"files": [
"dist-electron/**/*", // Vite/Webpack 输出
"main/**/*"
],
"win": {
"target": [
{ "target": "nsis", "arch": ["x64", "ia32"] }, // 安装器
{ "target": "portable" } // 便携版
],
"icon": "build/icon.ico"
},
"mac": {
"target": ["dmg", "zip"],
"icon": "build/icon.icns",
"hardenedRuntime": true,
"gatekeeperAssess": false,
"entitlements": "build/entitlements.mac.plist"
},
"linux": {
"target": ["AppImage", "deb", "rpm"],
"icon": "build/icons"
},
"nsis": {
"oneClick": false, // 多语言安装器
"allowToChangeInstallationDirectory": true
}
}
}
常见打包命令:
# 打包所有平台
npm run build
# 只打包当前平台
npm run build -- --publish never
# 发布(配合自动更新)
npm run build -- --publish always
3. 代码签名与公证(必须,用于生产发布)
| 平台 | 要求 | 操作方式 |
|---|---|---|
| Windows | SmartScreen 信任、病毒扫描 | 使用 EV 代码签名证书(DigiCert、Sectigo)CSC_LINK 和 CSC_KEY_PASSWORD 环境变量 |
| macOS | Gatekeeper、Notarization(公证)必备 | – Apple Developer ID 证书 – 启用 Hardened Runtime – electron-builder 自动公证(需 APPLE_ID 和 APPLE_ID_PASSWORD) |
| Linux | 无强制,但 AppImage 可签名 | 可选 GPG 签名 |
4. 自动更新(Squirrel / electron-updater)
推荐使用 electron-updater(与 builder 无缝集成)。
配置:
npm install electron-updater
主进程代码:
const { autoUpdater } = require('electron-updater');
autoUpdater.on('checking-for-update', () => { /* ... */ });
autoUpdater.on('update-available', () => { /* 提示用户 */ });
autoUpdater.on('update-downloaded', () => { autoUpdater.quitAndInstall(); });
// 启动时检查
app.whenReady().then(() => {
autoUpdater.checkForUpdatesAndNotify();
});
发布服务器选项:
- GitHub Releases(最简单,private repo 也支持)
- S3 / Azure / 自建服务器
- Electron 的官方发布服务(如 Nutstore)
builder 配置(package.json):
"publish": [
{
"provider": "github",
"owner": "yourname",
"repo": "my-app"
}
]
5. 最佳实践与常见坑
- 开发 vs 生产:使用
vite build/webpack先构建前端资源,再打包 Electron。 - ASAR 打包:默认启用,保护源码(但非加密);敏感代码可混淆或用 bytenode。
- 体积优化:排除 devDependencies;使用
prune;压缩 executable(UPX)。 - 跨平台构建:推荐 CI(如 GitHub Actions):
- Windows/macOS runner 构建对应平台
- Linux 用 Docker
- 版本管理:每次发布前递增
version,否则更新检测失败。 - 测试安装包:在干净虚拟机中测试安装、卸载、更新流程。
使用 electron-builder + electron-updater + GitHub Releases 的组合,是当前最成熟、最省心的打包与分发方案。如果你的项目使用 Vite + React/Vue 或有特殊需求(如企业内部分发、自定义安装器),可以提供更多信息,我可以给出更精确的配置示例!