零弐壱蜂

PrettierからOxfmtへの移行はMarkdownプロジェクトで有効か

概要

OxfmtはVoidZeroが開発するRust製の高速フォーマッターである。Prettier互換を掲げ、JavaScript/TypeScriptでは30倍以上の高速化が報告されている。2026年2月にBeta版がリリースされた。

Markdownプロジェクトでも同様の高速化が期待できるのか検証した。

課題

確認点は以下の2点である。

  • Markdownファイルのフォーマット速度は改善するか
  • 既存のPrettier運用から移行した場合にMarkdownの差分は発生するか

検証環境

  • Prettier 3.8.1
  • Oxfmt 0.43.0(Beta)
  • 対象ファイル: 567件のMarkdownファイル

Prettierの設定は以下の通りである。

{
  "printWidth": 120,
  "trailingComma": "all",
  "singleQuote": true,
  "semi": true
}

MarkdownではPrettierをそのまま呼び出す

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が実行している。

  1. 出力の互換性が高い: 同じパーサを使うため、設定さえ合っていればフォーマット結果が一致する
  2. Prettierのバグも継承する: リスト内にコードブロックを含む場合のフォーマットを2回実行すると結果が変わる問題(prettier/prettier#10063)がそのまま発生する。この問題は2021年から未修正である

検証結果

Markdownのみのプロジェクトでは速度差がない

Markdownが内部的にPrettierを呼ぶ以上、速度面の恩恵はほぼない。実測結果は以下の通りである。

対象PrettierOxfmt
1ファイル0.95秒1.36秒
50ファイル1.42秒1.84秒

npxの起動オーバーヘッドを含むため厳密な比較ではないが、Markdownのみのプロジェクトでは速度面の優位性は確認できなかった。

JS/TSを含むプロジェクトでは差分の有無を確認する

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を生成する
.prettierignoreOxfmtは.prettierignoreを読む。追加設定は不要
scripts / hookprettier --writeoxfmt --writeに置き換える

まとめ

OxfmtのMarkdownフォーマットは内部的にPrettierを呼ぶ設計のため、速度面のメリットはない。Markdownのみのプロジェクトでは、移行による優位性は確認できなかった。

JavaScript/TypeScriptのフォーマットも統一的に扱いたい場合にはOxfmtへの移行は合理的である。その場合、設定を移行すればMarkdownファイルのフォーマットに差分は生じない。

参考