当前位置: 首页 > article >正文

Electron应用上鸿蒙PC,安装包从180MB压到45MB,我做了哪些骚操作

Electron应用上鸿蒙PC安装包从180MB压到45MB我做了哪些骚操作上个月老板丢给我一个任务把现有的Electron应用搬到鸿蒙PC上。我花了两天把代码跑通了build了一版安装包一看体积——180MB。老板看了一眼表情很复杂。他倒没直说但我懂那意思一个鸿蒙桌面应用体积快赶上某些3A游戏启动器了用户下还是不下说实话Electron应用体积大是个老话题但在鸿蒙PC这个场景下问题更扎眼。鸿蒙PC用户目前不算多愿意尝鲜的往往是开发者或对体验敏感的人你丢过去一个近200MB的安装包第一印象就崩了。而且鸿蒙PC的磁盘空间管理、应用分发渠道比如华为应用市场对体积都有隐性的门槛。我花了一周时间死磕这个问题最终把安装包从180MB压到了45MB。过程中踩了不少坑有些坑官方文档根本不会提。下面记录一下完整过程代码可以直接拿去用。第一步搞清楚体积到底从哪来的磨刀不误砍柴工我先做了体积分析。Electron应用的体积大头通常三块Electron运行时本身、node_modules、以及静态资源图片、字体、本地化文件等。我找了一个工具——electron-builder自带的--dir模式可以不打包直接看输出目录结构再结合du在鸿蒙PC上我换成了ncdu因为du太慢了一层层往下扒。结果有点出乎我意料组件体积占比Electron运行时含Chromium等~115MB64%node_modules~45MB25%应用代码静态资源~20MB11%Electron运行时这块是最难啃的骨头占了快三分之二。node_modules也不冤枉——项目里塞了一堆用不上的依赖。应用代码反而占比最小。这个分析很重要因为它直接决定了我后续的优化策略主攻运行时裁剪和依赖瘦身应用代码本身空间不大。踩坑实录asar不是银弹我的第一反应是开asar打包把代码和资源全塞进去能省多少在electron-builder.yml里加了一行asar:true重新打包一看体积——183MB。比原来还大了3MB。我傻眼了。后来翻了electron-builder的源码才明白asar本身是一种归档格式有块对齐和索引开销。对于大量小文件比如node_modules里成千上万的JS文件asar打包后反而会变大。它的真正价值在于防止用户直接修改源码、以及减少文件句柄占用不是压缩体积。这玩意儿是个保护机制不是压缩工具。我一开始把它当压缩用方向就错了。真正有效的压缩得靠asarUnpack配合afterPack钩子做资源预处理或者直接换种思路——不是怎么包得更紧而是怎么把不需要的东西直接扔掉。砍掉Chromium的多语言包立竿见影Electron运行时里藏着一个很多人不知道的东西Chromium自带了将近50种语言的本地化文件locales/目录。每个语言包不大也就几百KB但加起来快10MB了。关键是我的应用只支持中文和英文。剩下那四十多种语言包纯纯的无效载荷。electron-builder其实有配置可以清这些但默认不开。我在electron-builder.yml里加了一段extraResources:-from:./assets/to:assets/filter:[**/*]electronDownload:mirror:https://npmmirror.com/mirrors/electron/afterPack:scripts/remove-locales.js然后写了一个scripts/remove-locales.jsconstfsrequire(fs);constpathrequire(path);exports.defaultasyncfunction(context){constlocalesDirpath.join(context.appOutDir,locales);if(!fs.existsSync(localesDir))return;constkeep[zh-CN.pak,zh-TW.pak,en-US.pak,en-GB.pak];constfilesfs.readdirSync(localesDir);letremoved0;for(constfileoffiles){if(!keep.includes(file)){fs.unlinkSync(path.join(localesDir,file));removed;}}console.log(Removed${removed}locale files, kept${keep.length});};这一步砍掉了约8MB。很爽。但注意鸿蒙PC上Electron的目录结构和Windows/Mac略有不同appOutDir的路径在鸿蒙环境下会落在resources/下我实际运行时调了两遍才把路径对齐。如果你在鸿蒙PC上跑这个脚本建议先console.log一下context.appOutDir确认路径再删。node_modules瘦身比想象中更脏node_modules占45MB里面混了大量测试文件、文档、TypeScript声明文件、甚至某些包的源码。这些东西生产环境压根用不上。我本来想手动一个个包去清理结果发现有个工具叫electron-builder的files配置配合!排除规则可以在打包阶段直接过滤。files:-!**/*.map-!**/*.d.ts-!**/test/**/*-!**/tests/**/*-!**/docs/**/*-!**/examples/**/*-!**/node_modules/.bin/**/*-!**/node_modules/**/*.md-!**/node_modules/**/*.ts-!**/node_modules/**/LICENSE*-!**/node_modules/**/README*-!**/node_modules/**/CHANGELOG*-!**/node_modules/**/package-lock.json-!**/node_modules/**/yarn.lock但这有个坑某些包比如sqlite3的.node原生模块旁边会带一个napi-v6之类的目录里面可能混着测试文件。如果你用上面的通配符一把梭有可能会误删原生模块依赖的辅助文件导致运行时MODULE_NOT_FOUND。我就踩过这个坑。better-sqlite3有一个build目录里面除了.node文件还有一个Release/obj.target/子目录存放编译中间产物。我一开始用!**/build/**想清理中间产物结果把.node也给排除了。后来改成更精确的规则files:-!**/node_modules/**/build/Release/obj.target/**/*-!**/node_modules/**/build/Release/.deps/**/*-!**/node_modules/**/deps/**/*-!**/node_modules/**/src/**/*只删obj.target、.deps、deps、src这些编译相关目录保留.node本体。这一步下来node_modules从45MB压到了18MB减了差不多六成。鸿蒙PC特有禁用不需要的Chromium功能鸿蒙PC的Electron构建默认启用了不少Chromium功能比如Widevine DRM、Pepper Flash虽然Flash已经死了但代码还在、以及Chrome扩展支持。这些在鸿蒙PC上基本用不上却实打实地占体积。我研究了一下Electron本身不支持像Chromium那样用gn args裁剪feature因为Electron是预编译的但可以通过electron-rebuild配合自定义Electron源码构建来实现。这个方案太重了我试了两天在鸿蒙PC上编译Electron源码直接把我机器内存吃满了而且编译出来的包还不稳定有些API行为变了。后来我换了个思路不裁剪Electron本体而是在应用启动时禁用不需要的功能这样虽然安装包体积不变但至少运行时内存占用下来了。而且更重要的是我发现了一个被忽视的点——Electron的app.setPath和userData配置可以影响一些缓存文件的生成策略减少磁盘占用。不过真正让安装包进一步缩水的是我发现electron-builder在鸿蒙PC上打包时默认会把整个swiftshader目录软件渲染器也打进去占大概15MB。鸿蒙PC目前基本都是带GPU的设备swiftshader其实用不上。// scripts/remove-swiftshader.jsconstfsrequire(fs);constpathrequire(path);exports.defaultasyncfunction(context){constswiftshaderDirpath.join(context.appOutDir,swiftshader);if(fs.existsSync(swiftshaderDir)){fs.rmSync(swiftshaderDir,{recursive:true,force:true});console.log(Removed swiftshader directory (~15MB));}};注意这个操作有风险。如果你的应用需要在纯软件渲染环境运行比如某些虚拟机或远程桌面删掉swiftshader会白屏。我在鸿蒙PC上测了真机和几个模拟器确认GPU可用才敢删。建议你根据自己的目标环境判断。静态资源图片格式和按需加载应用代码和静态资源原本只占了20MB但我检查了一下发现里面有一堆PNG截图和图标。PNG是无损格式对于照片类图片效率很低。我批量把截图转成了WebP图标用SVG替换最终静态资源从20MB压到了8MB。// 批量转换脚本需要sharp库constsharprequire(sharp);constfsrequire(fs);constpathrequire(path);constassetsDir./assets/images;constfilesfs.readdirSync(assetsDir).filter(ff.endsWith(.png));asyncfunctionconvert(){for(constfileoffiles){constinputpath.join(assetsDir,file);constoutputpath.join(assetsDir,file.replace(.png,.webp));awaitsharp(input).webp({quality:85}).toFile(output);fs.unlinkSync(input);console.log(Converted${file});}}convert();另外有些页面用到的第三方库比如图表库我改成了按需加载而不是在index.html里全局引入。这部分优化对安装包体积没直接帮助但启动速度有明显提升。最终成果做完上面这些优化重新打包优化项节省体积累计基线-180MB清理Chromium多语言包-8MB172MBnode_modules瘦身去测试/文档/源码-27MB145MB移除swiftshader鸿蒙PC特化-15MB130MB静态资源转WebP/SVG-12MB118MB应用代码压缩去map文件-5MB113MB开启compressionnsis/web-68MB45MB最后一刀是electron-builder的compression配置。之前用的是默认的normal我改成maximumcompression:maximum这一步让安装包从113MB直接压到45MB。代价是打包时间从3分钟变成了12分钟安装时解压也慢一些。但对于分发场景来说安装包体积小比打包时间长重要得多。不过maximum压缩在某些老旧CPU上解压会比较慢如果你的用户群体设备性能一般可以考虑store解压快但体积大或normal平衡。我个人在鸿蒙PC上测了几台设备性能都还不错maximum完全能扛。一些个人建议体积优化这事没有一劳永逸的方案。你每加一个npm包每更新一次Electron版本体积都可能反弹。我建议把体积检测做成CI的一部分在打包流程里加一个阈值检查// scripts/check-bundle-size.jsconstfsrequire(fs);constMAX_SIZE_MB50;constinstallerfs.statSync(dist/ElectronApp-1.0.0.exe);constsizeMBinstaller.size/1024/1024;if(sizeMBMAX_SIZE_MB){console.error(Bundle size${sizeMB.toFixed(2)}MB exceeds limit${MAX_SIZE_MB}MB);process.exit(1);}还有个感受很多Electron开发者包括我自己对安装包体积这个事没那么敏感反正现在网速快了磁盘大了。但一旦你的应用要进应用市场、要发更新包、要在企业内网分发体积就成了一个硬指标。特别是鸿蒙PC目前生态还在早期用户对第一个印象很看重一个小而快的应用比一个功能多但臃肿的应用更容易被接受。说到底做桌面应用跟做后端服务不一样用户的感知是直接的——点一下多久出来占多少磁盘风扇转不转这些细节加起来决定了你的应用是好用还是将就。本文遵循 MIT 协议发布。转载请注明出处商业转载请联系作者获得授权。

相关文章:

Electron应用上鸿蒙PC,安装包从180MB压到45MB,我做了哪些骚操作

Electron应用上鸿蒙PC,安装包从180MB压到45MB,我做了哪些骚操作 上个月老板丢给我一个任务:把现有的Electron应用搬到鸿蒙PC上。我花了两天把代码跑通了,build了一版安装包,一看体积——180MB。老板看了一眼&#xff0…...

B站m4s转MP4终极指南:一键解决缓存视频兼容性问题

B站m4s转MP4终极指南:一键解决缓存视频兼容性问题 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经遇到过这样的困扰&#…...

接口自动化测试框架搭建:基于Python+Requests+Pytest的实战教程

在软件测试领域,接口自动化测试是保障系统稳定性、提升测试效率的关键手段。随着敏捷开发和DevOps理念的普及,自动化测试的重要性愈发凸显。Python凭借其简洁的语法、丰富的库生态,成为接口自动化测试的首选语言;Requests库让HTTP…...

【亲测免费】 ADS1118驱动程序

ADS1118驱动程序 【下载地址】ADS1118驱动程序 本仓库提供了专用于ADS1118模数转换器(ADC)的驱动程序。ADS1118是一款高性能、高精度的16位模拟到数字转换器,广泛应用于需要精准测量的应用场景中,例如传感器数据采集系统、医疗设备…...

Auto Edit 日常迭代踩坑实录:OpenAI Codex CLI 三种权限模式配置差异与 2 类高频报错修复

1. Auto Edit 模式不是“全自动”,而是最易失控的权限模式 大多数人第一次在项目里启用 codex cli --mode=auto-edit,是冲着“自动改代码”去的。我也是。直到某天凌晨两点,CI 流水线突然报出 17 个 test failure,而 git diff 显示——它把一个 if (user.role === admin) …...

SAP EWM实战:从产品到处理单位,两种库存转移操作保姆级教程

SAP EWM库存转移实战指南:产品与处理单位的精准操作 在仓库管理的日常工作中,库存转移是最基础却最容易出错的环节之一。特别是对于刚接触SAP EWM系统的管理员来说,面对不同形态的物料——散件产品和带包装的处理单位(HU),往往会产…...

Cadence Allegro实战:除了Shape Keepout,还有哪些方法能精准控制铺铜区域?

Cadence Allegro实战:5种精准控制铺铜区域的进阶技巧 在复杂PCB设计中,铺铜区域的控制往往决定了信号完整性和EMC性能。Shape Keepout虽然是设计师最熟悉的工具,但Allegro其实提供了更丰富的"Areas"类命令集。本文将深入解析Route …...

别再傻傻分不清了!给硬件工程师的SI、PI、EMI关系速查手册(附高频PCB设计实例)

硬件工程师实战指南:SI、PI、EMI的三角关系与高频PCB设计避坑 当你第一次面对DDR4布线导致的EMI测试失败时,可能会陷入这样的困惑:明明是信号完整性问题,为什么整改方案却是调整电源层的去耦电容?这种看似跨领域的因果…...

从零开始用vnpy搭建你的第一个量化交易机器人(保姆级Python教程)

从零开始用vnpy搭建你的第一个量化交易机器人(保姆级Python教程) 第一次接触量化交易时,我被那些复杂的术语和代码吓得不轻。直到发现vnpy这个Python框架,才真正找到了入门的方向。vnpy就像是为Python开发者量身定制的量化交易工具…...

别再只用BLAST了!试试MAFFT+HMMER这套组合拳,挖掘基因家族新成员更精准

基因家族分析进阶指南:MAFFT与HMMER的高效组合策略 在基因组学研究领域,识别基因家族成员是一项基础而关键的工作。传统方法如BLAST虽然广为人知,但在面对远缘同源基因或高度分化的基因家族时,其灵敏度往往不尽如人意。这时&#…...

别再手动复制粘贴了!用poi-tl + Spring Boot自动生成带表格、二维码的Word领料单(附完整源码)

基于poi-tl的Spring Boot领料单自动化生成实战指南 在企业日常运营中,领料单这类标准化文档的生成往往占据大量重复性工作时间。传统的手工复制粘贴不仅效率低下,还容易出错。本文将介绍如何利用poi-tl这一强大的Word模板引擎,结合Spring Bo…...

Solidworks 2018+ 机器人模型避坑指南:用SW2URDF插件导出URDF,再导入Webots R2023a完整流程

SolidWorks 2018机器人模型导入Webots全流程避坑指南 在机器人仿真领域,将SolidWorks设计的机械模型准确导入Webots仿真环境是一个关键但充满挑战的环节。许多工程师和学生在初次尝试这一流程时,往往会在版本兼容性、文件路径、坐标系设置等环节遭遇各种…...

如何高效下载B站视频:BiliDownloader终极使用教程

如何高效下载B站视频:BiliDownloader终极使用教程 【免费下载链接】BiliDownloader BiliDownloader是一款界面精简,操作简单且高速下载的b站下载器 项目地址: https://gitcode.com/gh_mirrors/bi/BiliDownloader 想要轻松保存B站上的精彩视频内容…...

【亲测免费】 YMODEM发送端程序C代码

YMODEM发送端程序C代码 【下载地址】YMODEM发送端程序C代码 YMODEM发送端程序C代码 项目地址: https://gitcode.com/open-source-toolkit/8ede80 资源文件介绍 文件名 YMODEM.7z 文件描述 本资源文件包含了一个完整的YMODEM发送端程序的C代码,适用于STM3…...

芯片与封装热协同设计:当“先进制程”遇上“散热墙”

🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 211、985硕士,从业16年 从事结构设计、热设计、售前、产品设计、项目管理等工作,涉足消费电子、新能源、医疗设备、制药信息化、核工业等…...

告别黑盒:手把手教你用VTK在QT中‘组装’并驱动SolidWorks导出的机械臂模型

从STL零件到可交互机械臂:VTKQT三维可视化开发实战 机械臂的数字化仿真一直是工业自动化与机器人教学中的核心课题。想象一下,当你从SolidWorks中导出一堆零散的STL文件,如何在代码中让它们"活"起来——每个关节都能独立旋转&#…...

别再为测试视频发愁了!手把手教你用FFmpeg生成YUV/RGB原始数据(附播放命令)

音视频开发实战:FFmpeg高效生成与播放YUV/RGB测试素材指南 在音视频编解码器开发、计算机视觉算法测试或多媒体性能调优过程中,开发者经常面临一个共同难题:如何快速获取特定像素格式的原始视频数据作为测试素材?网上现成的YUV或R…...

【亲测免费】 Python Qt 图形界面编程资源下载

Python Qt 图形界面编程资源下载 【下载地址】PythonQt图形界面编程资源下载 《Python Qt 图形界面编程》课程涵盖了PySide2、PyQt5、PyQt和PySide等框架的使用,帮助学习者掌握Python图形化界面编程的核心知识。课程内容详实,适合初学者入门,…...

【免费下载】 MobaXterm 专业版 - 无Session限制免费版

MobaXterm 专业版 - 无Session限制免费版 【下载地址】MobaXterm专业版-无Session限制免费版 MobaXterm 专业版 - 无Session限制免费版欢迎使用MobaXterm专业版特别资源 项目地址: https://gitcode.com/open-source-toolkit/9ce1a 欢迎使用MobaXterm专业版特别资源。此版…...

告别WinForm!用C#和MetroFramework快速搭建现代化工控上位机UI(附完整源码)

用C#和MetroFramework打造现代化工控上位机界面的实战指南 在工业自动化领域,上位机软件的用户体验往往被忽视。许多工程师仍然在使用传统的WinForm开发界面,这些界面虽然功能完备,但视觉效果和交互体验已经远远落后于现代软件的标准。本文将…...

告别默认设置!用Altium Designer 21规则模板,5分钟搞定四层板全流程设计规范

告别重复劳动:Altium Designer 21规则模板的高效应用指南 在电子设计领域,效率与标准化往往决定了项目成败。想象一下这样的场景:当你接手一个新的四层板设计项目时,是否曾为反复配置那些看似相同却又容易遗漏的设计规则而烦恼&a…...

Sparse4D v3 去噪模块实战:手把手教你用PyTorch实现3D时序目标检测中的噪声抑制

Sparse4D v3去噪模块深度解析:从理论到PyTorch实战 1. 三维目标检测中的噪声挑战与去噪机制演进 在自动驾驶和机器人感知领域,三维目标检测系统面临着复杂的噪声环境。传感器噪声、遮挡、光照变化以及物体外观多样性等因素,都会在检测过程中引…...

【亲测免费】 OpenCV 4.5.5 + opencv-contrib-4.5.5 编译所需下载文件说明

OpenCV 4.5.5 opencv-contrib-4.5.5 编译所需下载文件说明 【下载地址】OpenCV4.5.5opencv-contrib-4.5.5编译所需下载文件说明 OpenCV 4.5.5 opencv-contrib-4.5.5 编译所需下载文件说明本仓库提供了编译OpenCV 4.5.5及其贡献模块(opencv-contrib)所需的第三方依赖文件和额外…...

CTF夺旗赛利器:手把手教你用GitHack挖掘.git泄露背后的Web漏洞

CTF夺旗赛利器:手把手教你用GitHack挖掘.git泄露背后的Web漏洞 在CTF竞赛和实战渗透测试中,.git目录泄露一直是Web安全领域的经典漏洞场景。这种看似简单的配置错误,往往能成为攻击者打开系统后门的金钥匙。本文将带您深入探索如何利用GitHac…...

【亲测免费】 Zebra打印机中文转ZPL指令的.NET实现

Zebra打印机中文转ZPL指令的.NET实现 【下载地址】Zebra打印机中文转ZPL指令的.NET实现 本项目提供了一个用于将中文文本转换为ZPL指令的.NET实现,旨在替代Zebra官方提供的非托管组件FNTHEX32.DLL。该组件在托管环境下需要额外的封装,并且缺乏64位程序的…...

Apple Music断供后歌单全没?别慌!用iTunes导出的XML文件+Excel手动抢救歌单(保姆级图文教程)

Apple Music断供后歌单全没?别慌!用iTunes导出的XML文件Excel手动抢救歌单(保姆级图文教程) 当你发现Apple Music因断供导致精心收藏的歌单全部消失时,那种心情就像突然失去了多年的音乐记忆。别担心,这份…...

【亲测免费】 ST官方开源电机库FOC5.0:电机控制的利器

ST官方开源电机库FOC5.0:电机控制的利器 【下载地址】ST官方开源电机库FOC5.0下载仓库 ST官方开源电机库FOC5.0 下载仓库本仓库提供ST官方开源的电机库FOC5.0的资源文件下载 项目地址: https://gitcode.com/open-source-toolkit/a21b5 项目介绍 在电机控制领…...

长期使用聚合API平台,对账单清晰度与费用追溯的满意度反馈

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用聚合API平台,对账单清晰度与费用追溯的满意度反馈 作为一名长期负责项目维护的开发者,我所在团队在…...

Perplexity视频查询效率提升300%的5个硬核参数配置,附可复用的CLI+Browser自动化脚本

更多请点击: https://kaifayun.com 第一章:Perplexity视频教程查询的性能瓶颈与优化价值 Perplexity 在处理视频教程类查询时,常面临语义理解深度不足、多模态信息对齐延迟及缓存命中率偏低三重性能瓶颈。当用户输入如“如何用 PyTorch 实现…...

Google关键词能带来多少流量?大词和长尾词的真实流量比例

一家销售软件的公司耗费六个月将“CRM”排至谷歌首页第五名。该词每月产生50万次搜索。网页获得2100次点击。跳出率高达89%。停留时间仅12秒。投入资金4万美元。获得零份询盘。做“外贸企业定制管理软件”排名首页第一。此词汇每月搜索量150次。每月收获62次点击。停留时间4分3…...