コードフォーマッター「dprint」で「prettier」の改行への不満を解消

Typescript

前書き

今回、私が「prettier」を使っていて、改行の位置が細かく決めれず不便と感じたため、その点を解決できる別のフォーマッター「dprint」についてまとめました。

pritterの挙動

不自然な改行が挿入されるパターン

prettierでは行の横幅に応じて、改行位置が自動で決定されるため、不自然な改行が入ることがあります。

prettierを実行により、コードに改行が入る例

184行目以降のコードが明らかにprettier適用後は改行の位置のバランスが悪く、処理がわかりずらくなったと感じます。

このように、必ずしも行の横幅に応じた改行が見やすいとは限らず、文脈に応じた改行を施すことで、よりよいソースコードになると思います。

意図的な改行が消されるパターン

先ほどの例の場合、「printWidth」の設定値を上げて、横幅を広くすることで解決することはできますが、prettierでは逆に改行を入れたいシーンで、1行になってしまう不便さがあります。

prettierを実行により、改行が消えて1行になる例

prettierではこの改行の位置が使用者の意図通りにいかないことが多いため、筆者は他のコードフォーマッター「dprint」を調査してみました。

dprint

dprintはRust言語で作成されているコードフォーマッターでフォーマットにかかる時間もprettierの10分の1ほどです。

意図的に入れた改行が採用される

実際に先ほどの例のコードをdprintでフォーマットしてみます。

あえて細かくフォーマットを実行することで、筆者が決めた改行位置が反映されていることを表しています。

意図的な改行が消されたり、改行が追加されるパターン

ただしprettierと同じで、必ずしも使用者が決めた改行位置になるとは限らず、そこはdprintの内部ロジックによります。以下は、dprintが改行を削除したり、追加するパターンの例です。

dprintのデフォルト設定ではlineWidthが120になっています。120を超える場合は、pritter同じで改行が入りますが、超えない場合はtypescriptの構文に応じて、改行を許容するしないを判断しているのかと思います。(実際の処理まで見ていないので推測になりますが。。)

それでもprettierより、個人的には改行の判断が優れていると感じました。

dprintの速度について

速度については実際に体感して相当早いなと感じました。
以下はdprintの速度について言及されている方の記事です。

その他のprettierとの違い

その他に感じたprettierとの違いについてですが、prettierではimportのソートはプラグインが必要でしたが、dprintではデフォルトでソートされます。そして外せません。
この点に関しては選択権がないので困る方もいるかもしれません。

最後に

dprintのリポジトリとtypescriptのルールの記載があるページを載せておきます。

repository

dprint
Pluggable and configurable code formatting platform. - dprint

rule

dprint/packages/dprint-plugin-typescript/lib/dprint-plugin-typescript.d.ts at 457cbb5a2a8ded959e8185bf8528ba2b7241b7dd · dprint/dprint
Pluggable and configurable code formatting platform written in Rust. - dprint/dprint
タイトルとURLをコピーしました