Skip to content

Instantly share code, notes, and snippets.

@leaysgur
Created September 24, 2025 02:05
Show Gist options
  • Save leaysgur/5a4b94ae62b934d91233744ccc3c4c67 to your computer and use it in GitHub Desktop.
Save leaysgur/5a4b94ae62b934d91233744ccc3c4c67 to your computer and use it in GitHub Desktop.
By ClaudeCode.

JavaScript/TypeScript Import Sorting Tools 比較分析

機能比較表

機能 perfectionist simple-import-sort prettier-plugin Biome
基本ソート方法 alphabetical/natural/line-length/custom/unsorted alphabetical (Intl.Collator) alphabetical (natural sort) natural sort
ケース感度 設定可能 (ignoreCase) 常に無視 (sensitivity: base) 設定可能 自然順序 (A < a < B < b)
グループ数 無制限カスタム デフォルト5、カスタム可 無制限カスタム 無制限カスタム
TypeScript対応 tsconfig統合、型インポート分離 型インポート対応 TS 4.5+対応、型分離 型インポート分離
副作用インポート デフォルト無視、設定可 順序保持 デフォルト保持、設定可 チャンク境界作成
コメント処理 パーティション作成可 洗練されたコメント移動 高度なコメントレジストリ アタッチ/デタッチ区別
相対パス処理 parent/sibling/index区別 文字置換による階層ソート 正規表現マッチ 距離概念ベース
Node.js builtins node:プレフィックス認識 node:プレフィックス優先 <BUILTIN_MODULES> :NODE: マッチャー
カスタムキーワード作成 ✅ (customGroups)
カスタムアルファベット
行長ベースソート
フォールバックソート ✅ (タイブレーカー)
環境別対応 Node.js/Bun Node.js Node.js Node.js/Bun/Deno
設定複雑度 高 (多数オプション) 低 (1オプション)
エラー表示 詳細 最小限 (autofix推奨) Prettier統合 情報レベル
フレームワーク対応 Vue/Ember/Astro
インポートマージ ✅ (同一ソース結合) ✅ (自動結合)
CommonJS require() ✅ 完全対応
TypeScript import = ✅ 完全対応

特定実装でのみ可能な挙動

eslint-plugin-perfectionist のみ

  • カスタムキーワード作成: customGroupsで名前付きカテゴリーを定義し、groups配列で参照可能
  • CommonJS require()対応: const x = require('module') 構文を認識・ソート
  • TypeScript import =対応: import x = require('module') 構文を認識・ソート
  • 混在モジュールシステム: ES6 importとCommonJS requireを同一ファイルでソート
  • カスタムアルファベット順: 独自の文字順序定義 (alphabet: "abcdefg...")
  • 行長ソート: コード行の長さでソート
  • フォールバックソート: 同値時の二次ソート戦略
  • TSConfig統合: パスエイリアス解決のための深いTypeScript統合
  • 修飾子システム: defaultwildcardnamedrequirets-equals等の詳細な分類
  • 環境別ビルトイン認識: Bunの特殊モジュール対応
  • グループごとの個別ソート設定: 各グループで異なるソートタイプ/順序を設定可能
  • newlinesBetween設定: グループ間の改行数を0〜n行で制御

eslint-plugin-simple-import-sort のみ

  • 文字置換による階層ソート: ../../utils../utils. の順序(Biomeとは異なるアルゴリズム)
  • Autofix専用設計: 手動修正を推奨しない最小限エラー
  • 文字置換ソート: ./_- を特殊処理して正しい順序を実現
  • 最長マッチ優先: 正規表現の最長一致でグループ決定
  • 単一設定オプション: groups配列のみで全動作を制御
  • チャンク自動検出: コメント/空白行で区切られたインポート群を独立処理
  • 外部インターフェース名でのソート: import { a as b }a でソート

prettier-plugin-sort-imports のみ

  • フレームワーク対応: Vue SFC、Ember、Astroのネイティブ対応
  • インポートマージ: 同一ソースからのインポート自動結合
  • Prettierプリプロセッサー統合: フォーマット前の前処理
  • TypeScriptバージョン認識: TS 4.5+の新構文対応
  • 高度なコメントレジストリ: コメントとインポートの関係性維持
  • 安全な副作用インポート: importOrderSafeSideEffectsで特定の副作用をソート可能
  • 動的パーサープラグイン: Babel parser pluginを動的に追加可能

Biome のみ

  • チャンクベース処理: 論理的グループの自動認識
  • 距離ベースソート: モジュールの「距離」概念による自動順序付け
  • コードアクション実装: LSPベースのエディタ統合
  • プロトコル対応: jsr:npm:bun: プレフィックス
  • 統合ツールチェーン: 独立プラグインではなく完全統合
  • インポート種別順序: 同一ソース内でnamespace → default → namedの固定順
  • デタッチコメント認識: 空行で区切られたコメントを境界として認識

最も特徴的な部分

🎯 eslint-plugin-perfectionist

最大の特徴: 極めて高度なカスタマイズ性とレガシーコード対応

  • カスタムキーワード作成(customGroupsmy-builtinsのような名前付きカテゴリー)
  • 唯一のCommonJS/TypeScript import =対応(他ツールはES6のみ)
  • 5種類のソートアルゴリズム(alphabetical/natural/line-length/custom/unsorted)
  • 無制限のカスタムグループ定義with AnyOf条件
  • TypeScriptとの深い統合(tsconfig.json解析)
  • 企業環境向けの詳細制御(修飾子システム、環境別対応)
  • パフォーマンス最適化(正規表現キャッシュ、グループ計算キャッシュ)

🎯 eslint-plugin-simple-import-sort

最大の特徴: シンプルさへの徹底的なこだわり

  • 設定オプション1つのみ(groups配列)
  • ゼロ設定で動作する賢いデフォルト
  • 自動修正前提の設計(手動修正を推奨しない)
  • 依存関係ゼロで軽量
  • ディレクトリ階層を理解する相対パスソート

🎯 prettier-plugin-sort-imports

最大の特徴: Prettierエコシステムとの完全統合

  • フォーマッターとの一体化(前処理として動作)
  • 複数フレームワーク対応(Vue/Ember/Astro)
  • インポートの自動マージ機能
  • 洗練されたAST操作(Babel generator使用)
  • TypeScriptバージョンを考慮した構文生成

🎯 Biome

最大の特徴: 統合開発環境としてのアプローチ

  • リンター/フォーマッター統合ツール
  • チャンクベースの論理的グループ化
  • コードアクションモデル(LSP統合)
  • 設定不要のインテリジェント動作
  • 距離ベースの直感的なソート順

チャンク(インポート群)処理の比較

各ツールがインポート文をどのように「まとまり」として認識し、処理するかの違い:

1. Biome - 厳密なチャンク定義

チャンクの定義: 隣接するimport/export文の連続として明確に定義

  • チャンクの区切り要因:
    • 通常の文(関数宣言、変数宣言など)
    • side-effectインポート(import "x")- 各side-effectが独立チャンク
    • detached comment(空行が続くコメント)
    • export文(importチャンクを終了させる)
  • チャンク内の処理:
    • 各チャンクを完全に独立して処理
    • チャンク間は自動的に空行で分離
    • side-effectインポートは単独チャンクとして扱う
// Biomeが認識する6つのチャンク例
// チャンク 1
import A from "a";
import * as B from "b";
// チャンク 2 (side-effect)
import "x";
// チャンク 3 (side-effect)
import "y";
// チャンク 4
import { C } from "c";
// チャンク 5 (exportで終了)
export * from "d";
function f() {} // 通常の文でチャンク区切り
// チャンク 6
export * as E from "e";
export { F } from "f";

2. eslint-plugin-perfectionist - チャンク分離型処理

チャンクの定義: import以外のノードで自動的にチャンクを分離

  • チャンクの区切り要因:
    • partitionByComment: コメントでパーティション分割
    • partitionByNewLine: 空行でパーティション分割
    • import以外のノード: export文、変数宣言、関数宣言等で自動的にチャンク分離
    • hasContentBetweenNodes(): 2つのimport間にトークンがあるとチャンク分離
  • チャンク内の処理:
    • 各チャンク内でのみソート(チャンクを越えてソートしない)
    • selector + modifier システムでチャンク内グループ分類
    • side-effectインポートもソート対象として処理

3. eslint-plugin-simple-import-sort - ノード境界型チャンク

チャンクの定義: import以外のノードで明示的にチャンクを終了

  • チャンクの区切り要因:
    • import以外のノード: isPartOfChunk()"NotPartOfChunk"を返すノード(export文、変数宣言、関数宣言等)
    • extractChunks(): コメントと空白のみを許可するimport文の連続
  • チャンク内の処理:
    • 各チャンクを独立してソート
    • チャンク境界を越えてソートしない
    • チャンク間の順序は保持
// simple-import-sortの処理例
import D from "d"; // ↑ チャンク 1
import E from "e"; // ↑ (ソートされる)
import F from "f"; // ↑

const x = 5; // ← チャンク境界(import以外のノード)

import A from "a"; // ↓ チャンク 2
import B from "b"; // ↓ (独立してソート)

4. prettier-plugin-sort-imports - 全収集型ソート

処理の定義: 全import文を収集してソート、import以外のノードは元位置保持

  • 処理の特徴:

    • 全import文を収集: ファイル内の全import文を抽出してソート処理
    • import以外のノードは位置保持: function、const、export等は元の位置に残る
    • 境界を越えない移動: import文がimport以外のノードを越えて移動しない
    • side-effectインポートとignoreコメントでソート対象から除外可能
  • 実際の動作例:

    // 入力
    import { c } from "c";
    import { b } from "b";
    const myVar = 5;
    import { a } from "a";
    import { d } from "d";
    
    // 出力
    import { b } from "b"; // ← ソート済み
    import { c } from "c"; // ← ソート済み
    const myVar = 5; // ← 元位置保持
    import { a } from "a"; // ← ソート済み
    import { d } from "d"; // ← ソート済み

チャンク処理の比較まとめ

観点 Biome perfectionist simple-import-sort prettier-plugin
処理方式 厳密なチャンク定義 チャンク分離型処理 ノード境界型チャンク 全収集型ソート
チャンク区切り 文・side-effect・コメント import以外ノード・設定 import以外ノード なし(全収集)
import以外ノード チャンク境界作成 チャンク境界として機能 チャンク境界として機能 元位置保持(境界として機能)
ソート範囲 各チャンク独立ソート チャンク内のみソート チャンク独立ソート 境界内独立ソート
side-effect扱い チャンク境界作成 ソート対象として処理 チャンク境界機能 ソート対象外除外
改行制御 自動挿入 設定可能 順序保持 保持
複雑性 中(自動判定) 高(詳細設定) 低(自動判定) 低(全収集処理)

チャンク処理の特徴:

  • Biome: 最も厳密で自動的なチャンク認識(side-effect、export、その他ノードで明示的に区切り)
  • perfectionist: import以外のノードで自動チャンク分離、オプションでパーティション分割
  • simple-import-sort: import以外のノードでチャンク終了、シンプルな境界認識
  • prettier-plugin: 全import文を収集してソート、import以外のノードは境界として機能するが元位置保持
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment