eslint/no-restricted-imports 제한
작동 방식
이 규칙을 사용하면 애플리케이션에서 사용하고 싶지 않은 모듈을 지정할 수 있습니다.
이 규칙은 정적 가져오기(스테틱 임포트)에만 적용되며, 동적 가져오기에는 적용되지 않습니다.
왜 좋지 않은가?
일부 가져오기는 특정 환경에서는 의미가 없을 수 있습니다.
예를 들어, 파일 시스템이 없는 환경에서는 노드의 fs 모듈은 적절하지 않습니다.
비슷하거나 동일한 기능을 제공하는 모듈들이 있을 수 있습니다. 예를 들어 lodash와 underscore처럼요.
프로젝트는 하나의 모듈을 표준화했을 수 있습니다.
다른 대안이 사용되고 있으면 프로젝트 용량이 불필요하게 커지고, 두 개의 종속성 관리를 유지해야 하는 더 높은 유지보수 비용이 발생합니다. 따라서 한 개로 충분한 경우 두 개 이상을 사용하는 것을 방지해야 합니다.
예시
이 규칙에 대해 잘못된 코드 예시:
/* no-restricted-imports: ["error", "disallowed-import"] */
import foo from "disallowed-import";
export * from "disallowed-import";이 규칙에 대해 올바른 코드 예시:
/* no-restricted-imports: ["error", "fs"] */
import crypto from "crypto";
export * from "bar";옵션
특정 모듈에 대해 사용자 정의 메시지를 지정할 수도 있습니다. 객체 내부의 name과 message 속성을 사용할 수 있으며, name 값은 모듈 이름이고 message 속성은 사용자 정의 메시지를 포함합니다.
사용자 정의 메시지는 사용자에게 도움말 텍스트로 표시됩니다.
이 규칙에 대해 잘못된 코드 예시:
/* no-restricted-imports: ["error", {
"name": "disallowed-import",
"message": "대신 'allowed-import'를 사용하세요"
}] */
import foo from "disallowed-import";paths
이 옵션은 객체이며, 제한하고자 하는 모듈 이름을 포함하는 배열입니다.
{"rules: {"no-restricted-imports": ["error", { "paths": ["import1", "import2"] }]}}paths에 대해 잘못된 코드 예시:
/* no-restricted-imports: ["error", { "paths": ["cluster"] }] */
import cluster from "cluster";paths 배열 내에서 name과 message 속성을 가진 객체를 사용하여 특정 모듈에 대한 사용자 정의 메시지를 지정할 수도 있습니다.
"no-restricted-imports": ["error", {
"paths": [{
"name": "import-foo",
"message": "대신 'import-bar'를 사용하세요."
}, {
"name": "import-baz",
"message": "대신 'import-quux'를 사용하세요."
}]
}]importNames
paths 내의 이 옵션은 배열이며, 특정 모듈에서 내보내는 바인딩의 이름을 지정하는 데 사용할 수 있습니다.paths 배열 내에 지정된 importNames는 해당 객체의 name 속성에 지정된 모듈에 영향을 미칩니다.
따라서 importNames 또는 message 옵션을 사용할 때는 반드시 먼저 name 속성을 지정해야 합니다.
importNames 배열 내에 "default" 문자열을 지정하면 기본 내보내기(디폴트 내보내기)의 가져오기를 제한합니다.
이 규칙에 대해 잘못된 코드 예시:
/* no-restricted-imports: ["error", { paths: [{
"name": "foo",
"importNames": ["default"]
}, {
"name": "bar",
"importNames": ["Baz"]
}]}] */
import DisallowedObject from "foo";
import { Baz } from "far";allowImportNames
이 옵션은 배열이며, importNames의 반대 개념입니다.
이 옵션을 사용하면 배열 내에 지정된 가져오기를 허용합니다. 즉, 모듈의 모든 가져오기를 제한하지만, 지정된 허용된 항목들만 예외로 둡니다.
참고: allowImportNames는 importNames와 함께 사용할 수 없습니다.
이 규칙에 대해 잘못된 코드 예시:
/* no-restricted-imports: ["error", { paths: [{
"name": "foo",
"allowImportNames": ["AllowedObject"],
"message": "'foo'에서 'AllowedObject'만 사용하세요."
}]}] */
import { DisallowedObject } from "foo";allowTypeImports
경로에 대해 타입 전용 가져오기를 허용할지 여부. 기본값: false.
이 규칙에 대해 잘못된 코드 예시:
/* no-restricted-imports: ["error", { paths: [{
"name": "foo",
"allowTypeImports": true
}]}] */
import foo from "import-foo";
export { Foo } from "import-foo";이 규칙에 대해 올바른 코드 예시:
/* no-restricted-imports: ["error", { paths: [{
"name": "foo",
"allowTypeImports": true
}]}] */
import type foo from "import-foo";
export type { Foo } from "import-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*"],
}]
}]이 구성은 경로를 통해 import-foo에서의 가져오기를 제한할 뿐만 아니라, import-foo/bar와 import-foo/baz도 patterns를 통해 제한합니다.
또한 정규 표현식을 사용하여 모듈을 제한할 수도 있습니다 (다음 regex 옵션 참조).
patterns 옵션에 대해 잘못된 코드 예시:
/* no-restricted-imports: ["error", { "patterns": ["lodash/*"] }] */
import pick from "lodash/pick";patterns 옵션에 대해 올바른 코드 예시:
/* no-restricted-imports: ["error", { "patterns": ["crypto/*"] }] */
import crypto from "crypto";group
patterns 배열은 또한 객체를 포함할 수 있습니다.group 속성은 모듈을 제한하기 위해 gitignore 스타일 패턴을 지정하며, message 속성은 사용자 정의 메시지를 지정합니다.
patterns 옵션을 사용할 때는 group 또는 regex 속성 중 하나가 필요합니다.
group 옵션에 대해 잘못된 코드 예시:
/* no-restricted-imports: ["error", { patterns: [{
group: ["lodash/*"],
message: "'lodash'에서 기본 가져오기를 사용하세요."
}]}] */
import pick from "lodash/pick";regex
regex 속성은 모듈을 제한하기 위한 정규 표현식 패턴을 지정하는 데 사용됩니다.
참고: regex는 group과 함께 사용할 수 없습니다.
경고: 이 규칙은 Rust-Regex를 사용합니다. 이는 자바스크립트 정규 표현식의 모든 기능을 지원하지 않으며, 앞쪽/뒤쪽 확인(lookahead/lookbehind) 등의 기능이 제한됩니다.
regex 옵션에 대해 잘못된 코드 예시:
/* 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";caseSensitive
이 옵션은 부울 값이며, true일 경우 group 속성에 지정된 패턴을 대소문자 구분으로 처리합니다. 기본값은 false입니다.
경고: regex에는 대소문자 구분 검사를 적용하지 않습니다. regex는 자체적인 대소문자 구분 구현을 사용합니다.
importNames
patterns 배열 내의 객체 안에서도 importNames를 지정할 수 있습니다.
이 경우 지정된 이름은 관련된 group 또는 regex 속성에만 적용됩니다.
patterns 내의 importNames에 대해 잘못된 코드 예시:
/* no-restricted-imports: ["error", { patterns: [{
group: ["utils/*"],
importNames: ['isEmpty'],
message: "대신 'lodash'에서 'isEmpty'를 사용하세요."
}]}] */
import { isEmpty } from "utils/collection-utils";allowImportNames
patterns 배열 내의 객체 안에서도 allowImportNames를 지정할 수 있습니다.
이 경우 지정된 이름은 관련된 group 또는 regex 속성에만 적용됩니다.
참고: allowImportNames는 importNames, importNamePattern, 또는 allowImportNamePattern과 함께 사용할 수 없습니다.
importNamePattern
이 옵션을 사용하면 가져오기 이름을 제한하는 데 정규 표현식 패턴을 사용할 수 있습니다.
importNamePattern 옵션에 대해 잘못된 코드 예시:
/* no-restricted-imports: ["error", { patterns: [{
group: ["foo/*"],
importNamePattern: '^(is|has)',
message: "대신 'is*' 및 'has*' 함수를 'baz/bar'에서 사용하세요"
}]}] */
import { isSomething, hasSomething } from "foo/bar";allowImportNamePattern
이 옵션은 문자열 형식입니다. importNamePattern의 반대 개념입니다.
이 옵션을 사용하면 지정된 정규 표현식 패턴과 일치하는 가져오기를 허용합니다.
즉, 모듈의 모든 가져오기를 제한하지만, 지정된 허용 패턴만 예외로 둡니다.
참고: allowImportNamePattern는 importNames, importNamePattern, 또는 allowImportNames와 함께 사용할 수 없습니다.
"no-restricted-imports": ["error", {
"patterns": [{
"group": ["import-foo/*"],
"allowImportNamePattern": "^foo",
}]
}]allowImportNamePattern 옵션에 대해 잘못된 코드 예시:
/* no-restricted-imports: ["error", { patterns: [{
group: ["utils/*"],
allowImportNamePattern: '^has'
}]}] */
import { isEmpty } from "utils/collection-utils";allowImportNamePattern 옵션에 대해 올바른 코드 예시:
/* no-restricted-imports: ["error", { patterns: [{
group: ["utils/*"],
allowImportNamePattern: '^is'
}]}] */
import { isEmpty } from "utils/collection-utils";사용 방법
구성 파일이나 명령줄 인터페이스를 통해 이 규칙을 활성화하려면 다음을 사용할 수 있습니다:
{
"rules": {
"no-restricted-imports": "error"
}
}oxlint --deny no-restricted-imports