blog.dopana

Back

在现代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]
  1. IR Generation: 使用Format特征进行AST遍历
  2. IR Transformation: 应用转换如sort_imports和Tailwind排序
  3. Printing: 打印机消耗IR并渲染最终输出

[!NOTE] Oxfmt格式化器核心是从Biome的biome_formatter crate移植的,但具有完全语言无关的设计。

什么是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]

主要组件#

  1. LintService: 通过并行执行协调代码检查
  2. Runtime: 管理路径和文件发现
  3. LintContext: 包含Semantic分析上下文
  4. Linter: 在AST上执行规则的核心引擎
  5. Rule Trait: 定义规则实现的钩子

双分支策略#

  • 小文件(<200k节点): 迭代(节点→规则)
  • 大文件(≥200k节点): 使用RULE_BUCKETS迭代(规则→节点)
  • 这避免了在大文件上的CPU缓存颠簸

与Biome的架构比较#

1. 设计理念#

特性Oxfmt/OxlintBiome
方法专业工具一体化工具链
集成分离,可独立使用集成格式化器+代码检查器
部署传统CLIIDE的守护进程
配置分离配置文件统一biome.json

2. 格式化器架构#

特性OxfmtBiome
阶段3阶段(IR Gen + Transform + Printing)2阶段(Lowering + Printing)
IR设计oxc_formatter_core中的FormatElementbiome_formatter中的FormatElement
转换sort_imports、Tailwind排序、package.json排序最小内置转换
Prettier兼容性100%测试通过,内置兼容性Prettier启发但输出不同
语言支持原生Rust + 委托Prettier原生Rust实现

3. 代码检查器架构#

特性OxlintBiome
规则数870+内置规则规则较少,专注于核心
类型感知代码检查Tsgo(TypeScript 7 Go端口)内置TypeScript支持
多文件分析一等公民功能,模块图支持有限
并行执行双分支策略通过WorkspaceServer
插件系统用于ESLint兼容性的JS插件(alpha)原生插件架构

4. 性能#

特性Oxfmt/OxlintBiome
格式化器速度比Prettier快30倍,比Biome快2倍比Prettier快10-20倍
代码检查器速度比ESLint快50-100倍与Oxlint相似
内存Arena分配器,零拷贝基于Rowan的基础设施
启动传统CLI,快速启动守护进程,初始启动较慢

5. 迁移路径#

特性Oxfmt/OxlintBiome
从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#

Oxlint#

# 安装
npm install -D oxlint

# 检查文件
oxlint src/

# 类型感知代码检查
oxlint --tsconfig tsconfig.json src/

# 多文件分析
oxlint --enable-import-plugin src/
bash

Biome#

# 安装
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工具的未来,但在开发工作流中服务于不同的用例。

参考资料#