790 字
约 2 分钟
11
S14-J02 · 打包分析:找出最大的 JS

适用读者:首屏慢、但不知道"哪个文件大"的人。
前置:S14-B05。
实测环境:Vite 5.4.21 / Vue 3.5(2026-11-05)。
覆盖旧文:395(366) 397(396) = 762 点。
覆盖扩展:E-S14-008(体积分析方法)。
上一篇:S14-J01 · Vue Router:模式与进阶
下一篇:S14-J03 · 预压缩与 CDN。


1. 一句话结论

打包分析的第一步不是装可视化插件,而是看构建输出——Vite 已经把每个 chunk 的原始体积和 gzip 体积列出来了。

实测(默认构建):

dist/index.html                 0.19 kB │ gzip:  0.17 kB
dist/assets/index-HVKwxhDy.js  66.71 kB │ gzip: 26.35 kB

实测(按 vendor 拆分后):

dist/assets/index-BIw9uBUq.js   0.94 kB │ gzip:  0.55 kB
dist/assets/vendor-DyNhfkPR.js 65.85 kB │ gzip: 25.94 kB

结论:97% 的体积是 Vue 运行时(vendor),业务代码只有 0.94 kB。


2. 三种分析手段(E-S14-008)

手段 成本 能看到什么
构建输出 零 每个 chunk 的体积
manualChunks 拆分 低 哪些依赖占大头
可视化插件(rollup-plugin-visualizer) 中 模块级 treemap
--sourcemap + 分析工具 中 具体到函数

判据:"先看输出够不够?" 多数量级问题("哪个库最大")看输出就够。


3. 实测:代码分割让首屏变小

const load = () => import('./lazy.js')     // 动态导入

实测产物:

dist/assets/lazy-woZh4iwD.js   0.11 kB │ gzip:  0.13 kB    ← 独立 chunk
dist/assets/index-EE8z-qKl.js  2.07 kB │ gzip:  1.10 kB
dist/assets/vendor-DyNhfkPR.js 65.85 kB │ gzip: 25.94 kB
观察 结论
lazy-*.js 单独成 chunk 动态导入 = 按需加载
vendor 不变 运行时无法省(除非换框架)

4. 体积优化的优先级

① 先拆:manualChunks + 路由懒加载(改配置,收益大)
② 再换:大库找轻量替代(如 moment → dayjs)
③ 再裁:只 import 需要的部分(按需引入组件库)
④ 最后:压缩/gzip/Brotli(J03,不改代码)

"为什么先拆再压":拆解决"首屏要下多少",压缩解决"传输多大"——两者不可互替。


5. 五个误区

误区 真相
"装个分析插件就能优化" 先看构建输出更直接
"vendor 大是业务问题" 是框架运行时(实测 97%)
"压缩能替代拆分" 压缩只减传输,不减解析成本
"懒加载越多越好" 首页懒加载会拖慢首屏
"体积小就一定快" 还要看请求数与解析时间

6. 自检

  1. 默认构建与拆分后,vendor 占多少?
  2. 三种分析手段的成本与能力?
  3. 动态导入产生了什么?
  4. 优化的四个优先级?
  5. 为什么"先拆再压"?

7. 下一篇

S14-J03 · 预压缩与 CDN

分析讲完,下一篇把传输成本压下去:gzip_static 与 CDN 的真实收益(含实测压缩率)。


本篇属于系列《S14 · 前端与可视化》。旧文来源:A-395/397;扩展点 E-S14-008。全部体积为 Vite 5.4.21 实测。

S14-J02 · 打包分析:找出最大的 JS
https://www.clxhxhhr.top/posts/5378/
作者
clxstart
发布于
2024-12-31
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。