一、 客户端包体积失控的三大隐蔽物理陷阱

键盘小鹿全键位分区指法专项练习

很多团队认为只要配置了 Webpack 或 Vite 的常规 Tree-Shaking,打包出来的安装包就自然是最小的。然而在桌面教育客户端开发中,由于涉及海量图片、音效、旧版题库与不同分发渠道的原生链接库(DLL),传统的构建工具对非代码资产(Static Assets)的追踪存在巨大的盲区:

打包器在面对这种变量插值表达式时,默认策略通常是将 ../assets/badges/ 下所有的几百张图片全盘打包。如果美术在目录中存放了未采用的草稿或废弃徽章,它们将被一股脑打进生产环境客户端。

  • A & B & C & D -> KeyDeerPruningEngine
  • KeyDeerPruningEngine -> PureRelease["输出 42MB 极致精悍安装包"]
  • 1. 致命的 public/ 盲区陷阱: 在 Vite 或 Webpack 体系下,放置在 public/ 或 static/ 目录下的所有文件会无条件原样拷贝到最终的输出目录中。当教研团队迭代关卡、美术重构小游戏UI时,旧版的序列帧切图由于没有显式被删除,长年累月堆积在目录中,成为无主但永远霸占安装包体积的“幽灵资产”。
  • 2. 动态模板字符串导致打包器“全量妥协”: 打字训练界面中存在大量按星级、关卡或输入状态动态切换的资源,例如:
  • 3. 多渠道商业分发包的原生依赖污染: 键盘小鹿不仅提供官网通用的绿色纯净免安装版,同时还面向 360 软件管家渠道、360 Plus 专版以及联想应用商店定制了不同的渠道包。不同渠道引入了特定的原生支付库、特权通信动态链接库(.dll)。如果缺乏严密的构建隔离,标准版会被迫携带这些与它无关的 DLL,不仅包体积徒增 30MB+,更会导致标准版在无对应环境的电脑上启动时出现 DLL 缺失报错。

二、 键盘小鹿基于 AST 的运行时资产审计引擎架构

为了实现对全量资产的“精准追踪、动态识别、自动隔离”,我们在代码库中研发了专属的静态资产审计器 scripts/runtimeAssetAudit.ts:

  • ScanCode -> ParseAST
  • ParseAST & ScanPhysical -> Reachability["4. 构建双向可达性引用拓扑图 (Reachability Graph)"]
  • Reachability -> InUse{"被代码实际引用?"}
  • InUse -- 确定引用 -> Bundle["保留在输出清单中 (In-Bundle)"]
  • InUse -- 孤立无主 -> AutoArchive["自动迁移至隔离归档区<br>(design/archived-runtime-assets)"]
  • AutoArchive -> CIGate["CI 强制拦截并输出审计报告"]
  • 1. 核心审计器实现代码(runtimeAssetAudit.ts): 审计器结合了精确的 AST 语法分析与动态字符串模式反向推导,支持智能识别 badge_${idx}.png 等变量插值表达式:

三、 四渠道同源构建与特权依赖物理隔离

键盘小鹿打字训练游戏大厅

针对不同分发场景,键盘小鹿设计了 TYPEDEER_BUILD_VARIANT 环境变量矩阵,配合 electron-builder.config.cjs 实施动态依赖切片:

四渠道打包策略与体积对比清单:

在 electron-builder.config.cjs 中,我们通过函数式配置根据渠道动态过滤外部打包文件:

渠道代号商业与业务定位差异化依赖与动态裁剪策略最终安装包体积
standard官网官方纯净绿色版彻底剔除所有特定厂商原生 DLL,仅保留纯净打字内核与本地题库41.8 MB (最精悍)
360360 软件管家渠道仅打包 360 标准身份互通接口,剥离 Plus 专享后台守护通信组件43.2 MB
360plus360 会员专属特权版条件引入专属会员免密通行证动态链接库,提供绿色加速通道45.6 MB
lenovo联想应用商店专版仅打包联想特定设备驱动感知与应用中心校验桥44.1 MB
  • BuildTrigger -> EnvDetector
  • EnvDetector -> |standard| V1["官方标准版: 排除所有第三方渠道 DLL / 启用通用免费与会员引导"]
  • EnvDetector -> |360| V2["360安全渠道版: 注入 360 认证通道 / 排除 Plus 特权库"]
  • EnvDetector -> |360plus| V3["360 Plus 专版: 注入 360 Plus 专有通信桥与原生特权 DLL"]
  • EnvDetector -> |lenovo| V4["联想专版: 注入联想应用中心原生支付插件"]
  • V1 & V2 & V3 & V4 -> BuilderConfig["electron-builder 动态配置映射层"]
  • BuilderConfig -> OutputZip["输出精确剪枝的独立渠道 ZIP / 安装包"]

四、 工业级排查复盘:动态引用误杀排查实录

在推进自动化资产审计的早期阶段,我们遭遇了一次由于动态引用导致的误删生产事故:

由于代码中没有直接写出 badge_1.webp 到 badge_40.webp 的完整字面量,早期的审计脚本将其扫描后判定为“0 引用”,直接把 40 张精美勋章切图全部隔离到了归档目录,导致生产包打包后荣誉墙页面一片空白!

function getBadgeIcon(badgeId: number) {
  return new URL(`../assets/badges/badge_${badgeId}.webp`, import.meta.url).href
}
  • 1. 故障复盘:动态徽章图片被脚本判为“无主垃圾”: 在星星小屋系统中,共有 40 枚成长勋章。前端展示代码为了写得简洁,采用了如下写法:
  • 2. 根因解决与第一性原理重构: 我们坚决不靠人工“临时写死白名单”来打补丁,而是从第一性原理重构了规范与引擎双向对齐: - 第一步(规范收敛):要求所有多枚举资产必须在静态清单配置表(如 src/features/badges/catalog.ts)中显式使用 import 声明数组,或者列出合法 ID 枚举; - 第二步(审计器升级):审计引擎增加模式通配符(Glob Pattern)检测能力。若代码中存在 badge_${string}.webp,审计器会自动提取前缀 badge_ 与后缀 .webp,在物理目录中匹配同一组规律性资产,并校验其连续性(如编号是否从 1 到 40 完整无缺),一旦发现缺号立即报警,既防止了误删,又反向倒逼了美术素材的规范交付。

五、 资产治理前后工程指标对比

键盘小鹿高保真打字工作台与键位状态机
评测维度治理前(粗放式拷贝打包)治理后(AST 引用审计 + 四渠道隔离)优化收益率
Windows ia32 压缩包体积110.8 MB41.8 MB体积骤减 62.3%
未引用废弃图片总数142 张(累积旧素材)0 张(CI 强力拦截)废弃素材完全清零
多渠道 DLL 冗余占用各版本均携带所有 DLL (~28MB)按渠道按需装配 (0 ~ 3.8MB)多渠道包体互不干扰
弱网用户安装下载完成率78.4%96.2%转化率大幅提升 17.8%
CI 打包流水线耗时6 分 45 秒3 分 12 秒(剪枝后打包极速完成)耗时减半

常见问题

为什么键盘小鹿坚持生成 Windows ia32(32位)绿色包,而不是只提供 x64 版本?

打字训练软件的核心用户群体包括中小学校、家庭和计算机入门者。在大量学校的电子阅览室或乡村机房中,仍有一批配备早期英特尔/AMD 处理器的 32 位电脑系统(如 32 位 Windows 7)。在 Electron 架构下,ia32 架构的安装包可以 100% 完美无缝运行在 64 位现代 Windows 10/11 系统上(通过 WOW64 子系统),同时又能向下兼容真实的 32 位老旧系统。一份 ia32 免安装包便能通吃所有 Windows 桌面环境,极大地降低了教育信息化普及的设备门槛。

WebP 格式在桌面客户端中是否能获得稳定的硬件解码?

是的。键盘小鹿全量废除了大体积的 PNG 和 JPEG 格式,核心背景图与角色大图全部采用现代 WebP 格式存储。由于 Electron 内置了完整的现代 Chromium 内核,其底层的 Skia 图形渲染库原生深度集成了 WebP 硬件解码管线。在实测中,WebP 相比 PNG 节省了 45%~60% 的磁盘与带宽空间,而解码耗时却完全平齐甚至更快,保证了 60FPS 的丝滑动画。

为什么不直接把所有图片都存放在图床 CDN 上,客户端只存纯代码?

这是教育类工具软件的一大底线原则——必须支持真正的离线使用(Offline-First)。校园机房、考试练习或部分家庭电脑在未联网的情况下,若图片全靠 CDN 加载,软件打开后将充满破图,功能全面瘫痪。键盘小鹿通过 AST 剪枝技术,将必须的离线关卡、小鹿基础动作帧与键盘指法图压缩打包在 42MB 的本地绿色客户端内,断网也能 100% 畅练,仅将不影响练习的云端扩展资源通过网络按需静默下载。

在开发阶段,如何防止新提交的代码引入未经压缩的高清超大图片?

键盘小鹿在 Git 提交流水线中配置了 pre-commit 门禁与文件体积检查器。任何单张超过 500KB 的图片资产在 git add 时会被自动化脚本直接拦截,并提示开发者运行图片压缩管线转为高压缩率的 WebP。同时在 CI 中,runtimeAssetAudit.ts 会作为质量卡点(Quality Gate)自动运行,一旦发现未引用资产或超标素材,构建流水线自动中止,从源头确保了主干分支的精炼健康。 --- > 官方网站原文:本文由【键盘小鹿】官方教研与技术团队原创,首发于官方网站:https://www.keydeer.cn/articles/engineering/ast-asset-audit-multi-channel-build/ > 产品体验与客户端下载:https://www.keydeer.cn | 网页在线版即开即练:https://www.keydeer.cn/online/

想继续了解?

回到首页查看产品全貌、学习路径和第一课的开始方式。

返回官网首页