JavaScriptモジュールシステムにおいて、インポートマップ(Import Maps) の "scopes" フィールドは、特定のスコープにおけるモジュールのリダイレクトルールを定義するためのものです。これにより、異なるモジュールパスに対して同じモジュール識別子に異なるマッピングを提供できます。
「scopes」の主要な役割:
- コンテキスト依存のモジュール解決
- 異なるディレクトリやモジュール用に異なる依存バージョンを指定
- 依存関係の競合回避
- 同じ依存に対する異なるバージョンを共存させる
- 環境分離
- テスト/本番環境で異なる実装を提供
- 条件付きマッピング
- 呼び出しパスに基づいてモジュール解決を動的に変更
基本構造:
{
"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';
- システムはインポートパスが
/app/admin/であることを検出 scopes内でスコープ規則/app/admin/に一致するものを検索- スコープ内の
lodashマッピング(v3バージョン)を使用 - スコープ規則に一致しない場合は、グローバル
importsにフォールバック
重要な注意点:
- パス一致ルール:
- スコープキーは必ずURLパスプレフィックスでなければならず(通常は
/で終わる) - 一致はインポートモジュールの完全なURLに基づく
- 優先順位順序:
スコープ規則 > グローバル imports
さらに長いパスプレフィックスが優先される
- ブラウザサポート:
- 現代ブラウザのネイティブサポート(Chrome 89+, Edge 89+, Safari 16.4+)
<script type="importmap">を宣言する必要がある
- 典型的な適用シーン:
- マイクロフロントエンドアーキテクチャでの依存分離
- A/Bテストによる異なる実装の試験
- 進化的な依存アップデート
- 環境固有の設定
scopesを利用することで、グローバルマッピングの制約を超えた詳細なモジュール管理が可能になり、特に大規模かつ複雑なアプリケーションに適しています。