JavaScript 压缩
现代页面的重量真正压在 JavaScript 上。这不只是访客下载的字节,还有浏览器随后必须解析和执行、才能让页面变得可交互的那段脚本。源码是写给人看的,有描述性命名、空格、注释,偶尔还有走不到的分支,这些几乎都不需要发到线上。这个工具直接在你的浏览器里运行 Terser,也就是各大打包器所用的同一引擎。你贴进一段脚本,立刻拿回经过压缩、局部名称缩短、死代码删除的版本,原始、压缩后和 gzip 三个体积放在一起,省了多少绝不靠猜。它会把 JavaScript 正确读出来,所以输出是一个安全、等价的程序,而你粘贴的一切都不会离开这个标签页。
- 运行 Terser,也就是打包器在生产构建里用的同一个压缩器,会把代码读成语法树再安全变换,而不是靠猜
- 不只是删空格,而是删掉死代码、折叠常量、缩短局部名称,真正去掉重量,这也是抗 gzip 的收益来源
- 原始、压缩后和 gzip 三个体积一起显示,让你以服务器真正发送的大小判断收益,而不是只看原始字节
- 全程在浏览器里运行,你粘贴的代码连同私有内容都留在本机,关闭标签页就不再保留
功能简介
压缩 JavaScript 比压缩 CSS 更复杂,因为你重写的是一个程序而不是裁剪文本,所以准确性最为关键。这个工具依靠 Terser 来妥善完成,并把证明它值得的数字摆出来。
- 01
底层是 Terser
各大打包器在生产构建里用的同一个压缩器。它把代码读成一棵树再安全变换,而不是用文本规则去猜。
- 02
能真正去掉重量的压缩
删除死代码和走不到的分支,折叠常量,化简表达式,归并冗余语句。这些结构性收益是单纯去空白永远做不到的。
- 03
更短的局部名称
把局部变量和参数重命名为一两个字符,同时顶层全局变量和保留字保持不动,程序照常工作,字节继续缩小。
- 04
保留许可注释
开源代码所要求的许可与 preserve 横幅可以留下,同时把输出里其余所有注释清掉。
- 05
可信的体积明细
原始、压缩后和 gzip 三个体积随输入更新,旁边是精确的节省百分比。其中 gzip 才是反映真正穿越网络的那个数字。
- 06
复制、下载或上传
从剪贴板粘贴、从磁盘加载文件,然后复制结果或保存为 min.js 文件。整个回路在本地几秒内完成。
如何使用
几步把可读源码变成可上生产、体积最小的脚本,全程把节省的数字摆在屏幕上。
- 01
把 JavaScript 粘贴进输入面板,或用上传直接加载文件。
- 02
选择选项。保持压缩优化和变量重命名开启可得最小输出,发许可横幅就保留许可注释。
- 03
看选项下方的明细确认收益,那里有原始、压缩后和 gzip 三个体积以及节省百分比。
- 04
若输入有语法错误,会显示错误信息供你修正;否则复制结果或下载为 min.js 文件。
- 05
把压缩文件接入负责生产脚本的页面或构建步骤。
功能说明
这些细节让输出可放心上线、值得信任。
- 基于 Terser,各大打包器都在用的标准 JavaScript 压缩器。
- 支持现代语法,包括箭头函数、类、async 和 await、模板字符串以及可选链。
- gzip 体积用浏览器自带的压缩测量,所以这个数字和真实服务器的传输大小相符。
- 语法错误会带着信息原地报告,而不是悄悄产出损坏的输出。
- 不上传、不记录。你粘贴的代码,连同私有内容,只留在浏览器里,关闭标签页就消失。
适合哪些场景
把 JavaScript 压到只剩本质,在这些场景里会回本。
压缩 JavaScript 到底做了什么
压缩 JavaScript 远不止删空格。由于它重写的是程序本身,了解其中的环节会有帮助,每一步做了什么,以及为什么结果仍然跑得一样。
-
空白与标点
去掉缩进、换行和不需要的分号,解析规则让其中许多可以完全省略。这是最廉价、最安全的一层,也是 gzip 本就大体能收回的一层。
-
压缩,结构层
Terser 会求值常量表达式、移除永不执行的代码、内联简单取值、归并语句。真正的收益来自这里,是 gzip 够不到的那种,因为它去掉的是内容而不是排版。
-
重命名局部名称
一个冗长、描述性的局部名会变成单个字母。只有可以安全改动的名字才会被处理。全局变量、对象属性以及任何导出项都保持原样,程序行为不变。
-
哪些保持不动
公开名、对象属性键、字符串内容和保留字默认保留。这正是压缩后的代码仍能正确与其他脚本和页面通信的原因,因为对外的契约没有改变。
-
为什么 gzip 才是诚实的数字
服务器会用 gzip 或 brotli 压缩 JavaScript,它们本就会压掉重复的空白和记号。压缩仍然取胜,因为它移除整段分支、缩短名称,但结果始终要看 gzip 体积,而不是原始字节。
-
是压缩,不要混淆
压缩追求的是体积最小的等价程序,并借助 source map 保持可调试。混淆则刻意让代码难读,往往更大更慢。两者目标不同,这个工具做的是前者。
使用建议
这些习惯能让压缩后的 JavaScript 既小又可靠。
- 把压缩放在构建的最后一步并部署其输出。永远不要手改压缩后的代码,也不要把它当作源码提交。
- 用 gzip 体积判断收益,因为那才是服务器传输的大小。很大的原始缩减一旦套上压缩往往就只剩一点点。
- 在压缩文件旁生成 source map,让生产环境的堆栈跟踪和调试器仍能指回你真正的代码。
- 生产环境保持压缩和重命名开启;但若某个运行时依赖函数名,像部分框架那样,请保护这个名字而不是为了它整体关掉重命名。
- 为压缩文件开启 gzip 或 brotli 并设置较长缓存。压缩与传输压缩是叠加而不是互相替代。
边界与注意事项
这个工具做什么,以及把什么留给其他步骤。
- 它压缩单个 JavaScript 文件。它不会打包模块、解析 import,也不会跟踪对其他文件的引用。
- 它只压缩,不转译。为老旧浏览器降级现代语法是 Babel 或 esbuild 之类工具的活。
- 用 TypeScript 或 JSX 写的源码必须先编译成纯 JavaScript,因为这里只读取标准 JavaScript。
- source map 生成与代码混淆不在范围内。这个工具专注于产出体积最小、仍可调试的等价程序。
常见问题
关于压缩 JavaScript、它改了什么、以及何时使用的常见问题。
压缩会破坏我的 JavaScript 吗?
只要输入合法就不会。Terser 把代码读成一棵树,只应用保持行为不变的改动。它重命名局部变量、删除死代码、缩短表达式,但不改变程序所做的事。公开名、属性和导出标识符都保持不动。唯一要留意的是在运行时依赖函数名或变量名的代码,像某些依赖注入设置那样。这种情况下请保护这些名字,或关掉重命名。
压缩优化和变量重命名有什么区别?
压缩优化是结构层。它删除死代码、折叠常量、化简表达式,大部分 gzip 够不到的收益来自这里。变量重命名是改名层。它把局部变量和参数名缩短为一两个字符。两者相互独立,可只开其一或都开,一起用能得到最小输出。
压缩和混淆有什么区别?
压缩是在保持等价、并借助 source map 可调试的前提下尽量减小体积。混淆则刻意让代码难以理解,常常以更大体积和更慢速度为代价。两者共享部分手法但目标相反,这个工具做的是压缩而不是混淆。
它支持现代 JavaScript 吗?
支持。Terser 理解当前语法,包括箭头函数、类、async 和 await、生成器、模板字符串、可选链以及空值合并。它压缩现代语法,但不会为老旧浏览器降级,那是转译器的活。
我能在这里压缩 TypeScript 吗?
不能直接压缩,因为这个工具处理纯 JavaScript。请先把 TypeScript 或 JSX 编译成 JavaScript,你的构建已经在做这件事,再把输出粘贴或上传到这里压缩。
我该把压缩文件留在仓库里吗?
不该。压缩后的 JavaScript 是构建产物,不是源码。提交你实际编辑的可读代码,把压缩文件作为发布前的最后一步生成。把压缩输出签入会让代码评审难以阅读、合并变得痛苦。
我的代码会被上传到什么地方吗?
不会。一切都在你的浏览器里运行。你粘贴的 JavaScript、上传的任何文件以及结果都在本地处理,绝不传输或存储,关闭标签页即刻消失,所以即便是私有代码也很安全。