インポートマップを使用したJavaScriptインポートの制御

こんにちは。Chrome 89(およびDeno 1.8)のリリースにより、インポートマップを使用できるようになりました。これはJavaScriptインポートの動作を制御できるメカニズムです。





最新の開発はネイティブモジュールを使用して構築されているという事実にもかかわらず、最初にそれらを構築せずにアプリケーションを実行することはできません。マップのインポートの目標の1つは、この問題を正確に解決することです。





要するに、今では完全に合法であり、コレクターがいなくても、次のように書くことができます。





import React from 'react';
      
      



カットの下ですべてがどのように機能するかを見てみましょう。



importディレクティブまたはimport()式でモジュールへのパスを新しい形式で解決できるようにするには、これらのパスをどこかに記述する必要があります。はい、同じNode.jsやwebpackのように、依存関係のエンジンコンパートメントの解像度に魔法はないことが判明しました。





インポートマップは、JSON形式のtype = "importmap"属性を持つスクリプトタグを使用して指定されます。





そして今、例として。静的サーバーを起動し(たとえば、python -m SimpleHTTPServer 9000を使用)、次の2つのファイルを作成します。





index.html





<!DOCTYPE html>
<html>
  <body>
    <script type="importmap">
      {
        "imports": {
          "mylib": "./my-lib.mjs"
        }
      }
    </script>
    <script type="module">
      import { sayHi } from "mylib";

      sayHi();
    </script>
  </body>
</html>

      
      



およびmy-lib.mjs





export function sayHi() {
  console.log("hi!");
}
      
      



ブラウザでページを開くと、コンソールに「hi!」と表示されました。次に、それがどのように機能するかを詳しく見てみましょう。





構造

, , JSON : imports scopes. - , ( ).





Imports

imports – , ( ) . /, ../, ./ URL.





"imports": {
  "module-name": "address"
}
      
      



"", . / .





"my-pack" index.mjs :





export default function mainFunc() {
  console.log("text from mainFunc");
}
      
      



"my-pack" "some-module" some-helper.mjs :





export function someHelper() {
  console.log("text from someHelper");
}
      
      



importmap index.html:





  <script type="importmap">
    {
      "imports": {
        "mypack": "./my-pack/index.mjs",
        "mypack/": "./my-pack/"
      }
    }
  </script>
      
      



,





import mainFunc from "mypack";
      
      







import { someHelper } from "mypack/some-module/some-helper.mjs";
      
      



Scopes

, (, ), , . . :





<script type="importmap">
  {
    "imports": {
      "mypack": "./my-pack/index.mjs",
      "mypack/": "./my-pack/"
    },
    "scopes": {
      "some/other/url/": {
        "mypack": "./my-pack/index-v2.jsm"
      }
    }
  }
</script>
      
      



, url some/other/url/ "mypack" "./my-pack/index-v2.jsm", "./my-pack/index.mjs".





. :





<script type="importmap">
{
  "imports": {
    "a": "/a-1.mjs",
    "b": "/b-1.mjs",
    "c": "/c-1.mjs"
  },
  "scopes": {
    "/scope2/": {
      "a": "/a-2.mjs"
    },
    "/scope2/scope3/": {
      "b": "/b-3.mjs"
    }
  }
}
</script>
      
      



:





Specifier





Referrer





Resulting URL





a





/scope1/foo.mjs





/a-1.mjs





b





/scope1/foo.mjs





/b-1.mjs





c





/scope1/foo.mjs





/c-1.mjs

















a





/scope2/foo.mjs





/a-2.mjs





b





/scope2/foo.mjs





/b-1.mjs





c





/scope2/foo.mjs





/c-1.mjs

















a





/scope2/scope3/foo.mjs





/a-2.mjs





b





/scope2/scope3/foo.mjs





/b-3.mjs





c





/scope2/scope3/foo.mjs





/c-1.mjs





, script. :





<script type="importmap">
{
  "imports": { ... },
  "scopes": { ... }
}
</script>

      
      



src:





<script type="importmap" src="some/address/to/import-map.importmap"></script>
      
      



, MIME type application/importmap+json.





  1. , .





  2. , :





    An import map is added after module script load was triggered.





  3. . , . :





    複数のインポートマップはまだサポートされていません。https://crbug.com/927119





デノ

Denoでは、インポートマップは--import-mapフラグを使用して接続されます。





deno run --import-map=import_map.json index.ts







ここで、import_map.jsonインポートマップであり、index.tsは実行(コンパイル)するファイルです。





のソース

https://wicg.github.io/import-maps





https://github.com/WICG/import-maps





https://deno.land/manual/linking_to_external_code/import_maps








All Articles