no-restricted-imports
禁止通过 import
加载指定的模块
导入是 ES6/ES2015 标准,用于在当前模块中使用其他模块的功能。在 CommonJS 中,这通过 require()
调用实现,这使得 ESLint 规则与 CommonJS 规则 no-restricted-modules
大致相同。
为什么要限制导入?
-
某些导入在特定环境中可能没有意义。例如,Node.js 的
fs
模块在没有文件系统的环境中没有意义。 -
某些模块提供类似或相同的功能,例如
lodash
和underscore
。您的项目可能已标准化一个模块。您希望确保没有使用其他替代方案,因为这会不必要地增加项目的臃肿程度,并且当一个模块就足够时,维护两个依赖项会带来更高的成本。
规则详细信息
此规则允许您指定您不想在应用程序中使用的导入。
它仅适用于静态导入,不适用于动态导入。
选项
此规则既有字符串选项也有对象选项来指定要限制的导入模块。
使用字符串选项,您可以指定要限制导入的模块的名称,作为规则选项数组中的值。
"no-restricted-imports": ["error", "import1", "import2"]
字符串选项的错误代码示例
/*eslint no-restricted-imports: ["error", "fs"]*/
字符串选项还限制了模块的导出,例如以下示例
/*eslint no-restricted-imports: ["error", "fs"]*/
/*eslint no-restricted-imports: ["error", "fs"]*/
字符串选项的正确代码示例
/*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."
}]
字符串选项的错误代码示例
/*eslint no-restricted-imports: ["error", {
"name": "disallowed-import",
"message": "Please use 'allowed-import' instead"
}]*/
paths
这是一个对象选项,其值为一个数组,包含您要限制的模块的名称。
"no-restricted-imports": ["error", { "paths": ["import1", "import2"] }]
paths
的错误代码示例
/*eslint no-restricted-imports: ["error", { "paths": ["cluster"] }]*/
还可以使用带有 name
和 message
的对象在 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
属性中指定的模块,因此在使用 importNames
或 message
选项时,需要先指定 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 from "foo";
paths
中的 importNames
的错误代码示例
/*eslint no-restricted-imports: ["error", { paths: [{
name: "foo",
importNames: ["DisallowedObject"],
message: "Please import 'DisallowedObject' from '/bar/baz/' instead."
}]}]*/
import { } from "foo";
import { } from "foo";
import { } from "foo";
/*eslint no-restricted-imports: ["error", { paths: [{
name: "foo",
importNames: ["DisallowedObject"],
message: "Please import 'DisallowedObject' from '/bar/baz/' instead."
}]}]*/
import 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
此选项是一个数组。allowImportNames
与 importNames
相反,允许此数组中指定的导入。因此,它会限制模块的所有导入,除了指定的允许的导入。
注意: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 { } 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/bar
或 import-foo/baz
。您可以使用 patterns
来限制两者。
"no-restricted-imports": ["error", {
"paths": [{
"name": "import-foo",
}],
"patterns": [{
"group": ["import-foo/ba*"],
}]
}]
此配置不仅会限制使用 path
从 import-foo
中导入,还会使用 patterns
限制从 import-foo/bar
和 import-foo/baz
中导入。
要使用 gitignore
风格的模式重新包含模块,请在模式前添加否定 (!
) 标记。(确保这些否定的模式放在数组的最后,因为顺序很重要)
"no-restricted-imports": ["error", {
"patterns": ["import1/private/*", "import2/*", "!import2/good"]
}]
您还可以使用正则表达式来限制模块(请参阅 regex
选项)。
patterns
选项的错误代码示例
/*eslint no-restricted-imports: ["error", { "patterns": ["lodash/*"] }]*/
/*eslint no-restricted-imports: ["error", { "patterns": ["lodash/*", "!lodash/pick"] }]*/
/*eslint no-restricted-imports: ["error", { "patterns": ["import1/*", "!import1/private/*"] }]*/
在此示例中,"!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
选项时,需要使用 group
或 regex
属性中的任意一个。
"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."
}]}]*/
此 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$)).*",
}]}]*/
regex
选项的正确代码示例
/*eslint no-restricted-imports: ["error", { patterns: [{
regex: "@app/(?!(api/enums$)).*",
}]}]*/
import Foo from '@app/api/enums';
caseSensitive
这是一个布尔选项,当为 true
时,会将 group
或 regex
属性中指定的模式设置为区分大小写。默认值为 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
}]}]*/
caseSensitive: true
选项的正确代码示例
/*eslint no-restricted-imports: ["error", { patterns: [{
group: ["foo[A-Z]*"],
caseSensitive: true
}]}]*/
import pick from 'food';
importNames
您还可以指定 patterns
数组中对象内的 importNames
。在这种情况下,指定的名称仅适用于关联的 group
或 regex
属性。
"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 { } 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
。在这种情况下,指定的名称仅适用于关联的 group
或 regex
属性。
注意:allowImportNames
不能与 importNames
、importNamePattern
或 allowImportNamePattern
结合使用。
"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 { } 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 { } 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 { , } from 'foo/bar';
/*eslint no-restricted-imports: ["error", { patterns: [{
group: ["foo/*"],
importNames: ["bar"],
importNamePattern: '^baz',
}]}]*/
import { , } 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 , { } from 'utils/collection-utils';
import from 'utils/file-utils';
importNamePattern
选项的正确代码示例
/*eslint no-restricted-imports: ["error", { patterns: [{
group: ["utils/*"],
importNamePattern: "^"
}]}]*/
import 'utils/init-utils';
allowImportNamePattern
这是一个字符串选项。allowImportNamePattern
与 importNamePattern
相反,此选项允许匹配指定正则表达式模式的导入。因此,它会限制模块的所有导入,除了指定的允许的模式。
注意:allowImportNamePattern
不能与 importNames
、importNamePattern
或 allowImportNames
结合使用。
"no-restricted-imports": ["error", {
"patterns": [{
"group": ["import-foo/*"],
"allowImportNamePattern": "^foo",
}]
}]
allowImportNamePattern
选项的错误代码示例
/*eslint no-restricted-imports: ["error", { patterns: [{
group: ["utils/*"],
allowImportNamePattern: '^has'
}]}]*/
import { } 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 中引入的。