import文の無秩序は「負債の入り口」である:`@trivago/prettier-plugin-sort-imports` を極限まで操るアーキテクチャ設計
大規模なフロントエンド・アーキテクチャにおいて、最も軽視されがちだが、実は最もGitコンフリクトを誘発し、認知負荷を増大させる犯人――それは「import文の並び順」だ。
開発者が増えるほど、`import`の順序はカオス化する。「サードパーティのライブラリ」「絶対パスのエイリアス」「相対パス」が入り乱れたコードベースは、単なる美学の問題ではない。それは、レビュー時に「どの依存関係が追加されたか」を脳が即座に判別することを妨げ、CIでのマージ競合を誘発する「技術的負債のバグ」である。
今回は、単なるフォーマッターの枠を超え、組織の開発規律をコードレベルで強制する `@trivago/prettier-plugin-sort-imports` の「真の運用術」を伝授する。
—
1. なぜ「自動ソート」がGit戦略に直結するのか
Gitのコンフリクトは、多くの場合「同じ行の追記」で発生する。しかし、import文がバラバラだと、Aさんが一番上にライブラリを追加し、Bさんが一番下にライブラリを追加した場合、同じファイル内でimportの順序が揺らぎ、無意味な衝突が起きる。
このプラグインによる自動化は、「importの順序を決定論的(Deterministic)にする」という極めて強力な武器だ。どの開発者がどのタイミングでコードを書いても、出力されるAST(抽象構文木)の構造は常に一定になる。これにより、レビューアは「差分」だけに集中できるようになる。
2. 実践的な設定:大規模プロジェクトを支配するグループ化戦略
単にアルファベット順に並べるだけでは不十分だ。大規模プロジェクトでは、モジュールの「意味的階層」をコードに反映させる必要がある。
以下の設定は、現場の混乱を最小化するための「鉄板構成」だ。
{
“plugins”: [“@trivago/prettier-plugin-sort-imports”],
// importの並び替えルールを定義
“importOrder”: [
“^react$”, // 1. React本体は最上部
“
“^@/components/(.)$”, // 3. 共通コンポーネント(絶対パス)
“^@/hooks/(.)$”, // 4. カスタムフック
“^@/utils/(.)$”, // 5. ユーティリティ
“^[./]” // 6. 相対パス(最も下位)
],
// グループ間の空行を強制し、視覚的な分離を確保
“importOrderSeparation”: true,
// 大文字小文字の区別をせず、ソートを正規化する
“importOrderSortSpecifiers”: true,
// 開発者の好みに左右されないよう、常にこのルールを適用
“importOrderParserPlugins”: [“typescript”, “jsx”, “decorators-legacy”]
}
この設定の「魂」
- `importOrderSeparation: true`: この空行が重要だ。視覚的なセパレーターがあることで、脳は「ここはライブラリ領域」「ここはローカル領域」と瞬時に切り替えられる。
- `importOrderParserPlugins`: TypeScriptのデコレータやJSXの構文解析を明示的に指定しないと、複雑なプロジェクトではパースエラーでCIが落ちる。ここを網羅することが「安定したパイプライン」の第一歩だ。
—
3. CI/CDパイプラインとの高度な連携:汚染を許さないゲートキーパー
ローカルでの自動整形に依存するのはアマチュアの所業だ。プロのアーキテクトは、「整形されていないコードはマージされない」ことをCIで担保する。
GitHub Actionsのパイプラインに、以下の「整形チェック」を組み込むことを強く推奨する。
jobs:
lint-and-format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v4
with: { node-version: ’20’ }
- run: npm ci
# –check フラグを使い、整形がズレている場合は終了コード1を返す
- name: Verify Import Sorting
run: npx prettier –check “src//.{ts,tsx}”
ここで重要なのは、「CIで勝手に直してコミットする」のではなく「チェックで落とす」ことだ。CIが勝手にコミットを行うと、ローカル環境との乖離が生じ、開発者のコンテキストスイッチを乱す。失敗を検知させ、開発者自身に `prettier –write` を走らせることで、規律を内面化させるのが、優れたチームマネジメントの要諦である。
—
4. パフォーマンス最適化とコンテナ運用へのハック
大規模なリポジトリ(数千ファイル超)では、Prettierの実行速度がボトルネックになることがある。
Dockerコンテナ内での並列実行
CIのコンテナ内で実行する場合、`–cache`オプションを必ず活用せよ。
変更されたファイルのみを対象にする、あるいはキャッシュを有効化する
npx prettier –write “src//.{ts,tsx}” –cache –cache-location .prettier-cache
また、Dockerのビルドレイヤーを汚さないよう、`.prettier-cache`は `.gitignore` に含めるべきだが、CIのキャッシュストレージ(GitHub Actionsなら `actions/cache`)を利用して、このキャッシュファイルを永続化すれば、巨大なプロジェクトでも数秒でチェックが完了する。
内部アーキテクチャの理解
このプラグインはPrettierの `print` フックをフックし、ASTを解析して `import` ノードを再配置している。つまり、パース時に構文エラーがあるファイルは、importのソート以前にPrettierが停止する。これを逆手に取り、Prettierを「コードの整合性を担保するゲートキーパー」として位置づけるのが、真のDevOps的な思想だ。
—
結論:静的解析は「文化」である
import文をソートすることは、単なる美化ではない。それは、チーム全員が「同じコードの読み方」を共有するための、暗黙の規約をコードという物理的な制約に落とし込む作業だ。
一度このシステムを構築すれば、新しく参画したメンバーは「importの順序に悩む」という不毛な時間から解放される。自動化された美しいコードベースは、開発者の認知負荷を下げ、より本質的なビジネスロジックにリソースを集中させるための唯一の道である。
さあ、今すぐプロジェクトの `.prettierrc` を開き、このアーキテクチャを実装せよ。それが、君のプロジェクトを「混沌」から「秩序」へと昇華させる最初の一歩になる。