Skip to content
← Back to rules

eslint/no-restricted-imports 制限

何ができるか

このルールを使用すると、アプリケーション内で使用したくないインポートを指定できます。 このルールは静的インポートにのみ適用され、動的インポートには適用されません。

なぜ問題なのか

特定の環境では、一部のインポートが意味を持たない場合があります。 たとえば、ファイルシステムを持っていない環境で、Node.js の fs モジュールを使用するのは無意味です。

同じまたは類似した機能を提供するモジュールが複数存在することがあります(例:lodash と underscore)。プロジェクト内で特定のモジュールの採用が標準化されている場合、他の代替手段が使用されていないことを確認する必要があります。 これは、不要なサイズの増加を防ぎ、1つの依存関係で十分なのに2つ必要なことによる保守コストの上昇を回避するためです。

このルールに対する不正なコード例:

js
/* no-restricted-imports: ["error", "disallowed-import"] */

import foo from "disallowed-import";
export * from "disallowed-import";

このルールに対する正しいコード例:

js
/* no-restricted-imports: ["error", "fs"] */

import crypto from "crypto";
export * from "bar";

オプション

オブジェクト内に namemessage プロパティを使用して、特定のモジュールに対してカスタムメッセージを指定することもできます。 name の値はモジュール名であり、message プロパティにはカスタムメッセージが含まれます。 カスタムメッセージはユーザー向けのヘルプテキストとして表示されます。

このルールに対する不正なコード例:

js
/* no-restricted-imports: ["error", {
  "name": "disallowed-import",
  "message": "代わりに 'allowed-import' を使ってください"
}] */

import foo from "disallowed-import";

paths

このオプションはオブジェクト型で、制限したいモジュールの名前を含む配列を値として持ちます。

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

paths に対する不正なコード例:

js
/* no-restricted-imports: ["error", { "paths": ["cluster"] }] */

import cluster from "cluster";

paths 配列内に namemessage を持つオブジェクトを使用して、特定のモジュールに対するカスタムメッセージを指定することもできます。

json
"no-restricted-imports": ["error", {
  "paths": [{
    "name": "import-foo",
    "message": "代わりに 'import-bar' を使ってください。"
  }, {
    "name": "import-baz",
    "message": "代わりに 'import-quux' を使ってください。"
  }]
}]
importNames

paths 内のこのオプションは配列であり、モジュールからエクスポートされる特定のバインディング名を指定するために使用できます。 paths 配列内の importNames に指定された名前は、対応するオブジェクトの name プロパティで指定されたモジュールに影響します。 したがって、importNamesmessage オプションを使用する場合は、まず name プロパティを指定する必要があります。

importNames 配列内に "default" 文字列を指定すると、デフォルトエクスポートのインポートが制限されます。

このルールに対する不正なコード例:

js
/* no-restricted-imports: ["error", { paths: [{
  "name": "foo",
  "importNames": ["default"]
}, {
  "name": "bar",
  "importNames": ["Baz"]
}]}] */

import DisallowedObject from "foo";
import { Baz } from "far";
allowImportNames

このオプションは配列です。importNames の逆で、この配列内に指定されたインポートを許可します。 つまり、モジュールからのすべてのインポートを制限しますが、指定された許可されたものだけは例外になります。

注記:allowImportNamesimportNames と一緒に使用することはできません。

このルールに対する不正なコード例:

js
/* no-restricted-imports: ["error", { paths: [{
  "name": "foo",
  "allowImportNames": ["AllowedObject"],
  "message": "'foo' から 'AllowedObject' 以外のインポートは使用しないでください。"
}]}] */

import { DisallowedObject } from "foo";

allowTypeImports

パスに対して型のみのインポートを許可するかどうか。デフォルト値:false

このルールに対する不正なコード例:

typescript
/* no-restricted-imports: ["error", { paths: [{
  "name": "foo",
  "allowTypeImports": true
}]}] */

import foo from "import-foo";
export { Foo } from "import-foo";

このルールに対する正しいコード例:

typescript
/* 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 オプションはより柔軟性のある方法でインポートパスを指定でき、同じディレクトリ内の複数のモジュールを制限できます。 たとえば:

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

この設定では import-foo モジュールのインポートを制限しますが、import-foo/barimport-foo/baz のインポートは制限しません。 patterns を使用することで、これらすべてを制限できます:

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

この設定では、import-foo からのインポートだけでなく、import-foo/barimport-foo/baz からのインポートも patterns を使って制限します。

また、正規表現を使用してモジュールを制限することもできます(regex オプションを参照)。

patterns オプションに対する不正なコード例:

js
/* no-restricted-imports: ["error", { "patterns": ["lodash/*"] }] */

import pick from "lodash/pick";

patterns オプションに対する正しいコード例:

js
/* no-restricted-imports: ["error", { "patterns": ["crypto/*"] }] */

import crypto from "crypto";
group

patterns 配列にはオブジェクトも含められます。 group プロパティは、モジュールを制限するために gitignore 形式のパターンを指定するために使用され、message プロパティはカスタムメッセージを指定するために使用されます。

patterns オプションを使用する際には、group または regex プロパティのどちらかが必要です。

group オプションに対する不正なコード例:

js
/* no-restricted-imports: ["error", { patterns: [{
  group: ["lodash/*"],
  message: "代わりに 'lodash' からのデフォルトインポートを使ってください。"
}]}] */

import pick from "lodash/pick";
regex

regex プロパティは、モジュールを制限するための正規表現パターンを指定するために使用されます。

注記:regexgroup と一緒に使用することはできません。

警告: このルールは Rust-Regex を使用しており、JS-Regex に含まれるすべての機能(例:先読みや後読み)をサポートしていません。

regex オプションに対する不正なコード例:

js
/* 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 に対する不正なコード例:

js
/* no-restricted-imports: ["error", { patterns: [{
  group: ["utils/*"],
  importNames: ['isEmpty'],
  message: "代わりに 'isEmpty' を lodash から使ってください。"
}]}] */

import { isEmpty } from "utils/collection-utils";
allowImportNames

patterns 配列内のオブジェクト内でも allowImportNames を指定できます。 この場合、指定された名前は関連する group または regex プロパティにのみ適用されます。

注記:allowImportNamesimportNamesimportNamePatternallowImportNamePattern と一緒に使用することはできません。

importNamePattern

このオプションを使用すると、正規表現パターンを使ってインポート名を制限できます。

importNamePattern オプションに対する不正なコード例:

js
/* no-restricted-imports: ["error", { patterns: [{
  group: ["foo/*"],
  importNamePattern: '^(is|has)',
  message: "代わりに 'is*' および 'has*' 関数を baz/bar から使ってください"
}]}] */

import { isSomething, hasSomething } from "foo/bar";
allowImportNamePattern

このオプションは文字列型です。importNamePattern の逆で、指定された正規表現パターンに一致するインポートを許可します。 つまり、モジュールからのすべてのインポートを制限しますが、指定された許可されたパターンだけは例外になります。

注記:allowImportNamePatternimportNamesimportNamePatternallowImportNames と一緒に使用することはできません。

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

allowImportNamePattern オプションに対する不正なコード例:

js
/* no-restricted-imports: ["error", { patterns: [{
  group: ["utils/*"],
  allowImportNamePattern: '^has'
}]}] */

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

allowImportNamePattern オプションに対する正しいコード例:

js
/* no-restricted-imports: ["error", { patterns: [{
  group: ["utils/*"],
  allowImportNamePattern: '^is'
}]}] */

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

使用方法

構成ファイルまたは CLI でこのルールを有効化するには、次のように使用できます:

json
{
  "rules": {
    "no-restricted-imports": "error"
  }
}
bash
oxlint --deny no-restricted-imports

参照