在线 JavaScript 压缩工具:减小 JS 文件体积加速页面加载
什么是 JavaScript 压缩
JavaScript 压缩(JS Minification)是移除源码里对运行不必要的字符(空白、注释等)以减小文件体积的过程。构建链里的高级压缩器还会做变量缩短、死代码消除、常量折叠。把代码粘贴到我们的 JavaScript 压缩工具,可在浏览器本地做语法级压缩,并立刻看到字符数与 UTF-8 字节对比。
压缩前后对比
压缩前:
// 计算两个数的和
function addNumbers(a, b) {
// 返回两数之和
var result = a + b;
return result;
}
var x = 10;
var y = 20;
console.log(addNumbers(x, y));
压缩后(本工具默认:去注释 + 紧缩标点空白,保留标识符名):
function addNumbers(a,b){var result = a + b;return result;}var x = 10;var y = 20;console.log(addNumbers(x,y));
若勾选「移除 console.*」,末尾的 console.log(...) 也会被去掉。完整的变量混淆产物(如 function n(n,r){return n+r})需要 Terser/esbuild,不在本在线工具范围内——这是有意为之:粘贴即压时保留函数名,更不容易踩运行时按名查找的坑。
为什么需要 JS 压缩
- JavaScript 常是体积大户:脚本往往占页面传输的很大一块
- 压缩率可观:手写源码去注释与空白后,三到六成的缩减并不少见
- JS 会阻塞解析:更小的文件通常意味着更快的下载与解析
- 改善 Core Web Vitals:有助于缩短 LCP 相关等待
- 节省 CDN 带宽:字节少了,流量费用跟着降
- 移动端更敏感:弱网与中低端 CPU 上,每少传一截脚本都更明显
JS 压缩策略(构建链 vs 在线工具)
| 策略 | 说明 | 本站在线工具 |
|---|---|---|
| 移除空白 | 压缩空格、换行、缩进 | 支持(可关「紧缩标点」) |
| 移除注释 | 删除单行和多行注释 | 支持;保留 /*! 与 @license |
| 移除 console / debugger | 生产环境去调试残留 | 可选开关 |
| 变量名缩短 | 局部变量重命名为短名称 | 不支持(保留名称) |
| 死代码消除 | 移除不可达代码 | 不支持(用打包器) |
| 常量折叠 | 编译时计算常量表达式 | 不支持(用打包器) |
如何使用在线工具
使用 ToolVault 工具匣 的 JavaScript 压缩工具:
- 粘贴 JavaScript 代码(处理在本地完成,不上传服务器)
- 按需勾选:移除注释、移除
console.*、移除debugger、紧缩标点旁空白 - 点击压缩;输出区显示字符数与 UTF-8 字节节省量
- 若括号可能不匹配,会提示行号——当作排查线索,仍请用页面或测试确认
- 需要可读性时点「格式化」(Prettier);语法错误会带上行定位信息
构建工具中的 JS 压缩
Webpack(TerserPlugin)
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
optimization: {
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true,
pure_funcs: ['console.log']
},
mangle: true
}
})
]
}
};
Vite
import { defineConfig } from 'vite';
export default defineConfig({
build: {
minify: 'terser',
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true
}
}
}
});
esbuild(Vite 默认)
import { defineConfig } from 'vite';
export default defineConfig({
build: {
minify: 'esbuild' // 通常比 terser 快一个数量级以上
}
});
JS 压缩工具对比
| 工具 | 速度 | 压缩力度 | 生态 |
|---|---|---|---|
| esbuild | 极快 | 良好 | Vite 默认 |
| terser | 中等 | 较高 | Webpack 常见选择 |
| SWC | 快 | 良好 | Next.js 常见选择 |
| uglify-js | 中等 | 良好 | 经典工具 |
| 本站在线工具 | 即时 | 语法级 | 粘贴即用、保留标识符 |
Terser 五个真正改变产出的设置
compress.drop_console 剥掉 console.log(缩体积、去噪音,先确认没有重试逻辑在读 console);dead_code + unused 做死代码消除(配 ES module 效果更明显);mangle.toplevel 改顶层名字(体积收益大,但会破坏按名查找,如部分依赖注入);format.comments 控制是否保留许可注释。安全节奏:每次只开一个设置、diff 产物、跑冒烟套件。
在线工具里的「移除 console.* / debugger」对应构建链里最常用的两档开关,方便你在提交进流水线前先估体积差。
tree-shaking 与 minify 的混淆
压缩缩小「已经存在」的代码;tree-shaking 移除「根本没用到」的导出——症状都是 bundle 太大,经常被混为一谈。tree-shaking 需要 ES module 与副作用标注(package.json 的 sideEffects: false);勤奋地压缩一个 CommonJS bundle,只是把没用到的函数一起压小了。诊断:删掉一个 import 后 minified bundle 大幅缩水——说明 tree-shaking 没生效,不是 minify 的锅。高影响习惯:具名导入(import { debounce } from 'lodash-es'),重导出一切的桶文件会悄悄毁掉整条链路。
sourcemap:交付策略
没有 sourcemap 的生产代码很难调试——堆栈往往指向超长单行文件的第 1 行。常见做法:构建时生成、上传到错误追踪服务(或放在受控路径)、避免把 .map 挂到可预测的公开 URL。//# sourceMappingURL= 注释控制发现方式:公开文件可去掉,由错误追踪侧引用。map 的成本主要在构建时间与磁盘,不是运行时。
字符数与 UTF-8 字节
面板同时给出字符数与 UTF-8 字节。含中文注释时,去掉注释后的字节降幅通常大于字符降幅——CDN 与流量计费看的是字节。传输层的 Brotli/Gzip 是再压一层,与源码 minify 叠加,不是二选一。
上线前先看括号平衡警告
括号、方括号、花括号不平衡,多半是粘贴被截断或模板片段不完整。在线工具会给出平衡警告,避免把半截文件的压缩结果当成成功。先修好源码,再用同一组选项(注释 / console / debugger / compact)重跑,对照上一轮的字符与字节降幅。
FAQ
压缩后的代码还能调试吗?
压缩后可读性差。做法:生成 Source Map;浏览器开发者工具可通过 Source Map 对照原始代码,生产环境仍加载压缩版本。
为什么要移除 console.log?
- 占用额外体积
- 在生产环境可能泄露调试信息
- 有微小的运行开销
构建链用 terser 的 drop_console: true;本站工具提供同名意图的可选开关,便于先估收益。
esbuild 和 terser 该选哪个?
大型项目往往先看 esbuild 的速度;需要更细的混淆与压缩旋钮时再用 terser。Vite 默认 esbuild,Webpack 生态里 terser 很常见。日常粘贴瘦身、对比选项体积差,用本站在线工具即可。
为什么不在线做变量混淆?
混淆一旦改错导出函数名或依赖注入用的字符串名,页面会静默坏掉。在线工具优先「可预期、可回滚」:保留标识符,把高风险改名留给有完整测试的构建流水线。
排查注记
不在线做变量混淆是全文最重要的取舍,FAQ 补了原因:混淆一旦改错导出函数名或依赖注入用的字符串名,页面会静默坏掉——在线工具优先「可预期、可回滚」,高风险改名留给有完整测试的构建流水线。tree-shaking 与 minify 的区分给了可执行的诊断法:删掉一个 import 后 minified bundle 大幅缩水,说明 tree-shaking 没生效、不是 minify 的锅。Terser 一节的安全节奏同样具体:每次只开一个设置、diff 产物、跑冒烟套件;字符与字节并排显示,是因为中文注释的字节降幅通常大于字符降幅,而 CDN 计费看的是字节。
感谢阅读这篇 ToolVault 工具匣 技术文章。更多免费本地工具见 首页。
相关工具
相关文章
CSS 单位分界:px、rem、em 各管什么,换算怎么不出错
px 转 rem 的公式与速查表、rem 与 em 的分界(root 相对 vs 父级相对)、62.5% 技巧的利弊、媒体查询里的 rem 陷阱、浏览器最小字号限制,附在线 CSS 单位换算工具。
正则表达式匹配不上?排查这 6 个常见坑
正则表达式不匹配、regex匹配失败时如何排查?本文详解贪婪量词、标志位遗漏、特殊字符转义、环视断言、换行符处理、Unicode属性6大常见坑,附前后对比示例,帮你快速定位正则调试问题。
Hydration failed / Text content does not match 报错怎么解决?
Next.js/React SSR 最常见的水合报错完整指南:为什么服务端和客户端渲染不一致、时间戳/随机值/localStorage 三大来源、suppressHydrationWarning 的正确用法,配本站工具定位差异。