实用工具

JavaScript 压缩

用 terser 压缩 JavaScript,可选压缩、变量名混淆和 ECMAScript 版本,并对比 gzip 前后的体积。

浏览器本地运行代码转换9336
免费

输入

0 B

结果

结果会显示在这里。

terser 是 webpack 在 production 模式下默认使用的压缩器,Vite 和 Rollup 追求最小体积时也提供它作为选项。贴入脚本,就能按同样的方式压缩:删除死代码和冗余表达式、缩短局部变量名、去掉空白。结果会显示节省的字节数;浏览器支持 CompressionStream 时,还会显示 gzip 前后的体积——那才是真正在网络上传输的大小。

它是怎么工作的

  • 压缩会分两轮改写代码——内联常量、删除走不到的分支、折叠表达式;混淆会缩短局部变量和参数名。
  • 除非你把输入标记为 ES 模块,否则顶层名字保持不变,因为普通脚本的全局变量可能被页面上的其他脚本使用。
  • 以 /*! 开头、或包含 @license、@preserve 的注释会保留,大多数开源许可证都要求这样做。
  • ECMAScript 版本决定 terser 能输出什么语法,选 ES5 就不会生成箭头函数;但你自己写的新语法不会被降级转译。

你的数据去了哪里

哪也没去。本工具完全在你的浏览器里运行:你粘贴的文本由页面处理,不会传输到任何服务器,也不会写进任何日志。

本工具免费且无需登录,运行结果只存在于你当前的页面里,不会被保存到任何地方。

它要花多少

本工具完全免费,不需要登录,也不消耗积分。

常见问题

为什么 gzip 后节省的比例比压缩前小?
因为 gzip 本身就会消除很多同样的冗余:重复的空白、又长又反复出现的变量名,压缩效果都很好。所以原始体积上看起来很大的节省,两边都 gzip 之后会缩小。这个较小的数字依然是实打实的,估算传输大小时应该看它。
压缩会把代码弄坏吗?
terser 的默认变换是按标准 JavaScript 的语义设计的,是安全的。容易出问题的是运行时依赖函数名或类名的代码(Function.prototype.name、某些依赖注入写法),或者通过 toString() 读取自身源码的代码。关掉变量名混淆,就能确认问题是否出在名字上。
移除 console 调用是做什么的?
它会从压缩结果里删掉 console.log、console.warn 以及所有其他 console.* 调用。对生产包很方便;但如果你依赖 console.error 从用户浏览器里上报错误,就不要开。这个选项只在开启压缩时生效。
能压缩 TypeScript 或 JSX 吗?
不能。terser 只读 JavaScript,遇到第一个类型注解或 JSX 标签就会报语法错误。先用 tsc、esbuild 或 Babel 把 TypeScript 和 JSX 编译成 JavaScript,再拿来压缩。

背后的开源项目

本工具运行在 terser/terser 之上,以 BSD-2-Clause 许可发布。如果你需要在自己的程序里实现同样的能力,直接用这个库。

terser/terser

也常被称作

  • js压缩
  • javascript压缩
  • 在线js压缩
  • terser在线
  • js混淆压缩
  • js代码压缩工具