ESlint で import を自動ソートする

14886 ワード

import が増えてくると、その順序が気になってきます。

外部ライブラリからのインポートは上にあって欲しいし、reactからのインポートはさらに上に固定したくなりませんか?

ESlint のeslint-plugin-importというプラグインを使えば簡単にソートできます。

使うのはeslint-plugin-importimport/orderというルールです。

設定も色々あって、ある程度の自由度で順序を決めることもできます。このルールは fixable なのでeslint --fixコマンドで自動ソートが可能です。

公式の解説もあるのですが分かりにくい個所や誤っている個所もあるためこの記事を作成しました。

ソートした例

早速eslint-plugin-importimport/orderを使ってソートした例です。

上が下のようにきれいになります。

ソート後はreactからのインポートが最上部あって、次にその他の外部ライブラリ、エイリアスからのインポート(@src/**)、親ディレクトリからのインポートとなっています。
これらの順序やエイリアスも自分の環境や好みによって自由に設定可能です。

最後に typescript の型インポートが別に分かれているのは別プラグインとの組み合わせで実現しています。

詳細な設定方法は下で解説します。

ソート前

import { TextField, Box, BoxProps } from '@mui/material';
import { LoadingButton } from '@mui/lab';
import { useAddAppNotification } from '@src/common/hooks/useAppNotifications';
import { SubmitHandler, useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';
import { useEffect } from 'react';
import { useSignIn } from '../hooks/useSignIn';

ソート後

import { useEffect } from 'react';

import { LoadingButton } from '@mui/lab';
import { TextField, Box } from '@mui/material';
import { useForm } from 'react-hook-form';
import { useTranslation } from 'react-i18next';

import { useAddAppNotification } from '@src/common/hooks/useAppNotifications';

import { useSignIn } from '../hooks/useSignIn';

import type { BoxProps } from '@mui/material';
import type { SubmitHandler } from 'react-hook-form';

設定の方法

上記のソートは下記のような設定で実現しています。
ソートの順序は ESlint ルールのオプションで設定します。

.eslintrc.js
{
  rules:{
    'import/order': [
      'error',
      {
        groups: ['builtin', 'external', 'parent', 'sibling', 'index', 'object', 'type'],
        pathGroups: [
          {
            pattern: '{react,react-dom/**,react-router-dom}',
            group: 'builtin',
            position: 'before',
          },
          {
            pattern: '@src/**',
            group: 'parent',
            position: 'before',
          },
        ],
        pathGroupsExcludedImportTypes: ['builtin'],
        alphabetize: {
          order: 'asc',
        },
        'newlines-between': 'always',
      },
    ],
    '@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports' }],
    // その他のルール
  }
}

設定の解説

上記の設定例を使って各項目ごとの意味と設定方法を解説します。

より詳細が知りたい場合は以下の github の解説ページを見てください。