概要
OxfmtはVoidZeroが開発するRust製の高速フォーマッターである。Prettier互換を掲げ、JavaScript/TypeScriptでは30倍以上の高速化が報告されている。2026年2月にBeta版がリリースされた。
Markdownプロジェクトでも同様の高速化が期待できるのか検証した。
OxfmtはVoidZeroが開発するRust製の高速フォーマッターである。Prettier互換を掲げ、JavaScript/TypeScriptでは30倍以上の高速化が報告されている。2026年2月にBeta版がリリースされた。
Markdownプロジェクトでも同様の高速化が期待できるのか検証した。
確認点は以下の2点である。
Prettierの設定は以下の通りである。
{
"printWidth": 120,
"trailingComma": "all",
"singleQuote": true,
"semi": true
}Oxfmtの高速化はJavaScript/TypeScriptのパーサをRustでネイティブ実装していることに起因する。一方でCSS・HTML・Markdownなど非JS言語のフォーマットはPrettierをNAPI経由で呼び出す実装になっているらしい。OxfmtのメンテナであるBoshenがFormatter RFCで以下のように述べている。
Use prettier as a dependency for embedded languages. When an embedded language is detected - call prettier to format the embedded language via napi.
つまりMarkdownファイルのフォーマット処理はPrettierが実行している。
Markdownが内部的にPrettierを呼ぶ以上、速度面の恩恵はほぼない。実測結果は以下の通りである。
| 対象 | Prettier | Oxfmt |
|---|---|---|
| 1ファイル | 0.95秒 | 1.36秒 |
| 50ファイル | 1.42秒 | 1.84秒 |
npxの起動オーバーヘッドを含むため厳密な比較ではないが、Markdownのみのプロジェクトでは速度面の優位性は確認できなかった。
JavaScript/TypeScriptも含むプロジェクトでOxfmtへ移行する場合、Markdownで差分が出るかを確認する必要がある。設定を移行すれば差分は生じない。
OxfmtはPrettierの設定ファイル(.prettierrc.json)を読まない。Oxfmt独自の.oxfmtrc.jsonが必要である。
設定ファイルなしでOxfmtを実行すると、YAMLフロントマターのtitleフィールドでクオート形式が変わる。
# Prettier(singleQuote: true)
title: '[Git] GPG署名エラー(pinentry)の解決方法'
# Oxfmt(設定なし、デフォルトのダブルクオート)
title: "[Git] GPG署名エラー(pinentry)の解決方法"これはsingleQuoteオプションがデフォルトでfalseであるためである。このプロジェクトでは567件中205件のファイルがシングルクオートで囲まれたtitleを持っており、影響範囲は広い。この差分はoxc-project/oxc#18444としても報告されている。
Oxfmtには--migrateオプションがあり、Prettierの設定を自動変換できる。
# .prettierrc.json から .oxfmtrc.json を生成
npx oxfmt --migrate prettier以下のPrettier設定から生成された.oxfmtrc.jsonを配置した状態で、直近50件+ランダム20件の計70ファイルを比較した結果、全ファイルでPrettierとOxfmtの出力が一致した。
{
"printWidth": 120,
"trailingComma": "all",
"singleQuote": true,
"semi": true,
"sortPackageJson": false,
"ignorePatterns": []
}# 検証方法(1ファイルずつ比較)
# 1. prettier --write でフォーマット → 結果を保存
# 2. 元に戻してから oxfmt --write でフォーマット → 結果を保存
# 3. diff で比較
diff /tmp/prettier_output.md /tmp/oxfmt_output.md| 項目 | 内容 |
|---|---|
| 設定ファイル | oxfmt --migrate prettierで.oxfmtrc.jsonを生成する |
.prettierignore | Oxfmtは.prettierignoreを読む。追加設定は不要 |
| scripts / hook | prettier --writeをoxfmt --writeに置き換える |
OxfmtのMarkdownフォーマットは内部的にPrettierを呼ぶ設計のため、速度面のメリットはない。Markdownのみのプロジェクトでは、移行による優位性は確認できなかった。
JavaScript/TypeScriptのフォーマットも統一的に扱いたい場合にはOxfmtへの移行は合理的である。その場合、設定を移行すればMarkdownファイルのフォーマットに差分は生じない。