コードフォーマッターはPrettierだけじゃない。圧倒的処理速度のRomeを紹介

## Romeとは
Rust製の新しいコードフォーマッターで、JavaScript / TypeScriptに対応してます。
つい去年正式リリースされたばかりのまだ新しいツールです。

公式ドキュメント

https://rome.tools/

## 特徴
#### 1. 処理速度が桁違いに速い
Romeの最大の特徴になります。
コードフォーマッターで主流になっているPrettierと比べておよそ25倍の処理速度をほこります。
後で検証してみます。
> ※公式では85000行のソースコードで検証した時、Prettierでは4.3秒かかったのが、Romeではたったの0.1秒でできたそうです。

最近新しくリリースされているRust製のアプリが他のアプリに比べて圧倒的な速度を出していることをよく耳にしますが、これもその一つですね。

#### 2.　シンプルな設定
設定方法はPrettierと同じで、VSCodeのデフォルトフォーマッターに選択、もしくはnpmからインストールすることで使用することができます。
細かな設定もjsonファイルから変更することができます。


#### 3. JavaScripとTypeScritに対応

現在はJavaScript / TypeScript / JSON / JSXに対応してます。
まだHTMLやCSSには対応してないそうです。

https://docs.rome.tools/internals/language_support/

#### 4. コードのフォーマット以外にも今後いろいろ使えるらしい
現在はコードフォーマットとLinterとして使うことができますが、今後はテストやコンパイル、バンドルにも対応していくそうです。
今後が楽しみ。

## 導入方法（VSCode）
#### 1. VSCodeのプラグインからRomeの拡張機能をインストール
![スクリーンショット 2023-05-19 20.28.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/e0a1db66-b6c0-7360-4a44-adfd72506665.png)

#### 2. Default FormatterをRomeに変更
VSCodeの画面左下の歯車ボタンから設定を選択し、検索欄に「Editor Default Formatter」と入力。
セレクトバーの中に**Rome**があると思うので、選択。
![スクリーンショット 2023-05-19 20.41.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/7484591f-4c21-38e7-1f13-515417185ec9.png)

#### 3. もしVSCode以外を利用してる人はいち早く別のエディターでも使えるように、公式に投票しよう！
https://github.com/rome/tools/discussions/3544

これで設定は完了です！

## 導入方法（npm）
#### 1. romeをインストール
```
npm install --save-dev --save-exact rome
```
もしくは
```
yarn add --dev --exact rome
```
<br>

#### 2. rome.jsonを作成
```
npx rome init
```
もしくは
```
yarn rome init
```
<br>

#### 3. rome.jsonが作成されていることの確認
作成されたrome.jsonを見ると、中には以下のような内容が記載されているかと思います。
```
{
  "$schema": "./node_modules/rome/configuration_schema.json",
  "organizeImports": {
    "enabled": false
  },
  "linter": {
    "enabled": true,
    "rules": {
      "recommended": true
    }
  }
}

```
これで設定は完了です！

## 設定できる内容の紹介
#### 1. 基本構成
デフォルトで以下の内容が設定されてます。
```
 "formatter": {
　　　　　　　　　// Romeのフォーマッターを有効にするか無効にするか
    "enabled": true or false, 

　　　　　　　　// 構文エラーがあった時もフォーマットをするか
    "formatWithErrors": false or true, 

　　　　　　　// インデントのスタイル。"tab"(半角4つ)か"space"（半角２つ）ですが、spaceの方が良いかなと思います。
    "indentStyle": "tab" or "space", 

　　　　　　　// インデントの大きさ
    "indentSize": 2 or 好きな値, 

　　　　　　// １行に何文字書けるようにするか
    "lineWidth": 80 or 好きな値, 

　　　　　　// Romeのフォーマットの対象から外れるファイルパス
    "ignore": [] or ["scripts/*.js"]
  }
```

#### 2. その他JavaScript / TypeScriptのみに適用される設定
```
"javascript": {
	"formatter": {
　　　　　　　　　　　　　　　　　　// オブジェクト内のプロパティを引用符で囲む必要があるか
		"quoteProperties":"asNeeded" or "preserve",

　　　　　　　　　　　　　　　　　// 引用符のタイプ
		"quoteStyle": "double" or "single",

　　　　　　　　　　　　　　　　// 文末のカンマをつけるか、つけないか
		"trailingComma":"all" or "es5" or "none",

　　　　　　　　　　　　　　　　// 文末にセミコロンを必ずつけるか、必要な時だけつけるか
		"semicolons": "asNeeded" or "all", 
	}
}
```
その他にもfileやschemaに対する設定もできますが、利用頻度が低そうなのでここでは割愛します。

## 実際に使ってみた
#### 1. 大量のソースコードを用意
引数で受け取ったスネークケースの文字列をローワーキャメルケースに変える関数を大量にコピペして約4万行になるように作成しました。
![スクリーンショット 2023-05-19 22.01.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/9168869d-a0f8-6e8c-c501-fce447a5a1af.png)


#### 2. 実行！
```
npx rome format src/pages/index.tsx --write
```
0.15秒でフォーマットしてくれました、速い！
![スクリーンショット 2023-05-19 22.04.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/9892a87a-5e62-c5e1-e735-c453f3053adb.png)

#### 3. じゃあPrettierでは何秒？
```
npx prettier --write ./src/pages/index.tsx
```
1.5秒かかりました、10倍違いますね。
実際にフォーマッタを実行してみるとわかるのですが、体感速度が全然違いました。
![スクリーンショット 2023-05-19 22.07.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1812049/181ee8d0-902b-201a-7cee-e2a807fb0330.png)

## その他
#### フォーマットして欲しくないところがある場合
先ほどのような大量のソースコードは時にはフォーマッタをかけたくない時もあるかと思います。
**ignore**の欄に以下のようにfileパスを入力するとRomeのフォーマッターの対象から外れます。
```
"ignore": ["src/pages/*.tsx"]
```

もしくはコメントアウトで以下の内容を記載すると、Romeのフォーマッターの対象から外してくれるそうです。
```
// rome-ignore format: the array should not be formatted
```

#### 以下のURLから実際にPrettierとRomeを比較しながら検証できます。

https://docs.rome.tools/playground/?code=ZQB4AHAAbwByAHQAIABjAG8AbgBzAHQAIABnAGUAdABPAG8AdQB0AFMAaQBkAGUAPQAoACkAPQA%2BAHsAcgBlAHQAdQByAG4AKAA8AGQAaQB2AD4APAAvAGQAaQB2AD4AKQB9AA%3D%3D

## 所感
#### 一つのファイルに大量のソースコードを書く場合はとても良い
静的データやUtility関数を格納してるファイルとかはどうしても行数が長くなってしまいがちです。
PCのスペックにもよるかもしれないですが、Prettierの実行が遅くてストレスに感じてる人がいるかと思います。
そんな人には是非一度試して欲しいです。

#### 設定できる内容はPrettierに比べると少ない
Prettierに比べるとjsonファイルに設定できる項目は少ないですが、普段あまりコアな設定をしてないので、僕にとっては今の種類だけでも十分でした。

#### 細かい設定がない
上記に紐づくことではありますが、複雑な設定は必要なく、VSCodeに設定しておくか、npmからインストールするだけで動かすことができます。

#### これからに期待！
現状はJavaScriptとTypeScriptだけですが、今後はhtmlやcssといったマークアップ言語や他の言語にも対応して欲しいですね。