本文目录导读:

- 核心策略:代码压缩与混淆(必做)
- 打包与 Tree Shaking(减少无效代码)
- 图片压缩(往往收益最大)
- Gzip / Brotli 压缩(服务端/Build 阶段)
- 压缩字体(容易被忽略)
- 结合构建工具(一体化方案)
- 监控与调试工具
- 推荐行动步骤
压缩网站前端资源文件是提升网站加载速度、降低带宽成本的关键步骤,主要针对 HTML、CSS、JavaScript 以及 图片/字体 等静态资源。
以下是系统性的压缩方案,按推荐程度和效果排序:
核心策略:代码压缩与混淆(必做)
移除代码中的空格、注释、换行,并缩短变量名(混淆)。
- JavaScript 压缩: Terser(最推荐)、UglifyJS、Google Closure Compiler。
- CSS 压缩: csso、Clean-CSS、cssnano。
- HTML 压缩: html-minifier-terser。
如何实施(推荐现代方案):
- Webpack / Vite / Rollup: 在构建配置中开启
mode: 'production',它们会自动集成 TerserPlugin 和 CssMinimizerPlugin。 - Gulp / Grunt: 配置
gulp-terser、gulp-clean-css、gulp-htmlmin等插件。 - 在线工具(临时用): 对于单一文件,可使用 JSCompress.com 或 CSS Minifier。
打包与 Tree Shaking(减少无效代码)
将多个文件合并成一个(或少量)文件,并删除未被使用的代码。
- Tree Shaking(摇树优化): 仅保留项目中实际调用的函数/组件,搭配 ES6 Module 使用。
- 从
lodash只引入debounce,而不是整个库。
- 从
- 代码分割: 将公共依赖拆分到单独文件(如
vendor.js),利用浏览器缓存。 - 工具: 现代构建工具(Webpack 5、Vite、Parcel)默认支持。
图片压缩(往往收益最大)
图片通常占页面体重的 60%-80%,有多种无损/有损压缩方法。
- 工具类(客户端或 CI 构建):
- imagemin (npm 包,配合 Webpack/Gulp 使用)
- sharp (高性能 Node.js 库)
- Squoosh (Google 出品的在线/CLI 工具)
- TinyPNG (在线服务,对 PNG/JPG 压缩效果极好)
- 格式选择(推荐):
- WebP: 比 JPEG 小 25%-35%,且支持透明,几乎所有现代浏览器都支持。
- AVIF: 比 WebP 再小 20%,但兼容性稍差。
- SVG: 图标/Logo 使用,且必须用
svgo工具压缩(清除无用属性)。
- 懒加载 + 响应式图片: 不要加载用户看不见的大图,使用
<img srcset>根据屏幕尺寸加载不同大小图片。
Gzip / Brotli 压缩(服务端/Build 阶段)
这是最高收益、最容易实施的压缩方式,浏览器请求资源时,服务器在传输前压缩,浏览器收到后解压。
- Brotli (首选): 比 Gzip 压缩率高 20%-30%,现代浏览器(Chrome、Firefox、Edge)均支持。
- 配置方法:Nginx 添加
brotli on;,Apache 安装mod_brotli。
- 配置方法:Nginx 添加
- Gzip: 兼容所有浏览器。
- 配置:Nginx
gzip on;或 Build 时生成.gz文件直接让 Nginx 返回。
- 配置:Nginx
关键: 现代构建工具(如 Vite)在 build 模式下可以预生成 .br 和 .gz 文件,避免服务器实时压缩消耗 CPU。
压缩字体(容易被忽略)
- 使用 WOFF2 格式: 比 WOFF 小 30%-50%,几乎兼容所有浏览器。
- 子集化字体: 从完整字库中只提取你网页实际用到的字符(只保留中文标点 + 数字 + 特定汉字),体积可缩小 90%。
- 工具:FontTools(Python)、glyphhanger、Google Fonts 的
?text=参数。
- 工具:FontTools(Python)、glyphhanger、Google Fonts 的
- CSS font-display: swap: 让字体非阻塞加载,减轻首屏负担。
结合构建工具(一体化方案)
强烈推荐使用现代前端构建工具,它们内置了许多最佳实践:
| 工具 | 命令/配置 | 自带功能 |
|---|---|---|
| Vite (强烈推荐) | npm run build |
自动压缩 JS/CSS、Tree Shaking、代码分割、自动生成 Brotli/Gzip(需插件 vite-plugin-compression) |
| Webpack 5 | mode: 'production' |
TerserPlugin、CssMinimizerPlugin |
| Next.js / Nuxt.js | npm run build |
默认集成全量优化 |
| Parcel | parcel build |
Zero-config,自动压缩 |
监控与调试工具
- Chrome DevTools > Lighthouse: 自动化审计,会提示“启用文本压缩”、“有效压缩图片”、“移除未使用的CSS”等。
- WebPageTest.org: 查看实际传输大小 vs 压缩后大小。
- BundlePhobia: 分析 npm 包的大小。
推荐行动步骤
- 立即检查服务端: 确保服务器开启了 Brotli 或 Gzip,这是最快收益。
- 升级图片格式: 将所有 JPEG/PNG 转换为 WebP,并使用
<picture>标签提供 JPEG 回退。 - 改造构建流程: 将项目迁移到 Vite(如果还是古老构建工具),或至少确保 Webpack 配置中包含了 Terser 和 CssMinimizer。
- 检查包大小: 使用
webpack-bundle-analyzer或vite-plugin-visualizer查看哪些库太大,考虑按需引入。 - Font 子集化: 如果使用了自定义中文字体,对其进行子集化。
不要做的事情: 手动去源文件里删除空格(会破坏代码),一切交给自动化工具。
标签: 文件合并
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。