eslintとprettierの組み合わせ
最初に
eslintはJavaScriptにおけるスタンダードなリンターであり、コードを静的解析をし、問題のありそうな部分やスタイルガイドに準拠していない部分を検知するのに役立ちます。一方、prettierはJavaScriptのスタンダードなフォマッターであり、一定のスタイルを一貫して適用し、コードスタイルをめぐる不毛な議論を無くすることを目的にしています。
いい感じのコードにするという点では、どちらも共通していたり、eslint --fix
に構文をフォーマットする機能があったりで、ややこしいです。筆者の備忘のために、以下にまとめました。
前提
node: v16.14.0
TypeScriptを用いて、nodeの環境で動かすコード(AWS Lambdaにデプロイするイメージ)を前提としています。ReactなどUIフレームワークの対応とは別物なので悪しからずご承知おきください。
コード例
まずはサンプルプロジェクトの作成
$ yarn init -y # 全てデフォルトでプロジェクトを作成
$ yarn add --dev typescript
$ tsc --init # 全てデフォルトでtscを初期化
この時点での各設定ファイル
{
"name": "sample",
"version": "1.0.0",
- "main": "index.js", # ここは削除でOK
"license": "MIT",
"devDependencies": {
"typescript": "^4.6.2"
}
}
# 余計なコメントは削除してます
{
"compilerOptions": {
"target": "es2016",
"module": "commonjs",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true
}
}
prettierの設定
prettierrcの作成
$ yarn add --dev prettier
$ echo {}> .prettierrc.json
vscodeの設定
vscode拡張のインストール
Command + P
をしてext install prettier
また、保存時にフォーマッターが走るようにvscodeの設定をします。
プロジェクトルートで以下のコマンドを作ります。
$ mkdir -p .vscode && touch $_/settings.json
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
eslintの設定
eslintのファイルを対話モードで作成
$ yarn add --dev eslint
$ yarn create @eslint/config
以下のように質問に答えていきます
ESLintのチェック範囲を設定します。
今回はTo check syntax and find problems
を選択します。
? How would you like to use ESLint? …
To check syntax only
❯ To check syntax and find problems
To check syntax, find problems, and enforce code style
モジュールを選択します。ESModuleを使いたいのでJavaScript modules (import/export)
を選択します。
? What type of modules does your project use? …
❯ JavaScript modules (import/export)
CommonJS (require/exports)
None of these
特にUIフレームワークは使わないのでNone of these
を選択します。
? Which framework does your project use? …
React
Vue.js
❯ None of these
TypeScriptはYes
を使用します。
? Does your project use TypeScript? › No / Yes
ここだけ複数選択可でスペースでON/OFFするので注意
? Where does your code run? … (Press <space> to select, <a> to toggle all, <i> to invert selection)
Browser
✔ Node
設定ファイルの出力形式はなんでもOKですが、JSONにします。
? What format do you want your config file to be in? …
JavaScript
YAML
❯ JSON
npmでインストールするか聞かれますが、Noを選択して、
別途yarn add --dev
インストールします。
@typescript-eslint/eslint-plugin@latest @typescript-eslint/parser@latest eslint@latest
? Would you like to install them now with npm? › No / Yes
ここまでの各設定ファイルは以下
{
"env": {
"es2021": true,
"node": true
},
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": [
"@typescript-eslint"
],
"rules": {
}
}
{
"name": "sample2",
"version": "1.0.0",
"license": "MIT",
"devDependencies": {
+ "@typescript-eslint/eslint-plugin": "^5.13.0",
+ "@typescript-eslint/parser": "^5.13.0",
+ "eslint": "^8.10.0",
"prettier": "^2.5.1",
"typescript": "^4.6.2"
}
}
vscodeの設定
vscode拡張のインストール
Command + P
をしてext install eslint
eslint-config-prettierの設定
ここまででprettierとeslintの設定はある程度できました。ただし、prettierとeslintには目的の違いもあり、ルールの競合が起きる場合があります。Prettierの公式ドキュメントでも論じられています。
Prettierのドキュメントにもある通り、eslint-config-prettierを使用することが推奨されています。
これにより、prettierと競合するeslintのルールを無効化することができます。
$ yarn --dev add eslint-config-prettier
eslintrc.jsonのextendsでprettierを追加します。最後のルールが一番優先されるので、extends
フィールドの一番最後にいれること
{
"env": {
"es2021": true,
"node": true
},
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/recommended",
+ "prettier"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": [
"@typescript-eslint"
],
"rules": {
}
}
また、package.jsonに以下を追加して、npmスクリプトでフォーマットできるようにしておきます。
{
"name": "sample2",
"version": "1.0.0",
"license": "MIT",
+ "scripts": {
+ "lint-fix": "eslint --cache --fix src/ && prettier --write src/"
+ },
"devDependencies": {
"@typescript-eslint/eslint-plugin": "^5.13.0",
"@typescript-eslint/parser": "^5.13.0",
"eslint": "^8.10.0",
"prettier": "^2.5.1",
"typescript": "^4.6.2"
}
}
最後に
以上で最低限のprettierとeslintの設定が完了しました。その他のルールや設定はプロジェクトやチームの事情に応じて適宜追加していく必要があります。
Discussion