代码压缩指南 — HTML、CSS、JS优化
在网络上,每个字节都很重要。加载时间增加100毫秒就可能显著降低用户参与度。代码压缩(Minification)是减少HTML、CSS和JavaScript文件大小的最简单、最有效的技术之一——它应该是每个生产部署流程的一部分。
本指南涵盖了代码压缩对每种语言的实际作用、与传输压缩的比较以及如何将其集成到工作流程中。您也可以使用我们的代码压缩工具快速压缩任何代码片段,无需配置构建工具。
什么是代码压缩?
代码压缩是在不改变功能的情况下,从源代码中删除不必要字符的过程:
- 注释 — 对开发者有用,但浏览器看不到
- 空白 — 用于可读性的空格、制表符、换行符
- 冗余语法 — 可选的分号、引号、闭合标签
- 长标识符 — 缩短变量和函数名(仅限JavaScript)
结果是更小的文件、更快的下载和更快的浏览器解析。
压缩 vs 传输压缩:它们协同工作
一个常见的误解是代码压缩和传输压缩(gzip/Brotli)可以互换。实际上它们是互补的。
代码压缩在源代码级别删除冗余字符。
传输压缩(gzip、Brotli)对通过网络传输的字节应用通用压缩算法。
为什么需要两者:
原始CSS: 28.4 KB
仅代码压缩: 18.2 KB (减少36%)
仅传输压缩: 7.1 KB (减少75%)
代码压缩+传输压缩: 5.3 KB (减少81%)
压缩后的代码能更好地进行传输压缩,因为压缩算法在更短、更统一的文本中能找到更多重复模式。始终先进行代码压缩,然后让服务器处理传输压缩。
HTML压缩
HTML压缩是三者中最保守的。浏览器对HTML非常宽容。
什么会被删除
注释:
<!-- 之前 -->
<!-- 导航部分 -->
<nav>
<!-- 主菜单 -->
<ul>
<li><a href="/">首页</a></li>
</ul>
</nav>
<!-- 之后 -->
<nav><ul><li><a href="/">首页</a></li></ul></nav>
标签间不必要的空白:
<!-- 之前 -->
<div>
<p>
你好世界
</p>
</div>
<!-- 之后 -->
<div><p>你好世界</p></div>
可选的闭合标签:
<!-- 之前 -->
<ul>
<li>项目一</li>
<li>项目二</li>
</ul>
<!-- 之后 -->
<ul><li>项目一<li>项目二</ul>
典型HTML节省
HTML压缩通常将文件大小减少10–25%。用我们的代码压缩工具亲自试试。
CSS压缩
CSS从压缩中获益匪浅,因为样式表通常有大量注释和充裕的空白格式。
什么会被删除
注释和空白:
/* 之前 */
/* 主要按钮样式 */
.btn-primary {
background-color: #3b82f6;
color: #ffffff;
padding: 12px 24px;
border-radius: 8px;
font-weight: 600;
}
/* 之后 */
.btn-primary{background-color:#3b82f6;color:#fff;padding:12px 24px;border-radius:8px;font-weight:600}
简写转换:
/* 之前 */
margin-top: 10px;
margin-right: 20px;
margin-bottom: 10px;
margin-left: 20px;
/* 之后 */
margin:10px 20px
颜色优化:
/* 之前 */
color: #ffffff;
background: #aabbcc;
/* 之后 */
color:#fff;background:#abc
典型CSS节省
CSS压缩通常将文件大小减少20–40%。
JavaScript压缩
JavaScript压缩是最激进的,因为该语言允许超越简单空白删除的转换。
什么会被删除和转换
注释、空白和变量名缩短:
// 之前
// 计算含税总价
function calculateTotal(price, taxRate) {
const tax = price * taxRate;
return price + tax;
}
// 之后
function calculateTotal(n,t){const a=n*t;return n+a}
压缩器还缩短了变量名:price变成了n,taxRate变成了t,tax变成了a。这称为混淆(mangling)。
死代码消除:
// 之前
function processData(data) {
if (false) {
console.log('这永远不会运行');
}
return data.map(item => item.value);
}
// 之后
function processData(d){return d.map(i=>i.value)}
典型JavaScript节省
JavaScript压缩通常将文件大小减少30–60%。
节省总结
| 语言 | 典型减少 | 主要节省来源 |
|---|---|---|
| HTML | 10–25% | 空白、注释 |
| CSS | 20–40% | 注释、简写、颜色 |
| JavaScript | 30–60% | 变量混淆、死代码 |
何时不应压缩
开发过程中
压缩后的代码几乎无法阅读。保持开发构建未压缩。
开源库
发布未压缩的源代码。让使用者在自己的构建中进行压缩。
非常小的文件
200字节的内联脚本不需要压缩。将压缩工作集中在超过1KB的文件上。
Source Map:保持压缩代码可调试
Source map将压缩的生产代码与原始源代码连接起来。
//# sourceMappingURL=app.min.js.map
Source map最佳实践:
- 在构建管道中生成source map,但不要在生产环境中公开提供
- 将source map上传到错误跟踪服务(Sentry、Bugsnag)
- 在webpack/Vite中使用
hiddensource map选项
构建管道集成
webpack
const TerserPlugin = require('terser-webpack-plugin');
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
module.exports = {
mode: 'production',
optimization: {
minimizer: [new TerserPlugin(), new CssMinimizerPlugin()],
},
};
Vite
export default {
build: {
minify: 'esbuild',
cssMinify: true,
},
};
esbuild
esbuild app.js --bundle --minify --outfile=app.min.js
Rollup
import terser from '@rollup/plugin-terser';
export default { plugins: [terser()] };
无需构建工具的快速压缩
并非所有任务都需要完整的构建管道。对于一次性任务,我们的代码压缩工具在浏览器中处理HTML、CSS和JavaScript——无需安装,无需配置,不向服务器发送数据。
对于数据格式,我们还提供JSON压缩工具和YAML压缩工具。
压缩检查清单
- 所有CSS和JS文件已压缩
- Source map已生成
- HTML已压缩
- 传输压缩已启用 — 验证
Content-Encoding: gzip或br - 开发构建未压缩
- console.log已移除
- 无双重压缩
相关资源
- 网页图片优化 — 减少页面最大的体积贡献者
- YAML压缩指南 — 压缩配置文件的技术
- Web开发者工具清单 — 每个工作流程必备的工具
开始压缩
代码压缩是一种低投入、高回报的优化。
打开代码压缩工具 → — 粘贴HTML、CSS或JavaScript,即时获得优化输出。无需注册,无需安装,完全私密。