⚓ Oxc
氧化编译器正在创建一系列用于JavaScript和TypeScript的高性能工具。
Oxc正在构建一个解析器、代码检查器、格式化器、转译器、压缩器、解析器...全部用Rust编写。
更多信息请访问oxc.rs!
🙋谁在使用Oxc?
- Rolldown使用oxccrate进行解析和转译。
- Nova运行时使用oxccrate进行解析。
- Rolldown、Biome和swc-node使用oxc_resolvercrate进行模块解析。
- 像Preact、Shopify、字节跳动和Shopee这样的项目和公司使用oxlint进行代码检查。
⚡️ 代码检查器快速入门
代码检查器已准备好为您捕捉错误。它默认开启了91条规则(总共超过340条),无需任何配置。
开始使用,运行oxlint或通过npx
:
npx oxlint@latest
为了让您了解其功能,这里有一个来自vscode仓库的示例,它在0.7秒内完成了对4800多个文件的检查。
⚡️ 性能
- 解析器旨在成为最快的基于Rust的可用于生产的解析器。
- 代码检查器比ESLint快50倍以上,并且可以随CPU核心数量扩展。
⌨️ Rust、Node.js和Wasm使用
Rust
单独的crate已发布,您可以使用它们来构建自己的JavaScript工具。
- 伞形crate oxc从此仓库导出所有公共crate。
- AST和解析器crate oxc_ast和oxc_parser已可用于生产。
- 用于模块解析的解析器crate oxc_resolver也已可用于生产。
- 这些crate的使用示例可以在它们各自的
crates/*/examples
目录中找到。
虽然Rust以其相对较慢的编译速度而闻名,但我们已经投入了大量精力来优化Rust的编译速度。我们的目标是最小化对您开发工作流程的影响,确保开发您自己的基于Oxc的工具仍然是一个流畅和高效的体验。
这一点在我们的CI运行中得到了证明,其中热运行在3分钟内完成。
Node.js
- 通过napi:oxc-parser
Wasm
🎯 工具
🔸 AST和解析器
Oxc维护自己的AST和解析器,这是迄今为止用Rust编写的最快和最符合标准的JavaScript和TypeScript(包括JSX和TSX)解析器。
由于解析器通常是JavaScript工具中的主要性能瓶颈,任何微小的改进都可能对我们的下游工具产生级联效应。通过开发我们的解析器,我们有机会探索和实现经过充分研究的性能技术。
虽然许多现有的JavaScript工具依赖于estree作为它们的AST规范,但一个显著的缺点是它有大量模糊的节点。这种模糊性在使用estree进行开发时经常导致混淆。
Oxc AST与estree AST略有不同,它通过移除模糊节点并引入明确的类型来解决这个问题。例如,不使用通用的estreeIdentifier
,Oxc AST提供了特定的类型,如BindingIdentifier
、IdentifierReference
和IdentifierName
。这种明确的区分通过更紧密地与ECMAScript规范保持一致,大大增强了开发体验。
🏆 解析器性能
我们的基准测试显示,Oxc解析器的速度比swc解析器快约3倍,比Biome解析器快5倍。
它为什么如此快速?
- AST分配在内存竞技场(bumpalo)中,以实现快速的AST内存分配和释放。
- 短字符串通过CompactString内联。
- 除上述两项外,不进行其他堆分配。
- 作用域绑定、符号解析和一些语法错误不在解析器中完成,它们被委托给语义分析器。
🔸 代码检查器
代码检查器采用约定优于配置的原则,消除了大量配置和插件设置的需求。与其他需要复杂配置和插件安装(例如@typescript-eslint)的代码检查器(如ESLint)不同,我们的代码检查器只需要一个命令,您就可以立即在您的代码库上运行:
npx oxlint@latest
🏆 代码检查器性能
代码检查器比ESLint快50-100倍,具体取决于使用的规则数量和CPU核心数。对于大多数拥有几百个文件的代码库,它可以在不到一秒的时间内完成,对于更大的单体仓库,只需要几秒钟。详情请参见bench-javascript-linter。
作为额外优势,二进制文件大约为5MB,而ESLint及其相关插件依赖很容易超过100MB。
您也可以从最新发布标签下载代码检查器二进制文件作为独立二进制文件,这让您可以在CI中运行代码检查器而无需安装Node.js。
它为什么如此快速?
- 使用Oxc解析器。
- 由于内存竞技场的线性内存扫描,AST访问是一个快速操作。
- 文件在多线程环境中进行检查,因此可以随着CPU核心总数扩展。
- 每个单独的检查规则都经过性能优化。
🔸 解析器
模块解析在JavaScript工具中扮演着至关重要的角色,特别是对于多文件分析或打包等任务。然而,它经常成为性能瓶颈。为了解决这个问题,我们开发了oxc_resolver。
解析器已经可以用于生产,目前正在Rolldown中使用。使用方法和示例可以在它自己的仓库中找到。
🔸 转换器(转译器)
转换器负责将较高版本的ECMAScript转换为可以在旧浏览器中使用的较低版本。我们目前正专注于架构。详情请参见里程碑1。
🔸 隔离声明
TypeScript隔离声明生成,无需使用TypeScript编译器。
我们的基准测试表明,我们的实现比TypeScript编译器至少快20倍。
🔸 压缩器
JavaScript压缩在优化网站性能方面发挥着关键作用,因为它减少了发送给用户的数据量,从而加快了页面加载速度。这对电子商务网站特别有巨大的经济价值,因为每一秒都可能等同于数百万美元。
然而,现有的压缩器通常需要在压缩质量和速度之间做出权衡。您必须在最慢但压缩效果最好,或最快但压缩效果较差之间做出选择。但如果我们能开发一个更快的压缩器而不影响压缩效果呢?
我们正在积极开发一个原型,旨在实现这个目标,方法是移植来自知名压缩器(如google-closure-compiler、terser、esbuild和tdewolff-minify)的所有测试用例。
初步结果表明我们正在朝着我们的目标前进。使用Oxc压缩器,您可以期待更快的压缩时间而不牺牲压缩质量。
🔸 格式化器
虽然prettier已经成为JavaScript的事实上的代码格式化工具,但开发者社区对一个不那么固执己见的替代方案有着强烈的需求。认识到这一需求,我们的目标是进行研究和开发,创建一个新的JavaScript格式化器,提供更多的灵活性和自定义选项。
原型目前正在开发中。
✍️ 贡献
请参阅CONTRIBUTING.md获取指导。
如果您无法通过代码贡献,您仍然可以通过以下方式参与:
- 给项目添加GitHub星标。
- 加入我们的Discord。
- 在Twitter上关注我并转发这个项目。
📚 学习资源
- 我的小教程如何用Rust编写JavaScript解析器
- 我的小文章构建JavaScript编译器的性能追求
- 更多
🤝 鸣谢
本项目在这些杰出导师和他们的项目的帮助下孵化:
- Biome - @ematipico
- Ruff - @charliermarsh, @MichaReiser
- quick-lint-js - @strager
- elm-review - @jfmengels
特别感谢
- @domonji 共同引导这个项目,并完成了TypeScript解析器。
- @tongtong-lu 和 @guan-wy 设计了项目标志。
❤ 谁在赞助Oxc?
📖 许可证
Oxc是根据MIT许可证授权的免费开源软件。
Oxc从其他开源项目移植或复制了代码,它们的许可证列在第三方库许可证中。