压缩器
JavaScript 压缩在优化网站性能方面起着至关重要的作用,因为它减少了发送给用户的数据量, 从而实现了更快的页面加载速度。 这具有巨大的经济价值,特别是对于电子商务网站而言,每一秒都可能相当于数百万美元。
然而,现有的压缩器通常需要在压缩质量和速度之间做出权衡。 你必须在压缩效果最好但速度最慢,和速度最快但压缩效果较差之间做出选择。 但是,如果我们能开发出一个在不牺牲压缩效果的情况下更快的压缩器呢?
项目目标
我们正积极致力于实现这一目标的原型开发, 方法是从知名的压缩器(如 google-closure-compiler、terser、esbuild 和 tdewolff-minify)移植所有测试用例。
初步结果表明,我们正朝着目标稳步前进。 使用 Oxc 压缩器,你可以期待更快的压缩时间,同时不牺牲压缩质量。
目标性能
- 速度:比 Terser 更快,与 esbuild 相当
- 压缩率:达到或超过 Terser 的压缩率
- 正确性:通过所有主要压缩器测试套件
架构概述
设计原则
Oxc 压缩器围绕以下几个关键原则构建:
- 语义感知:利用语义分析实现安全优化
- 增量式:专为增量编译工作流设计
- 可配置:支持各种优化级别和目标
- 正确性:优先考虑正确性而非激进优化
当前状态
已实现功能
- ✅ 死代码消除:移除无法到达的代码
- ✅ 常量折叠:评估常量表达式
- ✅ 摇树优化:移除未使用的导出(基础)
- ✅ 变量合并:合并变量声明
- ✅ 语句合并:合并兼容的语句
- ✅ 名称混淆:缩短变量和函数名
- ✅ 控制流优化:简化控制结构
- ✅ 函数内联:内联小型函数
- ✅ 高级摇树优化:跨模块优化
性能优化
保持性能的关键策略:
- 最小化 AST 遍历:在单次遍历中结合多种优化
- 高效数据结构:使用区域分配和紧凑表示
- 早期终止:当无法获得收益时跳过优化
资源
文档
外部参考
在线 Playground
- esbuild: https://esbuild.github.io/try
- rollup: https://rollupjs.org/repl
- swc: https://play.swc.rs
- terser: https://try.terser.org
- closure compiler: https://jscompressor.treblereel.dev
