版本

no-restricted-imports

禁止通过 import 加载指定的模块

导入是 ES6/ES2015 标准,用于在当前模块中使用其他模块的功能。在 CommonJS 中,这通过 require() 调用实现,这使得 ESLint 规则与 CommonJS 规则 no-restricted-modules 大致相同。

为什么要限制导入?

  • 某些导入在特定环境中可能没有意义。例如,Node.js 的 fs 模块在没有文件系统的环境中没有意义。

  • 某些模块提供类似或相同的功能,例如 lodashunderscore。您的项目可能已标准化一个模块。您希望确保没有使用其他替代方案,因为这会不必要地增加项目的臃肿程度,并且当一个模块就足够时,维护两个依赖项会带来更高的成本。

规则详细信息

此规则允许您指定您不想在应用程序中使用的导入。

它仅适用于静态导入,不适用于动态导入。

选项

此规则既有字符串选项也有对象选项来指定要限制的导入模块。

使用字符串选项,您可以指定要限制导入的模块的名称,作为规则选项数组中的值。

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

字符串选项的错误代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", "fs"]*/

import fs from 'fs';

字符串选项还限制了模块的导出,例如以下示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", "fs"]*/

export { fs } from 'fs';
在游乐场中打开
/*eslint no-restricted-imports: ["error", "fs"]*/

export * from 'fs';

字符串选项的正确代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", "fs"]*/

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

您还可以使用 namemessage 属性在对象内为特定模块指定自定义消息,其中 name 的值为模块的名称,message 属性包含自定义消息。(自定义消息附加到规则的默认错误消息。)

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

字符串选项的错误代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", {
    "name": "disallowed-import",
    "message": "Please use 'allowed-import' instead"
}]*/

import foo from 'disallowed-import';

paths

这是一个对象选项,其值为一个数组,包含您要限制的模块的名称。

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

paths错误代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { "paths": ["cluster"] }]*/

import cluster from 'cluster';

还可以使用带有 namemessage 的对象在 paths 数组中为特定模块指定自定义消息。

"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 属性中指定的模块,因此在使用 importNamesmessage 选项时,需要先指定 name 属性。

importNames 数组中指定 "default" 字符串将限制导入默认导出。

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

paths 中的 importNames 具有 "default"错误代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { paths: [{
    name: "foo",
    importNames: ["default"],
    message: "Please use the default import from '/bar/baz/' instead."
}]}]*/

import DisallowedObject from "foo";

paths 中的 importNames错误代码示例

在游乐场中打开
/*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";
在游乐场中打开
/*eslint no-restricted-imports: ["error", { paths: [{
    name: "foo",
    importNames: ["DisallowedObject"],
    message: "Please import 'DisallowedObject' from '/bar/baz/' instead."
}]}]*/

import * as Foo from "foo";

paths 中的 importNames正确代码示例

如果分配给默认导出的本地名称与 importNames 中的字符串相同,则不会导致错误。

在游乐场中打开
/*eslint no-restricted-imports: ["error", { paths: [{ name: "foo", importNames: ["DisallowedObject"] }] }]*/

import DisallowedObject from "foo"
在游乐场中打开
/*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

此选项是一个数组。allowImportNamesimportNames 相反,允许此数组中指定的导入。因此,它会限制模块的所有导入,除了指定的允许的导入。

注意:allowImportNames 不能与 importNames 结合使用。

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

paths 中的 allowImportNames错误代码示例

禁止除 ‘AllowedObject’ 之外的所有导入名称。

在游乐场中打开
/*eslint no-restricted-imports: ["error", { paths: [{
    name: "foo",
    allowImportNames: ["AllowedObject"],
    message: "Please use only 'AllowedObject' from 'foo'."
}]}]*/

import { DisallowedObject } from "foo";

paths 中的 allowImportNames正确代码示例

禁止除 ‘AllowedObject’ 之外的所有导入名称。

在游乐场中打开
/*eslint no-restricted-imports: ["error", { paths: [{
    name: "foo",
    allowImportNames: ["AllowedObject"],
    message: "Only use 'AllowedObject' from 'foo'."
}]}]*/

import { AllowedObject } from "foo";

patterns

这是一个对象选项,其值为一个数组。此选项允许您使用 gitignore 风格的模式或正则表达式指定要限制的多个模块。

paths 选项采用确切的导入路径,而 patterns 选项可用于更灵活地指定导入路径,允许限制同一目录中的多个模块。例如

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

此配置会限制导入 import-foo 模块,但不会限制导入 import-foo/barimport-foo/baz。您可以使用 patterns 来限制两者。

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

此配置不仅会限制使用 pathimport-foo 中导入,还会使用 patterns 限制从 import-foo/barimport-foo/baz 中导入。

要使用 gitignore 风格的模式重新包含模块,请在模式前添加否定 (!) 标记。(确保这些否定的模式放在数组的最后,因为顺序很重要)

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

您还可以使用正则表达式来限制模块(请参阅 regex 选项)。

patterns 选项的错误代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { "patterns": ["lodash/*"] }]*/

import pick from 'lodash/pick';
在游乐场中打开
/*eslint no-restricted-imports: ["error", { "patterns": ["lodash/*", "!lodash/pick"] }]*/

import pick from 'lodash/map';
在游乐场中打开
/*eslint no-restricted-imports: ["error", { "patterns": ["import1/*", "!import1/private/*"] }]*/

import pick from 'import1/private/someModule';

在此示例中,"!import1/private/*" 不会重新包含 private 内部的模块,因为否定标记 (!) 不会在父目录被模式排除时重新包含文件。在本例中,import1/private 目录已被 import1/* 模式排除。(可以使用 "!import1/private" 重新包含排除的目录。)

patterns 选项的正确代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { "patterns": ["crypto/*"] }]*/

import crypto from 'crypto';
在游乐场中打开
/*eslint no-restricted-imports: ["error", { "patterns": ["lodash/*", "!lodash/pick"] }]*/

import pick from 'lodash/pick';
在游乐场中打开
/*eslint no-restricted-imports: ["error", { "patterns": ["import1/*", "!import1/private"] }]*/

import pick from 'import1/private/someModule';

group

patterns 数组还可以包含对象。group 属性用于指定限制模块的 gitignore 风格的模式,message 属性用于指定自定义消息。

使用 patterns 选项时,需要使用 groupregex 属性中的任意一个。

"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 选项的错误代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["lodash/*"],
    message: "Please use the default import from 'lodash' instead."
}]}]*/

import pick from 'lodash/pick';

group 选项的正确代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["lodash/*"],
    message: "Please use the default import from 'lodash' instead."
}]}]*/

import lodash from 'lodash';

regex

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 选项的错误代码示例

在游乐场中打开
/*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 选项的正确代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    regex: "@app/(?!(api/enums$)).*",
}]}]*/

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

caseSensitive

这是一个布尔选项,当为 true 时,会将 groupregex 属性中指定的模式设置为区分大小写。默认值为 false

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

caseSensitive: true 选项的错误代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["foo[A-Z]*"],
    caseSensitive: true
}]}]*/

import pick from 'fooBar';

caseSensitive: true 选项的正确代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["foo[A-Z]*"],
    caseSensitive: true
}]}]*/

import pick from 'food';

importNames

您还可以指定 patterns 数组中对象内的 importNames。在这种情况下,指定的名称仅适用于关联的 groupregex 属性。

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

patterns 中的 importNames错误代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    importNames: ['isEmpty'],
    message: "Use 'isEmpty' from lodash instead."
}]}]*/

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

patterns 中的 importNames正确代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    importNames: ['isEmpty'],
    message: "Use 'isEmpty' from lodash instead."
}]}]*/

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

allowImportNames

您还可以指定 patterns 数组中对象内的 allowImportNames。在这种情况下,指定的名称仅适用于关联的 groupregex 属性。

注意:allowImportNames 不能与 importNamesimportNamePatternallowImportNamePattern 结合使用。

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

patterns 中的 allowImportNames错误代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    allowImportNames: ['isEmpty'],
    message: "Please use only 'isEmpty' from utils."
}]}]*/

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

patterns 中的 allowImportNames正确代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    allowImportNames: ['isEmpty'],
    message: "Please use only 'isEmpty' from utils."
}]}]*/

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

importNamePattern

此选项允许您使用正则表达式模式来限制导入名称

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

importNamePattern 选项的错误代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    importNamePattern: '^is',
    message: "Use 'is*' functions from lodash instead."
}]}]*/

import { isEmpty } from 'utils/collection-utils';
在游乐场中打开
/*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';
在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["foo/*"],
    importNames: ["bar"],
    importNamePattern: '^baz',
}]}]*/

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

importNamePattern 选项的正确代码示例

在游乐场中打开
/*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 选项的错误代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    importNamePattern: "^"
}]}]*/

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

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

importNamePattern 选项的正确代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    importNamePattern: "^"
}]}]*/

import 'utils/init-utils';

allowImportNamePattern

这是一个字符串选项。allowImportNamePatternimportNamePattern 相反,此选项允许匹配指定正则表达式模式的导入。因此,它会限制模块的所有导入,除了指定的允许的模式。

注意:allowImportNamePattern 不能与 importNamesimportNamePatternallowImportNames 结合使用。

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

allowImportNamePattern 选项的错误代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    allowImportNamePattern: '^has'
}]}]*/

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

allowImportNamePattern 选项的正确代码示例

在游乐场中打开
/*eslint no-restricted-imports: ["error", { patterns: [{
    group: ["utils/*"],
    allowImportNamePattern: '^is'
}]}]*/

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

何时不使用它

如果您想在项目中导入模块而不会产生 ESLint 错误或警告,请不要使用此规则或不要将模块包含在此规则的列表中。

版本

此规则是在 ESLint v2.0.0-alpha-1 中引入的。

资源

更改语言