如何使用electron-builder减小Mac端Electron应用体积并了解app.asar?
app.asar 文件的内部存储构成
asar 是 Electron 官方定义的单文件归档格式,作用是把零散的项目资源、代码整合成一个只读大文件,既避免暴露源码目录的零散结构,也能提升应用启动时的资源加载速度。正常情况下这个文件的体积应该和Windows端应用的resources目录体积基本一致,你这边这个文件占1.22G属于明显异常,本质是打包时把不该纳入的内容塞了进去,不是asar格式本身的问题。
asar内部常规存储的内容主要分三类:
- 业务侧编写的全部可运行代码:包括前端框架打包后的dist产物、主进程/渲染进程的脚本、自定义配置文件
- 项目生产依赖:也就是package.json中
dependencies字段声明的第三方Node包代码,devDependencies下的开发工具、测试框架类依赖默认不会被打包进这里 - 手动纳入打包范围的静态资源:比如本地字体、应用图标、内置的离线二进制、本地文档等
要查看asar内部的具体内容,直接调用asar工具解包即可,不需要复杂操作:npx asar extract /Applications/你的应用名称.app/Contents/Resources/app.asar ~/Desktop/asar_unpacked
解包完成后在输出目录按文件夹体积排序,就能快速定位到底是哪个冗余内容占了几百M甚至上G的空间,排查效率很高。
Mac端安装包体积压缩优化方案(匹配Windows端70M级别的合理体积)
你目前遇到的Mac端1.39G、Windows端70M的体积差,核心原因基本不是Mac平台本身占空间大,而是打包流程存在大量可清理的冗余,按下面的步骤调整就能快速把体积压到合理范围:
- 先清理asar内部的冗余内容
解包后的asar目录如果出现下面任意一种情况,直接调整打包规则排除即可:- 把devDependencies的内容打进了生产包:比如webpack、vite、jest这类开发用的包如果被误写到了
dependencies字段,electron-builder就会把它们全量打进asar,这部分内容动辄能占几百M - 打包规则配置太宽泛,把非必要目录全扫进去了:比如很多人配置electron-builder的files字段时偷懒写了
"./**/*",会导致项目根目录的.git文件夹、测试文件、文档、历史打包产物甚至缓存目录全部被纳入打包范围,光.git文件夹就能轻松占几百M - 静态资源冗余:比如项目里存了大体积的测试视频、未压缩的原图、重复的字体文件,这些如果被匹配进打包范围,会直接撑大asar体积
- 把devDependencies的内容打进了生产包:比如webpack、vite、jest这类开发用的包如果被误写到了
- 解决双架构包的冗余打包问题
这是很多人Mac包远大于Windows包的核心原因:新版electron-builder默认会同时构建适配Intel芯片(x64)和Apple芯片(arm64)的两套Electron运行时,两个架构的运行时加起来就接近1G。
优化方式非常简单:不要把两个架构的二进制塞到同一个dmg包里,根据发布渠道单独打对应架构的单包——给Intel用户发x64包,给Apple芯片用户发arm64包,单架构的Electron运行时本身只有几十M,不会额外产生近1G的冗余。现在绝大多数应用分发平台都支持根据用户设备的芯片架构自动匹配对应的安装包,完全不需要强行做一个全兼容的超大体积包 - 调整electron-builder的压缩配置
在构建配置里把压缩级别调整为最高档,即设置compression: "maximum",配合asar的归档压缩,整体包体积可以再压缩30%-40%,这个级别的压缩对应用启动速度的影响几乎感知不到 - 精准配置files规则,只纳入需要的内容
不要用宽泛的通配符,明确写清楚要打包的目录,同时排除所有非必要内容,示例配置参考:
这种配置下electron-builder只会扫描你明确允许的目录,不会把无关的冗余内容打进去"build": { "files": [ "dist/**/*", "!**/{.git,node_modules/.cache,test,docs,*.md,*.log}" ] }
内容的提问来源于stack exchange,提问作者Mahmoud Farargy
相关产品推荐
相关产品推荐

