前端打包优化经验:包体积不是只靠压缩就能降下来的

提到前端打包优化,很多人的第一反应是:

  • 开 gzip
  • 开 brotli
  • 做压缩
  • 分包

这些都重要,但它们更多是结果优化,而不是根因优化。

项目包体积越来越大,并不是因为压缩没做好,而是因为依赖结构、代码组织和资源策略本身就不够克制。

先弄清楚体积到底是怎么长起来的

一个前端包变大,常见来源通常有:

  • 引入了过大的第三方库
  • 首屏加载了本不该首屏加载的代码
  • 公共依赖拆分不合理
  • 图片、图标、字体资源过重
  • 工具函数或组件重复打进多个 chunk

如果不先定位来源,只盯着构建配置调参数,优化通常很快进入瓶颈。

不要把“功能能跑”当成依赖引入标准

很多包体积问题,都是从一行 import 开始的。

比如为了一个简单功能,引入一个很重的库;或者只需要某个小工具函数,却把整个工具库一起打进来。

这类问题最常见,也最容易被忽视,因为功能层面完全没问题。

但从长期看,依赖使用要有一个基本原则:

引入的不是“功能”,而是“长期成本”。

路由级拆分是最基本的一步

如果一个页面用户根本没访问,理论上它相关的代码就不应该在首屏里出现。

这也是代码分割最直接的价值。

对于多页面或后台系统来说,路由级拆分通常是最先该做的事情。它并不是锦上添花,而是把不必要的首屏负担拿掉。

组件级懒加载也要谨慎

有些团队在发现包大之后,会开始把很多组件都做成懒加载。

这不是不行,但要分场景。

如果组件本身很轻、用户几乎一定会看到,那为了“拆得更碎”而懒加载,收益未必大,反而会增加请求碎片和复杂度。

更适合懒加载的通常是:

  • 富文本编辑器
  • 图表模块
  • 大型表格
  • 低频弹窗
  • 管理后台高级筛选面板

也就是说,真正重、真正低频的模块优先拆。

图片和图标常常是被低估的体积来源

不少人会盯着 JS 包,却忽略了静态资源。

实际项目里下面这些都很常见:

  • 首页大图未压缩
  • 多个页面重复加载大图资源
  • 只需要几个图标,却引入整套图标包
  • 字体文件过大

这些问题加起来,用户感知可能比 JS 包还明显。

公共代码不是越集中越好

做公共 chunk 拆分时,一个常见误区是:只要公共就全抽出来。

问题在于,如果一个公共 chunk 非常大,而其中大部分内容其实只服务少数页面,那它反而会成为新的负担。

所以公共代码拆分不是追求“集中”,而是追求“合理复用”。

分析工具一定要用

如果一个项目已经明显变重,最不应该做的事情就是靠猜优化。

这时最有效的办法通常是:

  • 看 bundle 分析图
  • 看每个 chunk 的组成
  • 找出最大的第三方依赖
  • 找出重复出现的模块

很多优化方向只要一可视化,就会非常明显。

真正长期有效的优化,往往是结构优化

例如:

  • 避免滥引第三方库
  • 限制公共模块膨胀
  • 拆分高成本页面
  • 减少重复资源
  • 让低频功能延后加载

这些事情比单纯调构建参数更费脑子,但通常也更有长期价值。

写在最后

打包优化不是一场“把构建工具调到最极致”的比赛,而是一次对项目结构的体检。

压缩、分包、缓存当然重要,但真正决定包体积的,通常还是代码和依赖本身的组织方式。只要结构合理,很多优化会自然发生;如果结构混乱,再多构建技巧也只是延后问题爆发。