eslint/no-restricted-imports 制限
何ができるか
このルールを使用すると、アプリケーション内で使用したくないインポートを指定できます。 このルールは静的インポートにのみ適用され、動的インポートには適用されません。
なぜ問題なのか
特定の環境では、一部のインポートが意味を持たない場合があります。 たとえば、ファイルシステムを持っていない環境で、Node.js の fs モジュールを使用するのは無意味です。
同じまたは類似した機能を提供するモジュールが複数存在することがあります(例:lodash と underscore)。プロジェクト内で特定のモジュールの採用が標準化されている場合、他の代替手段が使用されていないことを確認する必要があります。 これは、不要なサイズの増加を防ぎ、1つの依存関係で十分なのに2つ必要なことによる保守コストの上昇を回避するためです。
例
このルールに対する不正なコード例:
/* 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 を使用しており、JS-Regex に含まれるすべての機能(例:先読みや後読み)をサポートしていません。
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 は Rust-RegEx を使用し、独自の大文字小文字の区別実装を持っています。
importNames
patterns 配列内のオブジェクト内でも importNames を指定できます。 この場合、指定された名前は関連する group または regex プロパティにのみ適用されます。
patterns 内の importNames に対する不正なコード例:
/* no-restricted-imports: ["error", { patterns: [{
group: ["utils/*"],
importNames: ['isEmpty'],
message: "代わりに 'isEmpty' を lodash から使ってください。"
}]}] */
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";使用方法
構成ファイルまたは CLI でこのルールを有効化するには、次のように使用できます:
{
"rules": {
"no-restricted-imports": "error"
}
}oxlint --deny no-restricted-imports