实用工具
输入
结果
结果会显示在这里。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代码压缩工具