静的解析ツール。標準でバンドルされてるものも含めて、全てのルールが本体から切り離されたプラグインとして平等に扱われ、個別に適用の可否やエラーレベルの調整が可能。
Create React App で生成したものには、デフォルトでインストールされている。プロジェクト作成後、別途最新のバージョンをインストールすることも可能だが、サポートしていない可能性もあるので、注意。
本体を除くと3種類に分類される。
コードを特定の言語使用に沿って解析してくれるライブラリ。 ESLintの場合、標準でJSのパーサが組み込まれてるが、TypeScriptには対応していないので、別途導入する必要がある。
https://github.com/typescript-eslint/typescript-eslint
ESLintの組み込みルール以外に独自ルールを追加するもの。推奨の共有設定に内包された形で提供されるケースが多い。
*プラグインのルールはインストールして読み込んだだけでは、ルールは適用されない点、要注意。ルールを適用するには、後述する eslintrc.js
の extendsにプラグイン推奨の共有設定を追記する必要がある。
複数のルールの適用をまとめて設定するもの。ESLintに同梱される eslintrecommended や、Airbnbが提供してる eslint-config-airbnb が有名。
プログラムの実行環境をESLintに伝える。
共有設定を適用する。これは、ESLintに標準で含まれているもの、別途インストールしたものやインストール済のプラグインのパッケージに含まれてるものを指定する。ルール設定が重複してる場合は、後ろに記述されたものが優先される。
パーサを指定。
パーサの各種実行オプションを設定。
インストール済のプラグインを組み込む。
適用する個別ルールと、エラーレベル、例外等の設定値を記述。
良く見かけるパッケージ(これらを入れとけば、React開発は事足りるかも)
yarn add -D @typescript-eslint/parser @typescript-eslint/eslint-plugin \ eslint-plugin-react eslint-plugin-react-hooks eslint-plugin-import \ eslint-plugin-jsx-a11y eslint-config-airbnb
eslintrc.jsのカスタマイズルール事例 参照:ESLintの適用ルールカスタマイズ事例
module.exports = {
env: {
browser: true,
es2020: true,
},
extends: [
'plugin:react/recommended',
'airbnb',
'airbnb/hooks',
'plugin:import/errors',
'plugin:import/warnings',
'plugin:import/typescript',
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:@typescript-eslint/recommended-requiring-type-checking',
],
parser: '@typescript-eslint/parser',
parserOptions: {
ecmaFeatures: {
jsx: true,
},
ecmaVersion: 2020,
project: './tsconfig.eslint.json',
sourceType: 'module',
tsconfigRootDir: __dirname,
},
plugins: [
'@typescript-eslint',
'import',
'jsx-a11y',
'react',
'react-hooks',
],
root: true,
rules: {
'lines-between-class-members': [
'error',
'always',
{
exceptAfterSingleLine: true,
},
],
// should be rewritten as `['error', { allowAsStatement: true }]` in ESLint 7 or later
// SEE: https://github.com/typescript-eslint/typescript-eslint/issues/1184
'no-void': 'off',
'padding-line-between-statements': [
'error',
{
blankLine: 'always',
prev: '*',
next: 'return',
},
],
'@typescript-eslint/no-unused-vars': [
'error',
{
'vars': 'all',
'args': 'after-used',
'argsIgnorePattern': '_',
'ignoreRestSiblings': false,
'varsIgnorePattern': '_',
},
],
'import/extensions': [
'error',
'ignorePackages',
{
js: 'never',
jsx: 'never',
ts: 'never',
tsx: 'never',
},
],
'react/jsx-filename-extension': [
'error',
{
extensions: ['.jsx', '.tsx'],
},
],
'react/jsx-props-no-spreading': [
'error',
{
html: 'enforce',
custom: 'enforce',
explicitSpread: 'ignore',
},
],
},
overrides: [
{
'files': ['*.tsx'],
'rules': {
'react/prop-types': 'off',
},
},
],
settings: {
'import/resolver': {
node: {
paths: ['src'],
},
},
},
};
.eslintignore
ファイルを作成して、ESLintの対象外となるファイル定義を忘れずに行いましょう。(これが無いと、不要な場面でlintチェックが入ってエラーが出たり、処理が重くなります)
build/
public/
**/coverage/
**/node_modules/
**/*.min.js
*.config.js
VSCodeでコーディング中に、ESLintが走るようにするには、ESLintの拡張機能を追加して、以下設定を行います。
Code > Preference > Settingから、「Open Settings(JSON)」を押下して、setting.jsonを編集する。
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"editor.formatOnSave": false,
"eslint.enable": true,
"eslint.packageManager": "yarn",