ここでは、とにかく混乱しがちな ESLint + Prettier の設定方法をまとめておきます。
まず、基本的な構成として、TypeScript (with React) の Lint をかけられるようにして、必要に応じて Airbnb スタイル を追加で設定する、という流れにしたいと思います。
TypeScript プロジェクトの準備
前提条件として、TypeScript (+ React) のプロジェクト自体は作成済みとします。
何も準備できていなければ、Next.js の create-next-app
コマンドを使うと簡単に作成できます(typescript
および @types/node
、@types/react
、@types/react-dom
などの型情報が導入された状態のプロジェクトが作成されます)。
Prettier + ESLint の基本設定 (for TypeScript with React)
これで、次のようにして Prettier + ESLint による Lint チェックと自動修正をかけられるようになります。
fix
を実行すると多数のファイルが自動修正されることになるので、lint
が実行できた段階で、一度 Git へ設定をコミットしておくことをオススメします。
ts/tsx ファイルを src ディレクトリにまとめる
Next.js 9.1 からは、pages
ディレクトリを src/pages
というパスで作成できるようになりました。
next
コマンドは、プロジェクトのルートに pages
が見つからないとき、src/pages
を参照してくれます。
この仕組みを利用すると、.ts
、.tsx
ファイルは全て src
ディレクトリ以下にまとめられるので、プロジェクトのルートディレクトリがスッキリします。
ただし、tsconfig.json
や public
ディレクトリは、これまで通りルートディレクトリに配置する必要があります。
あとは、各種コマンドの対象パスなどを変更すれば OK です。
ここまでの結果をテンプレートにする
ここで作成したプロジェクトを GitHub にプッシュしておけば、create-next-app
コマンドのテンプレートとして使用できるようになります。
次のように、--example
オプションで GitHub リポジトリの URL を指定するだけで OK です。
Airbnb スタイルを追加導入する
JavaScript のコーディングスタイルとしては、Airbnb のスタイルが有名です。
ここでは、前述の基本的な ESLint + Prettier 設定が終わっている想定で、追加で Airbnb スタイルを導入してみます。
Airbnb は ESLint 用の eslint-config-airbnb 共有設定を用意しているのですが、これをそのまま使うと TypeScript 用のカスタマイズが厄介なので、最初から TypeScript 用の対応が入った eslint-config-airbnb-typescript を使うことにします。
公式サイトを見ると、eslint-config-airbnb-typescript
の依存パッケージとして下記が必要ということが分かるので、まだインストールしていないものを追加でインストールします。
- eslint-plugin-import
- eslint-plugin-jsx-a11y
- eslint-plugin-react (インストール済み)
- eslint-plugin-react-hooks (インストール済み)
- @typescript-eslint/eslint-plugin (インストール済み)
実行方法はこれまで通りで変化なしです(npm run lint
と npm run fix
)。
ESLint と Prettier の設定で気を付けること
ESLint および Prettier の設定のポイントや、ハマりがちなことをまとめておきます。
TypeScript 型情報のチェックを ESLint で行う
@typescript-eslint/eslint-plugin
プラグインが提供する recommended-requiring-type-checking
という共有設定を有効にすると、TypeScript の型情報を利用した Lint チェックを行うことができます。
このとき、内部では TypeScript コンパイラが使用されるため、parserOptions.project
で tsconfig.json
ファイルの位置を知らせてやる必要があります(指定しないとエラーになります)。
TypeScript の型チェックを行うよう設定すると、追加で TypeScript コンパイラが動作するようになるため、ESLint の実行に時間がかかるようになります。
tsconfig.json
の情報をそのまま使うのではなく、ESLint 用に tsconfig.eslint.json
を作成してパフォーマンス向上させる方法が提案されています。
いずれにしても、型チェックの仕組みはあまり洗練されているとは言えないので、型チェックに関しては TypeScript コードの tsc
ビルド時にだけ行うと割り切ってもいいかもしれません(VS Code デフォルトの検出機能もあります)。
TypeScript / Prettier の設定は後ろへ
TypeScript 用の共有設定 plugin:@typescript-eslint/recommended
は、eslint:recommended
などにより定義されるルールのうち、TypeScript と競合するものを解決してくれます。
なので、TypeScript に関する設定は extends
の中で最後の方に指定して設定を上書きする必要があります。
具体的には、plugin:@typescript-eslint/eslint-recommended
がこの競合を解決するものであり、plugin:@typescript-eslint/recommended
から利用されています。
同様に、コードフォーマッターの Prettier を使用する場合は、Prettier が自動修正してくれる部分を ESLint が指摘しないように、一番最後に eslint-config-prettier 関連の共有設定を指定する必要があります。
Airbnb スタイルは React 込み
extends
プロパティで airbnb
(eslint-config-airbnb) を指定する場合、eslint:recommended
や plugin:react/recommeded
の設定は airbnb
側でほぼカバーされるので、指定する必要はありません。
逆に、React を使わない場合は、eslint-config-airbnb
ではなく eslint-config-airbnb-base の方を使います。
eslint-config-airbnb が依存するパッケージを調べる
.eslintrc.*
ファイルの extends
プロパティで airbnb
を指定するには、あらかじめ eslint-config-airbnb パッケージをインストールするだけでなく、その依存パッケージ (peerDependencies) もインストールしておく必要があります。
依存パッケージは次のように確認することができます。
関連記事