🔖

create-react-appを使わないReactにFlat configなESLint入れる

2023/03/14に公開

はじめに

前回create-react-appを使わないReactのTypeScript化を行った。

https://zenn.dev/kekezun/articles/bf59a0e02b8aa4

このままだと開発しにくいので、ESLintとPrettierを入れてく。
なおESLintは現在(2023年3月9日)試験的機能として提供されているFlat configを用いて設定を行う。

成果物はこちら。
https://github.com/kkznch/template-react-for-inspection/tree/03-adding-eslint

環境

  • eslint: v8.35.0
  • prettier: v2.8.4

※ 今回追加する主となるパッケージのバージョンのみ記載

手順

ESLintのインストール

下記のコマンドでESLintと関連パッケージをインストールする。
pluginやconfigは良いのがあれば追記していく。

$ yarn add --dev eslint eslint-plugin-import eslint-plugin-unused-imports eslint-plugin-react eslint-plugin-react-hooks @typescript-eslint/eslint-plugin @typescript-eslint/parser prettier eslint-config-prettier

ESLint設定ファイルを作成する

eslint.config.js
import pluginTypeScript from '@typescript-eslint/eslint-plugin';
import typescriptParser from '@typescript-eslint/parser';
import pluginPrettier from 'eslint-config-prettier';
import pluginImport from 'eslint-plugin-import';
import pluginReact from 'eslint-plugin-react';
import reactConfigRecommended from 'eslint-plugin-react/configs/recommended.js';
import pluginUnusedImport from 'eslint-plugin-unused-imports';
import pluginReactHooks from 'eslint-plugin-react-hooks';

export default [
  {
    ignores: ['./dist'],
  },
  {
    files: ['**/*.ts', '**/*.tsx'],
    languageOptions: {
      parser: typescriptParser,
    },
    plugins: {
      '@typescript-eslint': pluginTypeScript,
    },
    rules: {
      ...pluginTypeScript.configs['eslint-recommended'].rules,
      ...pluginTypeScript.configs['recommended'].rules,
    },
  },
  {
    files: ['**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx'],
    settings: {
      react: {
        version: 'detect',
      },
      'import/resolver': {
        node: {
          extensions: ['.js', '.jsx', '.ts', '.tsx'],
        },
        typescript: {},
      },
    },
    plugins: {
      react: pluginReact,
      'react-hooks': pluginReactHooks,
      import: pluginImport,
      'unused-imports': pluginUnusedImport,
    },
    rules: {
      ...pluginImport.configs['recommended'].rules,
      ...reactConfigRecommended.rules,
      ...pluginPrettier.rules,
      'react-hooks/rules-of-hooks': 'error',
      'react-hooks/exhaustive-deps': 'warn',
      'no-unused-vars': 'off',
      'unused-imports/no-unused-imports': 'error',
      'import/order': [
        'error',
        {
          groups: ['builtin', 'external', 'parent', 'sibling', 'index', 'object', 'type'],
          pathGroups: [
            {
              pattern: '{react,react-dom/**,react-router-dom}',
              group: 'builtin',
              position: 'before',
            },
          ],
          pathGroupsExcludedImportTypes: ['builtin'],
          alphabetize: {
            order: 'asc',
          },
          'newlines-between': 'never',
        },
      ],
    },
  },
];

Prettier設定ファイルを作成する

.prettierrc.json
{
  "printWidth": 100,
  "tabWidth": 2,
  "useTabs": false,
  "semi": true,
  "singleQuote": true,
  "quoteProps": "as-needed",
  "jsxSingleQuote": false,
  "trailingComma": "all",
  "bracketSpacing": true,
  "bracketSameLine": false,
  "arrowParens": "always",
  "htmlWhitespaceSensitivity": "css",
  "endOfLine": "lf",
  "embeddedLanguageFormatting": "auto",
  "singleAttributePerLine": false
}
.prettierignore
node_modules/
dist/

package.jsonを修正する

package.json
{
  ...略
+  "type": "module",
  "scripts": {
    "start": "webpack-dev-server .",
-    "build": "webpack ."
+    "build": "webpack .",
+    "lint": "ESLINT_USE_FLAT_CONFIG=true eslint .",
+    "lint:fix": "ESLINT_USE_FLAT_CONFIG=true eslint --fix .",
+    "format": "prettier --write \"src/**/*.{ts,tsx}\""
  },
  ...略  
}

実行

CLIで下記のコマンドを実行すると構文がチェックされる。

$ yarn lint

修正までしたい場合は下記のコマンドを実行する。

$ yarn lint:fix && yarn format

おわりに

Flat config以前で使っていたextendsオプションが使えればもっとコンパクトに記述できそうだけど、練習も兼ねてなるべく明示的に書いてみた。
書いてみたが、そもそも適切に書けているのか分からないので、ミスなどあれば指摘してくれると嬉しい。

参考

https://eslint.org/docs/latest/use/getting-started#manual-set-up
https://eslint.org/docs/latest/use/configure/configuration-files-new
https://zenn.dev/makotot/articles/0d9184f3dde858
https://www.sunapro.com/eslint-flat-config/
https://zenn.dev/rescuenow/articles/c07dd571dfe10f#htmlwhitespacesensitivity-html-空白の感度

Discussion