世界を動かす技術を、日本語で。

JavaScript酸化コンパイラ

概要

Oxc はRust製の高性能JavaScriptツール群 ESLint互換のLinterPrettier互換のFormatter などを提供 パフォーマンス は既存ツールを大幅に上回る 型安全性プラグイン対応 など最新機能をサポート オープンソース で無償利用可能

Oxc: モダンJavaScriptツールの基盤

  • Rust製 の高性能JavaScriptツールコレクション
  • 現代的なJavaScript開発 の基礎となる設計
  • 無料かつオープンソース、スポンサーによる支援体制

Linter:Oxlint

  • ESLint互換 のLinter、既存のESLintルールやJSプラグインに対応
  • 50~100倍高速 (ESLint比)、大規模プロジェクトにも最適
  • 650以上のルール を搭載し、継続的に増加
  • 型安全なLint (tsgoによる型解析)
  • バグの早期発見、本番環境へのバグ混入防止

Formatter(アルファ版):Oxfmt

  • Prettier互換 のコードフォーマッタ
  • コードスタイル統一 を自動化
  • Biomeの3倍、Prettierの35倍高速
  • Tailwindクラスの自動ソート に対応
  • 大規模コードベース でも快適な利用感

Parser:oxc-parser

  • 高度な変換・コンパイル の基盤となるパーサ
  • SWCの3倍高速 なパース性能
  • .js(x)や.ts(x) ファイルに対応
  • Test262 stage4 すべてのテストに合格
  • パフォーマンス比較例
    • OXC:26.3ms
    • SWC:84.1ms
    • Biome:130.1ms Macbook Pro M3 MaxでのTypeScript.js解析時

Transformer:oxc-transform

  • 爆速トランスパイル を実現
  • TypeScriptやJSX の変換に対応
  • ES2015への構文変換、型定義(DTS)出力
  • React Fast Refreshstyled-components など最新エコシステム対応

Resolver:oxc-resolver

  • Node.js互換 のCJS/ESMモジュール解決
  • enhanced-resolveと同等の挙動 を再現
  • 28倍高速 なモジュール解決
  • 柔軟なカスタマイズ性

Minifier(アルファ版):oxc-minify

  • コード圧縮・最適化 機能
  • デッドコード削除、構文短縮、余分な空白削除
  • 変数名難読化 によるサイズ削減

サポート・コミュニティ

  • 無料・オープンソース として提供
  • スポンサーシップコントリビューター による支援
  • Silver SponsorsBronze SponsorsBackers 等の協力者

Oxc は、パフォーマンスと互換性を重視した 次世代JavaScriptツールチェーン。既存のツールよりもはるかに高速かつ機能豊富な選択肢として注目されています。

Hackerたちの意見

Void Zeroのプロジェクトは全部めっちゃクールだけど、どうやってマネタイズするつもりなのか気になるな。

マネタイズにはvite plusを使うみたいだよ。

なんでマネタイズする必要があるの?

注目はお金だよ。

こんなにパフォーマンスがあるのに、誰かがこんなに早く何かを作るのに時間がかかったのは不思議だね。すごい成果だよ!

RustはC/C++とは違って、開発者をワクワクさせるからね。

もともとはoxlintから始まって、最近Void Zeroがプロジェクトの資金を集めるために作られたんだと思う。想像するに、大きな障害の一つは、ReactやVue、Svelteみたいな現代のTypeScriptのバリエーションをサポートするために、広範なプラグインサポートが必要なことだね。古いリンティングルールとの後方互換性も必要だし(oxlintの場合、oxcは副産物だったんじゃないかな)。

良いプログラマーが書くのは大変だけど、ほとんどの良いプログラマーはJavaScriptを避けるよね。仕事で仕方なく使わされる場合を除いて。そうなると、JavaScriptを書かない部分を早くするインセンティブもないし。

理由はいくつかあるけど: * クリーンなアーキテクチャが必要だから、ほぼ「ゼロから」始めることになる * Rustやビルドツール全般のパフォーマンスについての知識が必要 * 競争でのパフォーマンス不足や、ユーザーが感じるストレスが理由 * 時間とお金(やっぱり bills は払わなきゃいけないよね?)

断片化されたエコシステム。参入障壁が低いから、ツールが山ほどある。

SWCよりもそんなに速いなんて驚きだ。あのパフォーマンスがどうやって実現されてるのか、誰か詳しいこと知ってる?

彼らが書いた記事があるけど(https://oxc.rs/docs/learn/performance)、SWCとの直接的な比較は載ってないんだよね。

一つ注目すべき点があるよ:生のパース速度を超えて、oxcのASTはアリーナアロケーションでメモリの割り当てに優しいように設計されてる。SWCはもっと伝統的なアプローチを使ってる。実際には、同じファイルに対して複数回処理(リンティング + 変換 + コード生成)を行うときに、oxcの方が中間的なメモリ割り当てを避けられるから、スケールが良くなるんだ。去年、CIパイプラインをbabelからSWCに切り替えたら、約8倍の改善があったよ。最近、同じコードベースでoxcのトランスフォーマーを試したら、SWCの上にさらに30-40%削減できた。何千ものファイルがあると、ASTノードからのGCの圧力が重要になってくるから、効果が重なるんだよ。

Rustでoxcを使ってTypeScriptをJavaScriptにトランスパイルするシンプルなマルチスレッドのトランスパイラを書いたんだ。100,000ファイルを3秒でトランスパイルできる。めっちゃ速いよ!

そんなに速くファイルをインデックスして分類するのは不可能に思える。どんなハードウェア使ってるの?

bun buildとの比較を期待してたんだけど、BunはTypeScriptを直接実行できるから、単純な比較にはならないかな。

Bunのホームページでbun buildとの比較が見つかるよ。ちょっと前に更新されてないけど、その間にBunとRolldownの相対的な違いがあまり変わってないって話は聞いてないな(どっちも速くなってるけど)。テキスト形式だとこんな感じ:10,000のReactコンポーネントをバンドルする(Linux x64, Hetzner) バンドラー バージョン 時間 ───────────────────────────────────────────────────────── Bun v1.3.0 269.1 ms Rolldown v1.0.0-beta.42 494.9 ms esbuild v0.25.10 571.9 ms Farm v1.0.5 1,608.0 ms Rspack v1.5.8 2,137.0 ms

oxc-parserってJavaScriptからコメントを簡単に削除できるの?つまり、コメントを構文的な単位として扱うのか、それとも「次のステージ」に必要ないから無視できるものとして扱うのか。コメントを確認する理由は、もちろんそれを簡単に削除するためなんだけど。

標準的なパーサーなら簡単にできるはず。astexplorer.netを見てみて。

oxc_traverseとかを使って、https://github.com/antithesishq/bombadil のためにオンザフライのJSインストゥルメンテーションを実装してるんだけど、めっちゃ良い感じ。boa_engineと組み合わせることで、Nodeのツールを使ってシェルに出すよりも、静的リンクされた実行可能ファイルを作れるようになった。前のツールたちにはリスペクトだけど、これの方が配布には全然いいね。ウェブ技術にとって良い時代だと思う。

同じグループの人たちが、自分たちのツールで最後のミリ秒やマイクロ秒を削ることにこだわる一方で、ブラウザに送るコードのパフォーマンスには無頓着なのがいつも驚き。もちろん、OPの仕事を否定するつもりはないけどね。

最後のミリ秒やマイクロ秒を削る人たちと、遅いコードをブラウザに送る人たちは同じじゃないよ。POやPM、ステークホルダーたちに感謝しよう。

oxfmtは「biome format」の速い代替品になると思ってたんだけど、全然違った。これを警告として受け取ってほしい:oxfmtを引数なしで実行すると、現在のディレクトリから再帰的にディレクトリツリーをスキャンして、すべての*.jsと*.tsファイルをサイレントに再フォーマットしちゃう。おかげで、Allman形式の大事なJavaScriptファイルがK&Rスタイルに戻せない状態でめちゃくちゃになっちゃった。

Gitのアンドゥ?

これらのファイルはバージョン管理されてるよね?それともバックアップされてる?そうだよね?

VCS使ってないの?

oxfmtを引数なしで実行すると、現在のディレクトリからすべての.jsと.tsファイルを再帰的にスキャンして、静かにフォーマットしてくれる。これが起こることを期待してたし、望んでたことだね。バックアップがないファイル(Gitみたいな)に対して、ファイルを編集するためのツールを実行するのは、ドライランや小規模な実験をする前にやらない方が賢明だと思うよ。

これはユーザーエラーだね。oxfmtは君が頼んだ通りに動いたんだよ。

フォーマットを戻すオプションがないなら、git reset --hardを試してみて。それでうまくいくはず。

そんなこと、絶対に言わないよ。

じゃあ、JavaScript用のuv?いいね。

いや、それはおそらくpnpmだね。JSで書かれてるから、そんなに速くはないけど。