Прерывание импорта / порядка eslint при использовании псевдонимов машинописного текста

Я использую псевдонимы путей машинописного текста в большом проекте реакции. Так, например, в моем tsconfig.json я указываю несколько псевдонимов пути:

      {
  "baseUrl": "./src",
    "paths": {
      "@common/*": ["common/*"],
      "@settings/*": ["settings/*"],
      // other paths
    }
}

Хорошо, теперь, когда я хочу импортировать некоторые модули, я могу использовать эти псевдонимы. Мы также используем eslint, и одним из правил, которые мы используем, является. Он требует, чтобы все, что выходит из node_modules, должно быть импортировано перед любыми локальными модулями. Мне нравится это правило. Без использования моих псевдонимов:

      import React, { useEffect } from "react";
import SomeDistantComponent from '../../common/components/SomeDistantComponent'
import { Formik } from 'formik'

Это вызовет ошибку линтинга, но форматирование файла в соответствии с eslint автоматически переместит импорт formik выше импорта, чего я и хочу.

Однако, при использовании моих псевдонимов, это не выдаст ошибку:

      import React, { useEffect } from "react";
import SomeComponent from '@common/components/SomeComponent'
import { Formik } from 'formik'

Это как если бы псевдонимы пути машинописного текста обманули import/order правило, и теперь это правило нарушается.

Вопрос: Как мой линтер может по-прежнему распознавать пути этих псевдонимов? Могу ли я настроить groups или же pathGroups параметры этого плагина, чтобы правильно сгруппировать и упорядочить мои локальные модули с псевдонимом, которые должны следовать за моими модулями узла?

Бонусный вопрос:

Мне не обязательно различать модули с псевдонимом и модули без псевдонима с точки зрения порядка. Например

      import React, { useEffect } from "react";
import SomeCloseComponent from './SomeCloseComponent'
import SomeComponent from '@common/components/SomeComponent'
import AnotherCloseComponent from './AnotherCloseComponent'
import { Formik } from 'formik'

Я бы в порядке оставил заказ на импорт SomeCloseComponent, SomeComponent, а также AnotherCloseComponent, пока formikимпорт идет раньше всех. Можно ли поместить импорт с псевдонимом на тот же уровень «приоритета», что и импорт без псевдонима, то есть они не будут переупорядочены между собой, но все будут происходить после импорта node_module?

2 ответа

Вам необходимо использовать свойство, чтобы указать eslint что правильное положение путей, начинающихся с @/ находится до / после одной из других групп.

Я предпочитаю использовать ~ символ вместо того, чтобы создавать разницу между импортом из моей папки src и импортом из внешней библиотеки, которая начинается с @, как этот, например:

      import {makeStyles} from '@material-ui/core/styles';
import Bar from '~/components/Bar'

Итак, теперь мой файл выглядит так:

      import React from 'react'; // external
import Bar from '~/components/Bar'; // SPECIAL
import {ReactComponent as Logo} from '../logo.svg'; // parent
import './App.css'; // sibling

И это мое определение import/order править в моем .eslintrc файл:

          "import/order": [
      "error",
      {
        "pathGroups": [
          {
            "pattern": "~/**",
            "group": "external",
            "position": "after"
          }
        ],
        "groups": [
          "builtin",
          "external",
          "internal",
          "unknown",
          "parent",
          "sibling",
          "index",
          "object",
          "type"
        ]
      }
    ]
  }

Как видите, я использую pathGroups чтобы сообщить eslint, что правильная позиция любого импорта, начинающегося с ~/ является after в external группа.

Поскольку каждый импорт здесь принадлежит другой группе, любое изменение, которое я внесу в этот порядок, приведет к ошибке ESLint.

PS В какой-то момент у меня были проблемы с самим импортом, которые были решены после того, как я обновил eslint-plugin-import к версии 2.23.4

у меня такие псевдонимы~const/и~helpers/. Я смог заставить его работать, используя этот шаблон:

      {
    "pattern": "~*/**",
    "group": "external",
    "position": "after"
}

Это дикая карта для всего, что начинается с~, и любой каталог или файл внутри.

Другие вопросы по тегам