你的Electron应用打包后体积太大?试试这些优化技巧,让.exe文件‘瘦身’一半

张开发
2026/4/8 16:23:50 15 分钟阅读

分享文章

你的Electron应用打包后体积太大?试试这些优化技巧,让.exe文件‘瘦身’一半
Electron应用打包体积优化实战从百MB到50MB的进阶技巧每次看到自己精心开发的Electron应用打包后变成一个臃肿的.exe文件那种感觉就像看着心爱的宠物被喂成了球——功能完整但实在不够优雅。最近接手的一个项目初始打包体积竟然达到了惊人的180MB经过系列优化后成功缩减到82MB用户下载量直接提升了37%。下面分享这些实战中验证有效的瘦身方案。1. 诊断体积膨胀的元凶在开始优化前我们需要像医生一样先找出导致肥胖的病因。Electron应用体积主要由以下几部分组成Electron基础框架Chromium Node.js Electron核心这部分是固定成本Node_modules依赖项目中安装的各种npm包静态资源图片、字体、视频等媒体文件源代码经过编译/压缩后的业务代码开发依赖误打包进生产环境的devDependencies典型体积分析案例使用webpack-bundle-analyzer生成node_modules/ ├─ electron/ 45MB (基础框架) ├─ lodash/ 2.1MB ├─ moment/ 2.8MB ├─ material-ui/ 8.4MB static/ ├─ images/ 12MB (未压缩) ├─ fonts/ 6.3MB dist/ ├─ main.js 1.2MB ├─ renderer.js 4.7MB提示使用du -sh ./node_modules快速查看node_modules目录大小通常这是最需要开刀的部分2. 依赖项精准手术Tree Shaking实战2.1 基础依赖优化首先检查package.json中的依赖声明确保开发依赖不会混入生产环境{ dependencies: { electron-squirrel-startup: ^1.0.0 }, devDependencies: { electron: ^28.0.0, electron-builder: ^24.0.0 } }关键配置在electron-builder.json中设置{ build: { asar: true, asarUnpack: **/*.node, files: [!**/node_modules/${devDependencies} } }2.2 前端库的按需引入以常用的UI库为例对比全量引入与按需引入的体积差异引入方式体积示例代码全量引入8.4MBimport { Button } from material-ui/core按需引入1.2MBimport Button from material-ui/core/Button单独打包组件0.6MB直接引入编译后的ESM版本实测案例// 优化前全量引入 import { Menu, Dialog, Button, TextField } from material-ui/core; // 优化后按需引入 import Menu from material-ui/core/Menu; import Dialog from material-ui/core/Dialog;2.3 替代方案对比表某些常用库存在更轻量的替代品原库体积替代方案体积适用场景moment329KBdate-fns78KB日期处理lodash532KBlodash-es287KB工具函数axios124KBky56KBHTTP请求electron-store45KBconf28KB本地配置存储3. 资源文件压缩实战3.1 图片优化方案对比格式工具压缩率适用场景PNGpngquant70%带透明度的复杂图像JPEGmozjpeg65%照片类图像SVGsvgo40%矢量图标WebPcwebp75%现代浏览器支持实操命令# 安装压缩工具 npm install -g pngquant mozjpeg svgo webp # 批量压缩PNG find ./static -name *.png -exec pngquant --force --output {} {} \; # 转换WebP find ./static -name *.jpg -exec cwebp -q 80 {} -o {}.webp \;3.2 字体子集化中文字体文件通常有几MB大小但实际可能只用到几十个字符// 使用fontmin生成子集 const Fontmin require(fontmin); const fontmin new Fontmin() .src(fonts/SourceHanSans.ttf) .use(Fontmin.glyph({ text: 仅包含实际使用的字符 })) .dest(dist/fonts);4. 高级打包配置技巧4.1 asar智能解包配置某些二进制文件需要从asar中解压出来单独存放{ asar: true, asarUnpack: [ **/*.node, **/sqlite3/**, **/ffmpeg/** ] }4.2 多平台差异化打包通过环境变量实现条件编译// 在webpack.config.js中 const platform process.env.PLATFORM; module.exports { plugins: [ new webpack.DefinePlugin({ __LINUX__: platform linux }) ] };对应package.json配置{ scripts: { build:win: PLATFORMwin npm run build, build:mac: PLATFORMmac npm run build } }5. 持续优化监控体系建立体积监控机制防止反弹在CI中添加体积检查#!/bin/bash MAX_SIZE100000000 # 100MB ACTUAL_SIZE$(du -b dist/app.exe | cut -f1) if [ $ACTUAL_SIZE -gt $MAX_SIZE ]; then echo 体积超标当前${ACTUAL_SIZE}字节 限制${MAX_SIZE}字节 exit 1 fi使用webpack stats生成趋势图const { BundleAnalyzerPlugin } require(webpack-bundle-analyzer); module.exports { plugins: [ new BundleAnalyzerPlugin({ analyzerMode: static, reportFilename: report.html }) ] };在项目根目录放一个.dockerignore文件避免无关文件被打包.git node_modules *.log .DS_Store *.md test/经过这些优化我们的企业级应用安装包从初始的183MB降到了82MB用户安装完成率提升了22%。最有效的三项措施分别是图片转WebP节省31MB、移除无用依赖节省28MB和字体子集化节省11MB。

更多文章