人人都会AI编程

22.3 资源压缩:图片、静态资源、二进制资源优化

更新时间:2026-07-11

应用体积和加载速度直接影响到用户的第一印象。在 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 优化

使用 cssnanopostcsscssnano 插件来压缩 CSS 文件。它可以移除空白、合并相同规则、缩短颜色值等。如果使用 Tailwind CSS 等工具类框架,务必配合 purge(或 JIT 模式)移除未使用的样式类,否则一个 Tailwind 全量 CSS 可达数 MB。

3. 字体文件裁剪

如果应用中用到了自定义字体,中文字体文件动辄几 MB 甚至十几 MB。可以使用 font-spiderglyphhanger 工具,根据实际界面中使用到的文字集进行裁剪。另一种做法是在渲染进程中按需加载字体,而不是一次性嵌入所有语系的字形。

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 文件)、第三方可执行文件(如 ffmpegaria2c)或者大型数据文件。这类资源不能像文本资源那样直接压缩,优化策略更多是通过选择性包含、按需分发和外部化来实现。

1. 移除非必要平台的原生模块

很多 Node.js 原生模块在安装时会编译出与当前平台相匹配的 .node 文件,比如 better-sqlite3 包含了 linuxwin32darwin 等多个平台的预编译二进制。如果你只针对当前平台打包,可以在 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. 外部化外部工具

如果你的应用依赖 ffmpeg7zip 等大型可执行文件,尽量使用“首次使用时下载”或“可选功能”的策略,而不是把这些几十 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 的冗余。最终,你的安装包不仅加快了用户的下载速度,还降低了运行时内存和磁盘的占用,有效提升了应用的初始印象分。