LoginSignup
5
3

More than 3 years have passed since last update.

【React / TypeScript】ESLint と Prettier を設定する(Prettier 編)

Posted at

概略

前回の記事で, Linter(ESLint)を設定した React アプリに, Formatter(Prettier)を適用します。

なお, 現在までの流れは以下の記事です。
1. Create React App(TypeScript)でアプリを起動して Material UI ちょこっと触るまで
2. 【React / TypeScript】 ESLint と Prettier を設定する(ESLint 編)

Formatter はインデントのサイズとか改行とか諸々を揃えてくれるコード整形のツールですね。
(余談ですが, チーム開発においての Formatter 導入は, 諸々の宗教論争が容赦無く静まる感じがつよつよです)

本記事では, Formatter は Prettier を導入します。(著名なやつですね)

Prettier の導入

npm install する

公式 に従って進みます。
まず, 設定したいプロジェクトのディレクトリへ移動します。

% cd my-app

prettier を npm install します。(余談:--save-exact すると Version 固定で package.json) に入ります

% npm install --save-dev --save-exact prettier

package.json に Prettier の記載が追加されました。

package.json
"devDependencies": {
  "prettier": "2.2.1"
}

prettier の設定ファイルを用意する

公式通り, 以下を実行して Prettier の設定ファイル .prettierrc.json(空)を用意します。

echo {}> .prettierrc.json

Prettier の除外ディレクトリやファイルを指定するように, .prettierignore も追加します。

touch .prettierignore

.prettierignore の中身は適宜設定どうぞという形ですが, いったん公式通り以下な感じにしておきます

.prettierignoreの中身
# Ignore artifacts:
build
coverage

ESLint との共存のための設定をする

上記, npm install と設定ファイルの用意で動かせるのですが, ESLint を入れている関係で, ESLint と Prettier で競合するルールがあります。
なので, 戦いが始まらないように, ESLint 側に設定を追加します。

やり方の大筋

さて, 前までは eslint-plugin-prettier を用いて ESLint で Prettier を実行する感じが多かったようなのですが, Prettier 公式がそのやり方を非推奨としています。(理由などは公式を参照
つまるところ, ESLint で静的コード解析を実行して, Prettier でコード整形をするような単純な感じにするとよいとのことです。

では, 公式で指示されている通りに設定していきます。

eslint-config-prettier を設定する

公式 で案内されている通り, eslint-config-prettier は, ESLint と Prettier で競合するルールを, ESLint 上でオフにするために使うものです。

では, eslint-config-prettier の公式 に従って設定を進めます。
まず npm install します。

npm install --save-dev eslint-config-prettier

続いて, ESLint の設定ファイル .eslintrc.json 内の extends 末尾に prettier を追加します。

公式のコメント通り, Eslint の何の Plugin を使っているかによって, 必要な Prettier の記載を追加します。
"prettier" は基本として入れます。そして, 僕の現状の場合は plugin:react, plugin:@typescript-eslint を利用しているので, "prettier/@typescript-eslint""prettier/react" も入れます。

.eslintrc.json
"extends": [
    "... ...",
    "plugin:react/recommended",
    "airbnb",
    "plugin:@typescript-eslint/recommended",
    "plugin:@typescript-eslint/recommended-requiring-type-checking"
    "... ...",
    "prettier", // 追加
    "prettier/@typescript-eslint", // 追加
    "prettier/react" // 追加
]

ESLint の各種ルール(airbnb とかの)を, prettier 系で上書きして競合ルールをオフにするため, 末尾にいれる必要がある感じです。(後に書かれたもので手前の設定を上書きます)

Prettier を動かす

さて, Prettier の動作のための設定はおわったので, 動かします。

実行した場合にどうなるかを先にみる方法

ファイル名の指定のみで prettier を実行すると, 整形後をみることができます。

% ./node_modules/.bin/prettier src/App.tsx 

例えば以下のような src/App.tsx に対して実施すると,

src/App.tsx
import React from 'react';

const App: React.FC = () => (
  <div>
    Hello World
  </div>
);

export default App;

コンソールに以下のように出力されます(prettier 適用後の様子です)

% ./node_modules/.bin/prettier src/App.tsx 
import React from "react";

const App: React.FC = () => <div>Hello World</div>;

export default App;

整形を実行する

--write を指定して prettier を実行すると, 整形して書き換えられます。簡単ですね。

% ./node_modules/.bin/prettier --write src/App.tsx 

全部に対してやるなら . 指定です。

% ./node_modules/.bin/prettier --write . 

整形のスクリプトを npm scripts に追加する

前回の記事で ESLint を動かすように npm scripts に書きましたが, Prettier 用にも追加します。
package.jsonscripts に追加します。以下は src 配下すべてを整形する感じにしていますが, .ts .tsx などに絞るなどは良い感じにご指定ください。

package.json
"scripts": {
  // ... ...
  "lint": "eslint --ext .jsx,.js,.tsx,.ts src/", // ESLint 用
  "fmt": "prettier --write src/**/*" // Prettier 用
}

これで, 以下を実行すれば OK です。

% npm run fmt

そして最初の方の以下の話に戻ると,

さて, 前までは eslint-plugin-prettier を用いて ESLint で Prettier を実行する感じが多かったようなのですが, Prettier 公式がそのやり方を非推奨としています。(理由などは公式を参照
つまるところ, ESLint で静的コード解析を実行して, Prettier でコード整形をするような単純な感じにするとよいとのことです。

ESLint と Prettier は以下な感じで, fmt して lint する感じで動かすようになります。(npm scripts に追加した方がよいかな)

% npm run fmt && npm run lint

言い残し

最初の方で空で作って放置している .prettierrc.json ですが, 公式の設定例 とか設定できる内容 とか見つつ良い感じに入れると良いと思います。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3