应用体积和加载速度直接影响到用户的第一印象。在 Electron 项目中,资源文件(图片、字体、静态页面、原生模块等)通常会占据包体的很大一部分。通过合理的压缩和优化,不但能减少安装包的大小,还能加快窗口的首次渲染速度。这一节聚焦三种最常见资源的优化策略:图片、静态资源以及二进制资源。
22.3.1 图片压缩
Electron 应用中图片的使用场景主要有两个:应用内的图标、插画、背景等 UI 素材,以及打包时使用的应用图标(如 .ico、.icns)。对于前者,压缩不仅能减小 ASAR 归档的体积,还能减轻渲染进程在解码图片时的 CPU 和内存负担。
工具选择:
- imagemin:一个经典的 Node.js 图片压缩工具,支持 JPEG、PNG、SVG、GIF 等多种格式。通过插件机制,可以灵活地配置压缩率。
- sharp:一个高性能的图片处理库,也可以用来批量转换格式和尺寸,同时进行压缩。速度比 imagemin 更快,适合构建流程中使用。
- 在线服务:如 TinyPNG、Squoosh 等,适合一次性处理少量图片,但不应作为自动化流水线的一部分。
在构建流程中集成:
推荐在 Webpack 或 Vite 的构建配置中加入图片压缩步骤。以 Webpack 为例,可以使用 image-minimizer-webpack-plugin 配合 imagemin:
// webpack.renderer.config.js
const ImageMinimizerPlugin = require('image-minimizer-webpack-plugin');
module.exports = {
// ... 其他配置
optimization: {
minimizer: [
new ImageMinimizerPlugin({
minimizer: {
implementation: ImageMinimizerPlugin.imageminMinify,
options: {
plugins: [
['mozjpeg', { quality: 80 }], // JPEG 压缩
['pngquant', { quality: [0.6, 0.8] }], // PNG 有损压缩
['svgo', { plugins: [{ name: 'removeViewBox', active: false }] }],
],
},
},
}),
],
},
};
Vite 用户可以直接利用 vite-plugin-imagemin 插件:
// vite.renderer.config.ts
import imagemin from 'vite-plugin-imagemin';
export default {
plugins: [
imagemin({
gifsicle: { optimizationLevel: 3 },
mozjpeg: { quality: 80 },
pngquant: { quality: [0.6, 0.8] },
svgo: { plugins: [{ removeViewBox: false }] },
}),
],
};
关键参数建议:
- JPEG 质量 80-85:这个区间肉眼几乎看不出差别,但文件大小能减少 30%-50%。
- PNG 使用有损压缩:
pngquant可以将 PNG-24 转成 PNG-8 并调节调色板,体积可以变为原来的 1/4。 - SVG 优化:移除无用命名空间、合并路径、精确数值,通常能减少 20%-40% 的体积。
对于打包时需要用到的应用图标(通常放在 build/ 目录下),不需要在构建流程中压缩,应该直接提供已优化好的文件确保原图的清晰度。
22.3.2 静态资源优化(HTML/CSS/JS)
静态资源的优化本质上与 Web 应用开发相同,只是最终多了一层 ASAR 打包。以下三项操作应该成为你的常规构建步骤。
1. 代码压缩与摇树(Tree Shaking)
确保使用生产模式的打包工具(mode: 'production'),开启代码压缩和死代码消除。Webpack 默认的 terser-webpack-plugin 和 Vite 的 esbuild 都能做到这一点。但要注意,如果你在主进程代码中使用了动态 require 或 Node.js 原生模块路径,可能需要配置好外部依赖(externals),避免将 Node.js 核心库打包进去。
// webpack.main.config.js
module.exports = {
// ...
externals: {
electron: 'commonjs electron',
'better-sqlite3': 'commonjs better-sqlite3',
},
optimization: {
minimize: true,
},
};
2. CSS 优化
使用 cssnano 或 postcss 的 cssnano 插件来压缩 CSS 文件。它可以移除空白、合并相同规则、缩短颜色值等。如果使用 Tailwind CSS 等工具类框架,务必配合 purge(或 JIT 模式)移除未使用的样式类,否则一个 Tailwind 全量 CSS 可达数 MB。
3. 字体文件裁剪
如果应用中用到了自定义字体,中文字体文件动辄几 MB 甚至十几 MB。可以使用 font-spider 或 glyphhanger 工具,根据实际界面中使用到的文字集进行裁剪。另一种做法是在渲染进程中按需加载字体,而不是一次性嵌入所有语系的字形。
4. HTML 压缩
Electron 渲染进程加载的是本地 HTML 文件,所以可以在打包过程中对 HTML 进行压缩。html-webpack-plugin 自身提供了 minify 选项:
new HtmlWebpackPlugin({
template: './src/index.html',
minify: {
collapseWhitespace: true,
removeComments: true,
removeRedundantAttributes: true,
},
});
22.3.3 二进制资源优化
Electron 项目中的“二进制资源”通常指 Node.js 原生模块(.node 文件)、第三方可执行文件(如 ffmpeg、aria2c)或者大型数据文件。这类资源不能像文本资源那样直接压缩,优化策略更多是通过选择性包含、按需分发和外部化来实现。
1. 移除非必要平台的原生模块
很多 Node.js 原生模块在安装时会编译出与当前平台相匹配的 .node 文件,比如 better-sqlite3 包含了 linux、win32、darwin 等多个平台的预编译二进制。如果你只针对当前平台打包,可以在 package.json 中设置 "postinstall" 脚本清理掉多余平台的文件,或者在 electron-builder 的 files 配置中明确排除:
// package.json 中的 electron-builder 配置
"build": {
"files": [
"dist/**/*",
"node_modules/**/*",
"!node_modules/**/prebuilds/{linux,win32,darwin}-x64/*",
]
}
这样打包时只会包含与目标平台一致的原生库。
2. 使用 ASAR 打包并压缩资源
Electron 默认以 asar 格式打包应用资源,它是一种归档格式,本身不进行压缩。但你可以通过 electron-builder 的 asar 配置项开启资源压缩,以减小安装包体积:
"asar": {
"smartUnpack": true
},
"compression": "maximum"
smartUnpack: true会智能地将某些不能直接打包进 ASAR 的文件(如原生模块、node_modules 中带二进制资源的包)解压到外层,防止运行时报错。compression: "maximum"以及"asar.unpackDir"等选项可以进一步控制压缩粒度和解压策略。
3. 外部化外部工具
如果你的应用依赖 ffmpeg、7zip 等大型可执行文件,尽量使用“首次使用时下载”或“可选功能”的策略,而不是把这些几十 MB 的文件直接打入基础安装包。可以通过 electron-dl 或主进程的 net 模块在应用启动后从服务器拉取,然后缓存到用户数据目录(app.getPath('userData')),避免安装包虚胖。
4. 剥离调试符号
对于自己用 C++ 编写的原生扩展或 fork 的 Electron 二进制文件,编译时务必剔除调试符号(strip)。例如在 binding.gyp 中添加:
'conditions': [
['OS!="win"', {
'cflags!': [ '-g' ],
'cflags': [ '-O2' ],
'xcode_settings': {
'OTHER_CFLAGS': [ '-O2' ]
},
}],
]
Windows 下则通过 MSVC 的 /O2 和 /GL 优化,并确认发布版本不包含 PDB 文件。
通过上面这些针对性措施,图片可以瘦身 60%,CSS/JS 资源可压缩到原始尺寸的 30% 以下,二进制资源通过合理剥离和选择性包含能轻松砍掉数十 MB 的冗余。最终,你的安装包不仅加快了用户的下载速度,还降低了运行时内存和磁盘的占用,有效提升了应用的初始印象分。