import/no-namespace スタイル
何を実行するか
名前空間付き(いわゆる「ワイルドカード」*)インポートを使用しないという慣例を強制します。
なぜこれは問題なのか
名前空間付きインポートは、時々使用されるものの、現代の JavaScript 開発では一般的に望ましくないと考えられています。その理由は以下の通りです:
- 明確性と名前空間の汚染:
- 明確性: 名前空間付きインポートはモジュール全体をインポートするため、必要な関数やクラスだけではなく、すべての内容が読み込まれます。これにより、異なるモジュールが同じ名前の関数を持っている場合、名前衝突の可能性が高まります。
- 汚染: 全体の名前空間をインポートすると、不要な関数や変数が現在のスコープに混入します。意図しない関数や変数を使用してしまうリスクが増し、デバッグが困難になる原因となります。
- 保守性:
- 明確さ: 名前空間付きインポートは、コード内で実際にどの関数やクラスが使われているか把握しにくくなります。特に多数のインポートがある大きなプロジェクトでは顕著です。
- リファクタリング: インポート元のモジュール内で関数やクラス名が変更された場合、名前空間付きインポートを使用していると、コード内の複数箇所を更新する必要があります。複数の名前空間を扱う場合、この作業はさらに難しくなります。
- 現代的な実践:
- 明示的なインポート: 現代の JavaScript の実践では、特定のコンポーネントに対して明示的なインポートを推奨しています。これによりコードの可読性と保守性が向上します。
- ツリー・シェーキング: Webpack や Rollup などのツールは、未使用のコードをバンドルから削除するための「ツリー・シェーキング」を活用しています。名前空間付きインポートは効率的なツリー・シェーキングを妨げ、結果としてバンドルサイズが大きくなる可能性があります。
例
このルールに違反する 誤り の例:
js
import * as user from "user-lib";
import some, * as user from "./user";このルールに従った 正しい 例:
js
import { getUserName, isUser } from "user-lib";
import user from "user-lib";
import defaultExport, { isUser } from "./user";設定
このルールは、以下のプロパティを持つ設定オブジェクトを受け入れます:
ignore
type: string[]
default: []
このルールが無視すべきモジュールのグロブ文字列の配列です。 たとえば、["*.json"] とすると、すべての JSON インポートが無視されます。
使用方法
設定ファイルまたは CLI でこのルールを有効化するには、以下のように記述できます:
json
{
"plugins": ["import"],
"rules": {
"import/no-namespace": "error"
}
}bash
oxlint --deny import/no-namespace --import-plugin