JavaScriptのインポートマップで「scopes」を使う方法

JavaScriptモジュールシステムにおいて、インポートマップ(Import Maps)"scopes" フィールドは、特定のスコープにおけるモジュールのリダイレクトルールを定義するためのものです。これにより、異なるモジュールパスに対して同じモジュール識別子に異なるマッピングを提供できます。

「scopes」の主要な役割:

  1. コンテキスト依存のモジュール解決
  • 異なるディレクトリやモジュール用に異なる依存バージョンを指定
  1. 依存関係の競合回避
  • 同じ依存に対する異なるバージョンを共存させる
  1. 環境分離
  • テスト/本番環境で異なる実装を提供
  1. 条件付きマッピング
  • 呼び出しパスに基づいてモジュール解決を動的に変更

基本構造:

{
  "imports": {
    // グローバルデフォルトマッピング
  },
  "scopes": {
    "スコープパス/": {
      // このパスに特化したマッピング
    }
  }
}

使用例:

例1:異なるパスで異なる依存バージョンを使用

{
  "imports": {
    "lodash": "/node_modules/lodash@4.17.21/index.js"
  },
  "scopes": {
    "/app/admin/": {
      "lodash": "/node_modules/lodash@3.10.1/index.js"
    }
  }
}
  • 効果
  • グローバルではデフォルトでlodash v4を使用
  • /app/admin/配下のすべてのモジュールはlodash v3を使用

例2:テスト環境での特別な実装

{
  "scopes": {
    "/app/tests/": {
      "api": "/mocks/api-mock.js"  // テスト環境でモックAPIを使用
    }
  }
}
  • 効果
  • テストディレクトリ配下のモジュールがapiをインポートすると、モック実装が使用される
  • 他の領域では実際のAPI実装が使用される

例3:条件付きポリフィル

{
  "scopes": {
    "/old-app/": {
      "fetch": "/polyfills/fetch-polyfill.js"
    }
  }
}
  • 効果
  • 古いアプリケーションパスではカスタムのfetchポリフィルを使用
  • 現代的なアプリケーション領域ではネイティブのfetchを使用

実際の動作フロー:

モジュール /app/admin/dashboard.js が次のコードを持つ場合:

import _ from 'lodash';
  1. システムはインポートパスが /app/admin/ であることを検出
  2. scopes 内でスコープ規則 /app/admin/ に一致するものを検索
  3. スコープ内の lodash マッピング(v3バージョン)を使用
  4. スコープ規則に一致しない場合は、グローバル imports にフォールバック

重要な注意点:

  1. パス一致ルール
  • スコープキーは必ずURLパスプレフィックスでなければならず(通常は / で終わる)
  • 一致はインポートモジュールの完全なURLに基づく
  1. 優先順位順序
スコープ規則 > グローバル imports
さらに長いパスプレフィックスが優先される
  1. ブラウザサポート
  • 現代ブラウザのネイティブサポート(Chrome 89+, Edge 89+, Safari 16.4+)
  • <script type="importmap"> を宣言する必要がある
  1. 典型的な適用シーン
  • マイクロフロントエンドアーキテクチャでの依存分離
  • A/Bテストによる異なる実装の試験
  • 進化的な依存アップデート
  • 環境固有の設定

scopes を利用することで、グローバルマッピングの制約を超えた詳細なモジュール管理が可能になり、特に大規模かつ複雑なアプリケーションに適しています。

タグ: javascript Import Maps Module Resolution

7月10日 21:57 投稿