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