Spec-Zone.ru › ESLint

no-restricted-imports

Запретить указанные модули при загрузке import

Импорты — это стандарт ES6/ES2015 для использования функциональности других модулей в текущем модуле. В CommonJS это реализуется через вызов require(), что делает эту правило ESLint примерно эквивалентным своему аналогу для CommonJS no-restricted-modules.

Зачем нужно ограничивать импорты?

  • Некоторые импорты могут быть нелогичны в определенной среде. Например, модуль fs Node.js не имеет смысла в среде без файловой системы.

  • Некоторые модули предоставляют похожую или идентичную функциональность, например, lodash и underscore. Ваш проект может использовать стандартный модуль. Вы хотите убедиться, что другие альтернативы не используются, так как это ненужно раздувает проект и увеличивает затраты на обслуживание двух зависимостей, когда одной достаточно.

Подробное описание правила

Это правило позволяет указать импорты, которые вы не хотите использовать в своем приложении.

Применяется только к статическим импортам, а не к динамическим.

Параметры

Это правило имеет строковые и объектные параметры для указания модулей, импорт которых следует ограничить.

Используя строковый параметр, вы можете указать имя модуля, который не должен импортироваться в качестве значения в массиве параметров правила:

"no-restricted-imports": ["error", "import1", "import2"]

Примеры неправильного кода для строкового параметра:

Открыть в Playground
/*eslint no-restricted-imports: ["error", "fs"]*/

import fs from 'fs';

Строковые параметры также запрещают экспорт модуля, как в этом примере:

Открыть в Playground
/*eslint no-restricted-imports: ["error", "fs"]*/

export { fs } from 'fs';
Открыть в Playground
/*eslint no-restricted-imports: ["error", "fs"]*/

export * from 'fs';

Примеры правильного кода для строкового параметра:

Открыть в Playground
/*eslint no-restricted-imports: ["error", "fs"]*/

import crypto from 'crypto';
export { foo } from "bar";

Вы также можете указать пользовательское сообщение для определенного модуля, используя свойства name и message внутри объекта, где значение name — это имя модуля, а свойство message содержит пользовательское сообщение. (Пользовательское сообщение добавляется к стандартному сообщению об ошибке правила.)

"no-restricted-imports": ["error", {
    "name": "import-foo",
    "message": "Please use import-bar instead."
}, {
    "name": "import-baz",
    "message": "Please use import-quux instead."
}]

Примеры неправильного кода для строкового параметра:

Открыть в Playground
/*eslint no-restricted-imports: ["error", {
    "name": "disallowed-import",
    "message": "Please use 'allowed-import' instead"
}]*/

import foo from 'disallowed-import';

пути

Это объектный параметр, значение которого — массив, содержащий имена модулей, которые нужно ограничить.

"no-restricted-imports": ["error", { "paths": ["import1", "import2"] }]

Примеры неправильного кода для paths:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { "paths": ["cluster"] }]*/

import cluster from 'cluster';

Пользовательские сообщения для определенного модуля также могут быть указаны в массиве paths с использованием объектов со свойствами name и message.

"no-restricted-imports": ["error", {
    "paths": [{
        "name": "import-foo",
        "message": "Please use import-bar instead."
    }, {
        "name": "import-baz",
        "message": "Please use import-quux instead."
    }]
}]

importNames

Этот параметр в paths представляет собой массив и может использоваться для указания имен определенных связей, экспортируемых из модуля. Имена импортов, указанные в массиве paths, влияют на модуль, указанный в свойстве name соответствующего объекта, поэтому необходимо сначала указать свойство name, если вы используете параметр importNames или message.

Указание строки "default" внутри массива importNames запретит импорт значения по умолчанию.

"no-restricted-imports": ["error", {
  "paths": [{
    "name": "import-foo",
    "importNames": ["Bar"],
    "message": "Please use Bar from /import-bar/baz/ instead."
  }]
}]

Примеры неправильного кода, когда importNames в paths имеет "default":

Открыть в Playground
/*eslint no-restricted-imports: ["error", { paths: [{
    name: "foo",
    importNames: ["default"],
    message: "Please use the default import from '/bar/baz/' instead."
}]}]*/

import DisallowedObject from "foo";

Примеры неправильного кода для importNames в paths:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { paths: [{
    name: "foo",
    importNames: ["DisallowedObject"],
    message: "Please import 'DisallowedObject' from '/bar/baz/' instead."
}]}]*/

import { DisallowedObject } from "foo";

import { DisallowedObject as AllowedObject } from "foo";

import { "DisallowedObject" as SomeObject } from "foo";
Открыть в Playground
/*eslint no-restricted-imports: ["error", { paths: [{
    name: "foo",
    importNames: ["DisallowedObject"],
    message: "Please import 'DisallowedObject' from '/bar/baz/' instead."
}]}]*/

import * as Foo from "foo";

Примеры правильного кода для importNames в paths:

Если локальное имя, назначенное экспорту по умолчанию, совпадает со строкой в importNames, это не приведет к ошибке.

Открыть в Playground
/*eslint no-restricted-imports: ["error", { paths: [{ name: "foo", importNames: ["DisallowedObject"] }] }]*/

import DisallowedObject from "foo"
Открыть в Playground
/*eslint no-restricted-imports: ["error", { paths: [{
    name: "foo",
    importNames: ["DisallowedObject"],
    message: "Please import 'DisallowedObject' from '/bar/baz/' instead."
}]}]*/

import { AllowedObject as DisallowedObject } from "foo";

allowImportNames

Этот параметр — массив. Обратное к importNames, allowImportNames разрешает импорты, указанные в этом массиве. Таким образом, он ограничивает все импорты из модуля, за исключением разрешенных.

Примечание: allowImportNames нельзя использовать совместно с importNames.

"no-restricted-imports": ["error", {
  "paths": [{
    "name": "import-foo",
    "allowImportNames": ["Bar"],
    "message": "Please use only Bar from import-foo."
  }]
}]

Примеры неправильного кода для allowImportNames в paths:

Запрет всех имён импортов, кроме ‘AllowedObject’.

Открыть в Playground
/*eslint no-restricted-imports: ["error", { paths: [{
    name: "foo",
    allowImportNames: ["AllowedObject"],
    message: "Please use only 'AllowedObject' from 'foo'."
}]}]*/

import { DisallowedObject } from "foo";

Примеры правильного кода для allowImportNames в paths:

Запрет всех имён импортов, кроме ‘AllowedObject’.

Открыть в Playground
/*eslint no-restricted-imports: ["error", { paths: [{
    name: "foo",
    allowImportNames: ["AllowedObject"],
    message: "Only use 'AllowedObject' from 'foo'."
}]}]*/

import { AllowedObject } from "foo";

шаблоны

Это также объектный параметр, значение которого — массив. Этот параметр позволяет указать несколько модулей для ограничения с помощью шаблонов или регулярных выражений в стиле gitignore.

Если параметр paths принимает точные пути импорта, параметр patterns может использоваться для указания путей импорта с большей гибкостью, что позволяет ограничить несколько модулей в одном каталоге. Например:

"no-restricted-imports": ["error", {
  "paths": [{
    "name": "import-foo",
  }]
}]

Эта конфигурация ограничивает импорт модуля import-foo, но не ограничивает импорт модулей import-foo/bar или import-foo/baz . Вы можете использовать patterns для ограничения обоих:

"no-restricted-imports": ["error", {
    "paths": [{
      "name": "import-foo",
    }],
    "patterns": [{
      "group": ["import-foo/ba*"],
    }]
}]

Эта конфигурация ограничивает импорты не только из import-foo с использованием path, но также import-foo/bar и import-foo/baz с использованием patterns.

Чтобы снова включить модуль при использовании шаблонов gitignore- стиля, добавьте маркер отрицания (!) перед шаблоном. (Убедитесь, что эти отменённые шаблоны размещены в конце массива, так как порядок важен)

"no-restricted-imports": ["error", {
    "patterns": ["import1/private/*", "import2/*", "!import2/good"]
}]

Вы также можете использовать регулярные выражения для ограничения модулей (см. regex опцию).

Примеры некорректного кода для patterns опции:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { "patterns": ["lodash/*"] }]*/

import pick from 'lodash/pick';
Открыть в Playground
/*eslint no-restricted-imports: ["error", { "patterns": ["lodash/*", "!lodash/pick"] }]*/

import pick from 'lodash/map';
Открыть в Playground
/*eslint no-restricted-imports: ["error", { "patterns": ["import1/*", "!import1/private/*"] }]*/

import pick from 'import1/private/someModule';

В этом примере, "!import1/private/*" не включает повторно модули внутри private, потому что маркер отрицания (!) не включает файлы, если родительская директория исключена шаблоном. В данном случае, директория import1/private уже исключена шаблоном import1/*. (Исключенная директория может быть повторно включена с использованием "!import1/private".)

Примеры корректного кода для patterns опции:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { "patterns": ["crypto/*"] }]*/

import crypto from 'crypto';
Открыть в Playground
/*eslint no-restricted-imports: ["error", { "patterns": ["lodash/*", "!lodash/pick"] }]*/

import pick from 'lodash/pick';
Открыть в Playground
/*eslint no-restricted-imports: ["error", { "patterns": ["import1/*", "!import1/private"] }]*/

import pick from 'import1/private/someModule';

группа

Массив patterns также может содержать объекты. Свойство group используется для указания шаблонов gitignore-стиля для ограничения модулей, а свойство message используется для указания настраиваемого сообщения.

Требуется либо свойство group, либо regex, при использовании patterns опции.

"no-restricted-imports": ["error", {
    "patterns": [{
      "group": ["import1/private/*"],
      "message": "usage of import1 private modules not allowed."
    }, {
      "group": ["import2/*", "!import2/good"],
      "message": "import2 is deprecated, except the modules in import2/good."
    }]
}]

Примеры некорректного кода для group опции:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["lodash/*"],
    message: "Please use the default import from 'lodash' instead."
}]}]*/

import pick from 'lodash/pick';

Примеры корректного кода для этой group опции:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["lodash/*"],
    message: "Please use the default import from 'lodash' instead."
}]}]*/

import lodash from 'lodash';

регулярные выражения

Свойство regex используется для указания шаблонов регулярных выражений для ограничения модулей.

Примечание: regex нельзя использовать совместно с group.

"no-restricted-imports": ["error", {
    "patterns": [{
      "regex": "import1/private/",
      "message": "usage of import1 private modules not allowed."
    }, {
      "regex": "import2/(?!good)",
      "message": "import2 is deprecated, except the modules in import2/good."
    }]
}]

Примеры некорректного кода для regex опции:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    regex: "@app/(?!(api/enums$)).*",
}]}]*/

import Foo from '@app/api';
import Bar from '@app/api/bar';
import Baz from '@app/api/baz';
import Bux from '@app/api/enums/foo';

Примеры корректного кода для regex опции:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    regex: "@app/(?!(api/enums$)).*",
}]}]*/

import Foo from '@app/api/enums';

чувствительность к регистру

Это логическая опция, которая устанавливает чувствительность к регистру шаблонов, указанных в свойствах group или regex, при true. По умолчанию false.

"no-restricted-imports": ["error", {
    "patterns": [{
      "group": ["import1/private/prefix[A-Z]*"],
      "caseSensitive": true
    }]
}]

Примеры некорректного кода для caseSensitive: true опции:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["foo[A-Z]*"],
    caseSensitive: true
}]}]*/

import pick from 'fooBar';

Примеры корректного кода для caseSensitive: true опции:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["foo[A-Z]*"],
    caseSensitive: true
}]}]*/

import pick from 'food';

importNames

Вы также можете указать importNames внутри объектов внутри массива patterns. В этом случае, указанные имена применяются только к сопутствующему свойству group или regex.

"no-restricted-imports": ["error", {
    "patterns": [{
      "group": ["utils/*"],
      "importNames": ["isEmpty"],
      "message": "Use 'isEmpty' from lodash instead."
    }]
}]

Примеры некорректного кода для importNames в patterns:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    importNames: ['isEmpty'],
    message: "Use 'isEmpty' from lodash instead."
}]}]*/

import { isEmpty } from 'utils/collection-utils';

Примеры корректного кода для importNames в patterns:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    importNames: ['isEmpty'],
    message: "Use 'isEmpty' from lodash instead."
}]}]*/

import { hasValues } from 'utils/collection-utils';

разрешенные имена импорта

Вы также можете указать allowImportNames внутри объектов внутри массива patterns. В этом случае, указанные имена применяются только к сопутствующему свойству group или regex.

Примечание: allowImportNames нельзя использовать совместно с importNames, importNamePattern или allowImportNamePattern.

"no-restricted-imports": ["error", {
    "patterns": [{
      "group": ["utils/*"],
      "allowImportNames": ["isEmpty"],
      "message": "Please use only 'isEmpty' from utils."
    }]
}]

Примеры некорректного кода для allowImportNames в patterns:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    allowImportNames: ['isEmpty'],
    message: "Please use only 'isEmpty' from utils."
}]}]*/

import { hasValues } from 'utils/collection-utils';

Примеры корректного кода для allowImportNames в patterns:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    allowImportNames: ['isEmpty'],
    message: "Please use only 'isEmpty' from utils."
}]}]*/

import { isEmpty } from 'utils/collection-utils';

Шаблон имён импорта

Этот параметр позволяет использовать регулярные выражения для ограничения имён импортов:

"no-restricted-imports": ["error", {
    "patterns": [{
      "group": ["import-foo/*"],
      "importNamePattern": "^foo",
    }]
}]

Примеры неправильного кода для параметра importNamePattern:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    importNamePattern: '^is',
    message: "Use 'is*' functions from lodash instead."
}]}]*/

import { isEmpty } from 'utils/collection-utils';
Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["foo/*"],
    importNamePattern: '^(is|has)',
    message: "Use 'is*' and 'has*' functions from baz/bar instead"
}]}]*/

import { isSomething, hasSomething } from 'foo/bar';
Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["foo/*"],
    importNames: ["bar"],
    importNamePattern: '^baz',
}]}]*/

import { bar, bazQux } from 'foo/quux';

Примеры правильного кода для параметра importNamePattern:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    importNamePattern: '^is',
    message: "Use 'is*' functions from lodash instead."
}]}]*/

import isEmpty, { hasValue } from 'utils/collection-utils';

Вы также можете использовать этот параметр, чтобы разрешить только импорты с побочными эффектами, задав шаблон, который соответствует любому имени, например, ^.

Примеры неправильного кода для параметра importNamePattern:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    importNamePattern: "^"
}]}]*/

import isEmpty, { hasValue } from 'utils/collection-utils';

import * as file from 'utils/file-utils';

Примеры правильного кода для параметра importNamePattern:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    importNamePattern: "^"
}]}]*/

import 'utils/init-utils';

Разрешенный шаблон имени импорта

Это строковый параметр. Обратное значение importNamePattern, этот параметр разрешает импорты, которые соответствуют указанному шаблону регулярного выражения. Таким образом, он ограничивает все импорты из модуля, за исключением указанных разрешенных шаблонов.

Примечание: allowImportNamePattern нельзя использовать в сочетании с importNames, importNamePattern или allowImportNames.

"no-restricted-imports": ["error", {
    "patterns": [{
      "group": ["import-foo/*"],
      "allowImportNamePattern": "^foo",
    }]
}]

Примеры неправильного кода для параметра allowImportNamePattern:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    allowImportNamePattern: '^has'
}]}]*/

import { isEmpty } from 'utils/collection-utils';

Примеры правильного кода для параметра allowImportNamePattern:

Открыть в Playground
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    allowImportNamePattern: '^is'
}]}]*/

import { isEmpty } from 'utils/collection-utils';

Когда не следует использовать

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

Версия

Эта проверка была добавлена в ESLint v2.0.0-alpha-1.

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/no-restricted-imports

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API