HelloWorld 项目要压缩资源,先按类型分工:图像做响应式并转 WebP/AVIF,脚本和样式做 *minify*、树摇与代码分割,传输层启用 Brotli/Gzip,字体子集化并用 WOFF2,视频采用自适应码率。配合 CDN、合理缓存和懒加载策略,通常能在不牺牲视觉体验的前提下把总资源体积缩小 30%–80%。下面我会一步步讲清楚原理、常用工具、可落地的流程和验收标准,方便你把 HelloWorld 项目变得又快又稳。

先说为什么要压缩资源(用最简单的语言)
想象你给朋友寄一箱东西,邮费按重量算,东西越轻费用越低,运输越快。网页资源压缩就是把“东西”变轻。同样的页面,资源越小,首屏加载越快,用户等待越短,流量花费越少,移动端体验提升尤为明显。
核心原理(不用复杂数学)
- 消除冗余:移除未使用的代码、重复的数据,像剪掉多余的包装。
- 格式更优:选择比旧格式更高效的编码(例如 AVIF、WebP、WOFF2),相同视觉质量下体积更小。
- 传输压缩:在网络层用 Brotli/Gzip 压缩文本类资源,减少传输字节数。
- 延迟加载与分片:只加载当前需要的内容,把剩下的放在用户需要时再拿。
按资源类型讲具体做法(实际可执行)
图像(通常收益最大)
图像占页面体积往往很高,优化策略分三步:尺寸适配、格式转换、质量控制。
- 响应式图片:用 srcset / picture 提供多分辨率,移动端加载小图。
- 现代格式优先:优先输出 AVIF(最佳压缩率)、其次 WebP,再回退到 JPEG/PNG。
- 延迟与占位:首屏用低质量占位图(LQIP),其余图片懒加载。
- 工具:imagemin、sharp、Squoosh、cwebp、avifenc,自动化构建中换格式并生成多个尺寸。
JavaScript 和 CSS
JavaScript 与 CSS 同样可以显著瘦身,策略是减量、拆包、并压缩传输。
- 移除未使用代码:Tree-shaking(例如用 Rollup、Webpack、esbuild)和按需引入第三方库。
- 代码分割:把初始加载与延迟模块分离,配合路由懒加载。
- 压缩与混淆:Terser、esbuild 的 minify,CSS 用 cssnano、purgecss 去掉没用的样式。
- 传输压缩:启用 Brotli(优先)或 Gzip,在服务器返回 Content-Encoding。
字体
字体文件常被忽视但很占空间。策略是子集化、使用现代格式、延迟加载。
- 子集化只保留实际用到的字形(比如只保留常用汉字);工具有 FontTools、glyphhanger、google-webfonts-helper。
- 优先 WOFF2,必要时回退 WOFF/TTF。
- 使用 font-display:swap 避免阻塞渲染。
视频与音频
视频最耗流量,常用做法:自适应码率(HLS/DASH)、转现代编码(AV1/H.265/H.264 的更优版)、并提供预览图和懒加载。
SVG
SVG 本质上是文本,压缩与清理属性能显著缩小体积,用 SVGO 去掉冗余元数据和空属性,并考虑内联关键的小图标。
常见压缩手段对照表
| 资源类型 | 主要方法 | 工具/格式建议 |
| 图像 | 响应式、转换格式、质量控制、懒加载 | AVIF、WebP、sharp、imagemin |
| JS/CSS | Tree-shaking、代码分割、minify、Brotli | esbuild、Webpack、Rollup、Terser、cssnano |
| 字体 | 子集化、WOFF2、延迟 | FontTools、glyphhanger、WOFF2 |
| 媒体(视频) | 自适应码率、现代编码、懒加载 | HLS/DASH、ffmpeg(x264/x265/AV1) |
| SVG | 清理、内联小图标 | SVGO |
实操清单(把工作分成可执行的小步)
- 第一天:检测与基线
- 用 Chrome DevTools / Lighthouse / WebPageTest 做一次完整快照,记录总大小、请求数、LCP、FCP。
- 按资源类型列出最大的十个文件(按大小排序)。
- 第二天:图像和字体优先
- 把大图转换为 WebP/AVIF,生成多个分辨率,替换页面引用。
- 对字体进行子集化并改用 WOFF2,设置 font-display。
- 第三天:前端构建优化
- 在构建链中启用 tree-shaking、代码分割、minify(esbuild 或 terser)。
- 清理 CSS,移除未用样式。
- 第四天:传输与缓存
- 服务器启用 Brotli(优先)或 Gzip,设置正确的 Content-Encoding。
- 配置 Cache-Control、ETag、合理的静态资源长缓存 + 版本策略。
- 上线 CDN 并验证边缘缓存命中率。
- 第五天:验证与回归
- 对比 Lighthouse 分数和关键指标(LCP、TTFB、CLS)。
- 确保功能未被破坏(字体回退、脚本按需加载是否正常)。
自动化与 CI 集成(别手动做重复活)
把转换和压缩加入构建流程:比如用 GitHub Actions / GitLab CI 在构建时自动:
- 生成图片的多分辨率和格式;
- 执行 JS/CSS 的 tree-shake 和 minify;
- 字体子集化并产出 WOFF2;
- 运行 Lighthouse CI 或 performance budget 检查,失败则阻断合并。
自动化能保证每次发布都稳定、可复现,也方便回滚和审计。
如何验收与设定目标(量化为可执行标准)
- 设定资源大小预算:首屏资源(首包)尽量控制在 150–300KB(理想),总加载体积根据场景 500KB–2MB。这个范围取决于功能复杂度。
- 关键指标目标:LCP < 2.5s,FCP < 1.0s,TTFB < 600ms(移动网络下的合理目标)。
- 使用 Lighthouse、WebPageTest、Real User Monitoring(RUM)持续监控。
常见误区与陷阱(省点力气别踩坑)
- 只看总大小不看请求数:多个小文件带来的连接开销也会影响性能。
- 盲目追求最小尺寸:过度压缩图片或视频会造成明显质量下降,影响转化率。
- 在客户端做太多实时压缩:移动设备 CPU 限制会造成滑动卡顿或电量消耗。
- 忽视回退策略:不是所有浏览器都支持 AVIF/WOFF2,要做好格式回退。
示例:给 HelloWorld 做一次压缩路线(实际案例演示)
假设初始页面大小 2.1MB(图片 1.4MB,JS/CSS 500KB,字体 200KB)。一个保守可行的优化流程:
- 图像转换为 WebP/AVIF 并生成多分辨率,体积从 1.4MB 降到 ~420KB(约 70% 减少)。
- JS/CSS 开启 tree-shaking + minify + code-split,初始包从 500KB 降到 180KB。
- 字体子集化并改用 WOFF2,从 200KB 降到 60KB。
- 启用 Brotli 传输,传输字节再降 15%–25%。
合计后页面可降至 700KB 左右,首屏体验大幅改善(LCP 通常会下降到 1.5s 左右,视 CDN 与网络而定)。这些数字是典型范围,具体效果请以实际测量为准。
最后一点实用建议(写给马上要执行的人)
- 先量化问题:不要盲改,先找出最大的几个文件优先优化。
- 分阶段上线:一次只改一类资源,便于回归和排查。
- 把用户体验放在第一位:加载时间缩短能带来更高的留存与转化,这比单纯追求最小体积更重要。
嗯,说到这儿,手头有个清单就能开始:测量→图像与字体→构建优化→传输与缓存→验证。如果你现在打开 HelloWorld 项目的资源面板,按大小排序,很快就能决定先干哪一项。接下来就动手,把第一张大图换成 WebP,接着观察 Lighthouse 分数的变化,慢慢走,这事儿其实挺有成就感的。