Oxfmt和Oxlint介绍与Biome比较
探索Oxfmt和Oxlint - 两个高性能Rust工具并与Biome进行架构比较
在现代JavaScript/TypeScript世界中,我们正在见证高性能Rust工具的兴起。虽然Biome ↗已将自己确立为一体化工具链,但Oxc ↗采用了不同的方法,提供专业工具:Oxfmt(格式化器)和Oxlint(代码检查器)。本文将介绍这两个工具并与Biome比较它们的架构。
什么是Oxfmt?#
Oxfmt(/oʊ-ɛks-fɔːr-mæt/是基于Oxc编译器栈构建的JavaScript生态系统高性能格式化器。它旨在在与Prettier完全兼容的同时大幅提高性能。
Oxfmt的主要功能#
多语言支持#
Oxfmt支持多种文件格式,其中一些由原生Rust引擎处理,其他格式委托给捆绑的Prettier:
原生格式(完全在Rust中运行):
- JavaScript/JSX:
.js,.jsx,.mjs,.cjs - TypeScript/TSX:
.ts,.tsx,.mts,.cts,.d.ts - JSON/JSONC/JSON5:
.json,.jsonc,.json5 - CSS/SCSS/Less:
.css,.scss,.less - GraphQL:
.graphql,.gql - TOML:
.toml - YAML:
.yml,.yaml
委托格式(使用捆绑的Prettier):
- HTML, Angular, Vue, Svelte
- Markdown, MDX
- Handlebars, MJML
内置功能#
Oxfmt包含通常需要外部Prettier插件的功能:
- Import sorting: 使用可配置选项对导入进行排序
- Tailwind CSS class sorting: 自动Tailwind类排序(与
prettier-plugin-tailwindcss兼容) - package.json field sorting: 自动package.json字段组织
- Embedded formatting: 格式化模板字面量中嵌入的代码(CSS-in-JS、GraphQL等)
性能#
根据基准测试,Oxfmt:
- 比Prettier快约30倍
- 比Biome快2倍
Prettier兼容性#
Oxfmt目前通过了100%的Prettier JavaScript和TypeScript一致性测试。从最近的Prettier版本迁移时,不应出现格式差异。
Oxfmt架构#
Oxfmt使用三阶段格式化系统:
graph LR
AST[AST from Parser] --> IRGen[IR Generation]
IRGen --> IR[FormatElement IR]
IR --> Transform[IR Transformation]
Transform --> sort_imports[sort_imports]
sort_imports --> tailwind_sort[Tailwind Sort]
tailwind_sort --> Printer[Printing]
Printer --> Output[Formatted Text]
- IR Generation: 使用
Format特征进行AST遍历 - IR Transformation: 应用转换如
sort_imports和Tailwind排序 - Printing: 打印机消耗IR并渲染最终输出
[!NOTE] Oxfmt格式化器核心是从Biome的
biome_formattercrate移植的,但具有完全语言无关的设计。
什么是Oxlint?#
Oxlint(`/oʊ-ɛks-lɪnt/)是基于Oxc编译器栈构建的JavaScript和TypeScript高性能代码检查器。它被设计为具有卓越性能的ESLint直接替代品。
Oxlint的主要功能#
广泛的规则覆盖#
Oxlint包含870+内置规则,涵盖最流行的代码检查插件:
- ESLint核心规则: 基本JavaScript规则
- TypeScript规则: 包括类型感知规则
- 流行插件: React, Jest, Vitest, Import, Unicorn, jsx-a11y
- 自定义JS插件: 与ESLint插件生态系统兼容
类型感知代码检查#
Oxlint使用TypeScript编译器的原生Go端口(tsgo aka TypeScript 7),提供:
- 完整的TypeScript兼容性
- 与TypeScript相同的类型系统行为
- 与TypeScript语义一致的类型感知代码检查
多文件分析#
Oxlint将多文件分析作为一等公民功能支持:
- 构建项目范围的模块图
- 在规则间共享解析和解析
- 改进依赖于跨文件导入的检查
- 避免ESLint中
import/no-cycle等规则常见的性能悬崖
性能#
Oxlint专为大型存储库和CI环境构建:
- 比ESLint快50-100倍
- 架构消除了限制ESLint性能的结构瓶颈
- 多线程文件处理
Oxlint架构#
Oxlint使用并行执行架构和双分支策略:
graph TB
CLI[CLI Interface] --> LintRunner[LintRunner]
LintRunner --> LintService[LintService]
LintService --> Runtime[Runtime]
Runtime --> process_source[process_source]
process_source --> Parser[Parser]
Parser --> AST[AST]
AST --> LintContext[LintContext]
LintContext --> Linter[Linter]
Linter --> execute_rules[execute_rules]
execute_rules --> strategy1[Strategy 1: nodes → rules]
execute_rules --> strategy2[Strategy 2: rules → nodes]
strategy1 --> RULE_BUCKETS[RULE_BUCKETS]
strategy2 --> RULE_BUCKETS
LintService --> DiagnosticService[DiagnosticService]
DiagnosticService --> Output[Output]
主要组件#
- LintService: 通过并行执行协调代码检查
- Runtime: 管理路径和文件发现
- LintContext: 包含
Semantic分析上下文 - Linter: 在AST上执行规则的核心引擎
- Rule Trait: 定义规则实现的钩子
双分支策略#
- 小文件(<200k节点): 迭代(节点→规则)
- 大文件(≥200k节点): 使用RULE_BUCKETS迭代(规则→节点)
- 这避免了在大文件上的CPU缓存颠簸
与Biome的架构比较#
1. 设计理念#
| 特性 | Oxfmt/Oxlint | Biome |
|---|---|---|
| 方法 | 专业工具 | 一体化工具链 |
| 集成 | 分离,可独立使用 | 集成格式化器+代码检查器 |
| 部署 | 传统CLI | IDE的守护进程 |
| 配置 | 分离配置文件 | 统一biome.json |
2. 格式化器架构#
| 特性 | Oxfmt | Biome |
|---|---|---|
| 阶段 | 3阶段(IR Gen + Transform + Printing) | 2阶段(Lowering + Printing) |
| IR设计 | oxc_formatter_core中的FormatElement | biome_formatter中的FormatElement |
| 转换 | sort_imports、Tailwind排序、package.json排序 | 最小内置转换 |
| Prettier兼容性 | 100%测试通过,内置兼容性 | Prettier启发但输出不同 |
| 语言支持 | 原生Rust + 委托Prettier | 原生Rust实现 |
3. 代码检查器架构#
| 特性 | Oxlint | Biome |
|---|---|---|
| 规则数 | 870+内置规则 | 规则较少,专注于核心 |
| 类型感知代码检查 | Tsgo(TypeScript 7 Go端口) | 内置TypeScript支持 |
| 多文件分析 | 一等公民功能,模块图 | 支持有限 |
| 并行执行 | 双分支策略 | 通过WorkspaceServer |
| 插件系统 | 用于ESLint兼容性的JS插件(alpha) | 原生插件架构 |
4. 性能#
| 特性 | Oxfmt/Oxlint | Biome |
|---|---|---|
| 格式化器速度 | 比Prettier快30倍,比Biome快2倍 | 比Prettier快10-20倍 |
| 代码检查器速度 | 比ESLint快50-100倍 | 与Oxlint相似 |
| 内存 | Arena分配器,零拷贝 | 基于Rowan的基础设施 |
| 启动 | 传统CLI,快速启动 | 守护进程,初始启动较慢 |
5. 迁移路径#
| 特性 | Oxfmt/Oxlint | Biome |
|---|---|---|
| 从Prettier | 直接迁移,100%兼容性 | 需要调整到不同输出 |
| 从ESLint | 直接替代,870+规则 | 需要规则配置更改 |
| 配置迁移 | --migrate=prettier、--migrate=biome | 手动配置转换 |
| 工具集成 | Prettier兼容CLI | 自定义Biome CLI |
何时使用哪个?#
选择Oxfmt + Oxlint当:#
- 您需要CI/CD的最大性能
- 需要Prettier兼容性而不更改输出
- 想要格式化器和代码检查器的分离工具
- 从ESLint + Prettier迁移,干扰最小
- 需要内置的Tailwind CSS集成
- 想要具有准确TypeScript语义的类型感知代码检查
选择Biome当:#
- 您想要一个包中的统一工具链
- 需要原生多语言支持(CSS、HTML、GraphQL)
- 想要用于更好IDE集成的守护进程
- 团队想要单一配置文件
- 不需要绝对的Prettier兼容性
使用示例#
Oxfmt#
# 安装
npm install -D oxfmt
# 格式化文件
oxfmt src/
# 检查格式化
oxfmt --check src/
# 初始化配置
oxfmt --init
# 从Prettier迁移
oxfmt --migrate=prettier
# 从Biome迁移
oxfmt --migrate=biomebashOxlint#
# 安装
npm install -D oxlint
# 检查文件
oxlint src/
# 类型感知代码检查
oxlint --tsconfig tsconfig.json src/
# 多文件分析
oxlint --enable-import-plugin src/bashBiome#
# 安装
npm install -D @biomejs/biome
# 格式化和检查
biome check src/
# 仅格式化
biome format src/
# 仅检查
biome lint src/
# 监视模式
biome check --watch .bash结论#
Oxfmt和Oxlint代表专业工具方法,具有最大性能和Prettier/ESLint兼容性,而Biome提供具有集成体验的统一工具链。
两个生态系统之间的选择取决于项目优先级:性能与兼容性 vs 集成与简单性、分离工具 vs 统一工具链、现有生态系统兼容性 vs 新工具链采用。
两者都代表具有高Rust性能的JavaScript/TypeScript工具的未来,但在开发工作流中服务于不同的用例。