{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/package-management-in-deno-with-import-map/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"5fe718cf-b992-583d-84a9-e12057f5ed2c","excerpt":"この記事はDeno Advent Calendar 2019 - Qiitaの 7 日目の記事です。 Deno で何かしら 3rd パーティ製のライブラリを利用するコードを書いたことはありますか。例えば以下のようにライブラリを import します。 Deno は Node.js とは違いnpm…","html":"<blockquote>\n<p>この記事は<a href=\"https://qiita.com/advent-calendar/2019/deno\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Deno Advent Calendar 2019 - Qiita</a>の 7 日目の記事です。</p>\n</blockquote>\n<p>Deno で何かしら 3rd パーティ製のライブラリを利用するコードを書いたことはありますか。例えば以下のようにライブラリを import します。</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> uniq <span class=\"token keyword\">from</span> <span class=\"token string\">'https://deno.land/x/lodash@4.17.15-es/uniq.js'</span>\n\n<span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">uniq</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>Deno は Node.js とは違い<code>npm</code>のようなパッケージマネージャが付属しておらず、パッケージ名で import/require することはありません。Deno はそもそも<code>npm install</code>のような事前処理が不要で、実行するときに import 文を解析しながら必要なコードを取得してから実行ます。いわゆる<a href=\"https://yosuke-furukawa.hatenablog.com/entry/2019/06/10/113111\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Zero-install</a>の１つです。<br>\nDeno では URL やファイルパス などファイルの URI を明示して import します。ここまで聞いて、多くの Node.js ユーザは「コード内に （semver を含む）URL ハードコードしないといけないの、複数のファイルで使用するならその数だけハードコードするの、アップデート辛くないの？」と感じると思います。</p>\n<p>この問題を解決するために日本の Deno コミッターの方々が<a href=\"https://github.com/keroxp/dink\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">keroxp/dink</a>や<a href=\"https://github.com/syumai/dem\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">syumai/dem</a>などの Deno のパッケージマネージャを作成しています。<br>\n一方で Deno は現在<a href=\"https://github.com/WICG\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">WICG</a>で策定されている<a href=\"https://github.com/WICG/import-maps\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import maps</a>を先行してサポートしています。これを活用すれば semver を含む URL をコード内に出現させることなく、パッケージマネージャに頼らずとも標準機能だけでパッケージのバージョンを管理できるのではないかという点について考察します。</p>\n<!--more-->\n<h2 id=\"import-maps-とは\" style=\"position:relative;\"><a href=\"#import-maps-%E3%81%A8%E3%81%AF\" aria-label=\"import maps とは permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Import maps とは</h2>\n<blockquote>\n<p>This proposal allows control over what URLs get fetched by JavaScript import statements and import() expressions. This allows “bare import specifiers”, such as import moment from “moment”, to work.</p>\n<p>The mechanism for doing this is via an import maps which can be used to control the resolution of module specifiers generally. As an introductory example, consider the code</p>\n<p>— <a href=\"https://github.com/WICG/import-maps\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">WICG/import-maps: How to control the behavior of JavaScript imports</a></p>\n</blockquote>\n<p>Import maps とは、import 文と dynamic import に対して動作する ImportSpecifier と実 URL をマッピングするための設定ファイルの仕様です。策定しているのは WICG というコミュニティグループです。本記事は Import maps の解説記事ではないため必要な文だけかいつまんで説明します。仕様の詳細は原文（リポジトリ）をご確認下さい。</p>\n<p>Import maps はこれまでの Node.js や webpack などの module bundler を用いた開発体験のように<code>import _ from 'lodash'</code>とパッケージ名だけ指定する import を使い続けつつ ES Modules の世界観に引っ越しできる緩衝材みたいなものだと思えばおおむね合ってると思います。<br>\n設定ファイルの書式は以下のような JSON になっています。キー名が import に使用する名前、値がその import したときに解決されるパスを指定しています。</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"imports\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"http\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"https://deno.land/std/http/server.ts\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>これを利用すると、（実際の API は全く違うけど）Node.js の HTTP モジュールのように名前だけで import できます。</p>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> <span class=\"token punctuation\">{</span> serve <span class=\"token punctuation\">}</span> <span class=\"token keyword\">from</span> <span class=\"token string\">'http'</span>\n\n<span class=\"token keyword\">const</span> body <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">TextEncoer</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">encode</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Hello World\\n'</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">for</span> <span class=\"token keyword\">await</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">const</span> req <span class=\"token keyword\">of</span> <span class=\"token function\">serve</span><span class=\"token punctuation\">(</span><span class=\"token string\">':8080'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  req<span class=\"token punctuation\">.</span><span class=\"token function\">respond</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> body <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Import maps が<code>maps.json</code>、↑ のコードを<code>test.ts</code>としたとき、実行コマンドは<code>deno run --importmap=maps.json test.ts</code>になります。<code>--importmap</code>オプションで Import maps のファイルパスを指定します。<br>\nなお、現状の Import maps はアプリケーション製作者のための仕様であり、ライブラリ提供者のための仕様ではありません。ライブラリを公開するときに Import maps を含めて提供し、それらを組み合わせるようなユースケースは想定されていません。あくまでアプリケーション製作者が、利用するライブラリ全てに関心を持つように想定されています。</p>\n<blockquote>\n<p>Import maps are an application-level thing, somewhat like service workers. (More formally, they would be per-module map, and thus per-realm.) They are not meant to be composed, but instead produced by a human or tool with a holistic view of your web application. For example, it would not make sense for a library to include an import map; libraries can simply reference modules by specifier, and let the application decide what URLs those specifiers map to.</p>\n<p>— <a href=\"https://github.com/WICG/import-maps#background\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">WICG/import-maps: How to control the behavior of JavaScript imports</a></p>\n</blockquote>\n<h2 id=\"deno-の-import-maps-サポート\" style=\"position:relative;\"><a href=\"#deno-%E3%81%AE-import-maps-%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88\" aria-label=\"deno の import maps サポート permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Deno の Import maps サポート</h2>\n<p>Import maps はまだ策定中の仕様であり、仕様自体が fix しきっていません。それでもなお採用するということは何かしら解決したい Deno の問題 OR 大きなアドバンテージがあるのではないかと疑っていました。が、先に結論を書くと経緯を読み取ることはできませんでした。</p>\n<p>まず公式ドキュメントにはなんと書かれているでしょうか。「Import maps が使えるよ、いくつか制約があるよ」とだけ書かれています。</p>\n<blockquote>\n<p>Deno supports import maps.</p>\n<p>One can use import map with —importmap=<FILE> CLI flag.<br>\nCurrent limitations:</p>\n<ul>\n<li>single import map</li>\n<li>no fallback URLs</li>\n<li>Deno does not support std: namespace</li>\n<li>Does supports only file:, http: and https: schemes</li>\n</ul>\n<p>— <a href=\"https://deno.land/std/manual.md#import-maps\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">deno /std/manual.md</a></p>\n</blockquote>\n<p>これだけでは経緯やモチベーションが分からないので Issue と PR を追ってみます。</p>\n<blockquote>\n<p>We should consider finding a way to implement import-maps. The WICG proposal has started to be implemented. While it is still an early stage, it would solve several problems we have had with remote modules.</p>\n<p>— <a href=\"https://github.com/denoland/deno/issues/1921\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Implement import-maps · Issue #1921 · denoland/deno</a></p>\n</blockquote>\n<p>この前<a href=\"https://jsconf.jp/2019/talk/kitson-kelly\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">JSConf JP でもトークしていた</a>Kitson Kelly が提案しています。PR はこれです。</p>\n<blockquote>\n<p>— <a href=\"https://github.com/denoland/deno/pull/2360\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">feat: Import maps by bartlomieju · Pull Request #2360 · denoland/deno</a></p>\n</blockquote>\n<p>どれを読んでも経緯はわからず「（私が冒頭に書いたような問題を解決しうる仕様だから）入れてみようぜ！」って温度感なのかなと勝手に感じました。<br>\nということでなぜ Deno に Import maps が入ったのか動機は不明ですが、自分なりの視点から考察していきます。</p>\n<h2 id=\"import-maps-におけるライブラリのアップデート\" style=\"position:relative;\"><a href=\"#import-maps-%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88\" aria-label=\"import maps におけるライブラリのアップデート permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Import maps におけるライブラリのアップデート</h2>\n<p>イメージしやすいようによく使われるであろう lodash を題材に実コードを出します。このような Import maps、Deno のコード、実行結果があったとします。</p>\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre class=\"language-json\"><code class=\"language-json\"><span class=\"token punctuation\">{</span>\n  <span class=\"token property\">\"imports\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"lodash/\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"https://deno.land/x/lodash@4.17.15-es/\"</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">import</span> uniq <span class=\"token keyword\">from</span> <span class=\"token string\">'lodash/uniq.js'</span>\n\n<span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token function\">uniq</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">[</span><span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">,</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">,</span> <span class=\"token number\">3</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ deno --importmap=importmap.json test.ts\nDownload https://deno.land/x/lodash@4.17.15-es/uniq.js\n...\nDownload https://deno.land/x/lodash@4.17.15-es/_objectToString.js\n[ 1, 2, 3 ]</code></pre></div>\n<p>まず、読み込まれるバージョンを固定するために Import maps の URL に semver を指定します。この semver は GitHub の tag 名に対応しています（ex. <a href=\"https://github.com/lodash/lodash/tags\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">lodash のタグ一覧</a>）。<br>\nなお、キー名の末尾を<code>/</code>にすることで<code>lodash/uniq.js</code>のようにパッケージ名の後に<code>/</code>をつけた場合どのディレクトリを見るかを指定できます。</p>\n<p>ライブラリをアップデートしたい場合、Import maps の semver を書き換えれば OK です。</p>\n<div class=\"gatsby-highlight\" data-language=\"diff\"><pre class=\"language-diff\"><code class=\"language-diff\"><span class=\"token unchanged\"><span class=\"token prefix unchanged\"> </span>{\n<span class=\"token prefix unchanged\"> </span>  \"imports\": {\n</span><span class=\"token deleted-sign deleted\"><span class=\"token prefix deleted\">-</span>    \"lodash/\": \"https://deno.land/x/lodash@4.17.15-es/\"\n</span><span class=\"token inserted-sign inserted\"><span class=\"token prefix inserted\">+</span>    \"lodash/\": \"https://deno.land/x/lodash@x.y.z-es/\"\n</span><span class=\"token unchanged\"><span class=\"token prefix unchanged\"> </span>  }\n<span class=\"token prefix unchanged\"> </span>}</span></code></pre></div>\n<p>このように、シンプルな依存を手動で管理するのであれば Import maps でも管理できると思います。ただ、現実的にこれでいいかと言われると、私は ”これだけでは足りない” と思います。</p>\n<h3 id=\"悩みsemver-range-が使えない自動アップデートは難しい\" style=\"position:relative;\"><a href=\"#%E6%82%A9%E3%81%BFsemver-range-%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84%E8%87%AA%E5%8B%95%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%81%AF%E9%9B%A3%E3%81%97%E3%81%84\" aria-label=\"悩みsemver range が使えない自動アップデートは難しい permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>悩み：semver range が使えない+自動アップデートは難しい</h3>\n<p>これは Deno や Import maps の仕様の問題ではなくレジストリの問題です。また、パッケージマネージャを作ったとしても同様の問題が発生します。</p>\n<p>npm パッケージをホスティングする<a href=\"https://unpkg.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">unpkg.com</a>では<code>~0.0.0</code>のように<code>~</code>や<code>^</code>、<code>>=</code>などの range を指定できます。例えばライブラリにセキュリティパッチが配布された際、毎パッチバージョンごとに手動で semver を書き換えるような手間が発生します。<br>\nDeno は<code>deno.land/x/</code>以外の任意の URL を import に使用できるため、指定の自由度が高すぎて URL のどこが semver に相当するのか規則性がありません。そのためアップデートを検知する際にどこからバージョン情報を取得すればいいかについても規則性がなく、何かしらの規約が設けられないと semver range を使えるようにするのは難しいでしょう。</p>\n<h3 id=\"悩みライブラリの開発体験\" style=\"position:relative;\"><a href=\"#%E6%82%A9%E3%81%BF%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E9%96%8B%E7%99%BA%E4%BD%93%E9%A8%93\" aria-label=\"悩みライブラリの開発体験 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>悩み：ライブラリの開発体験</h3>\n<p>そもそも Import maps はライブラリ製作者のための仕様ではないと明言されており、これを Import maps に求めるのは筋違いですが、Import maps だけでは足りないので別のソリューションを組み合わせる必要があると思っています。<br>\nライブラリを制作するときに、ライブラリが依存するライブラリの semver を URL としてハードコードする必要があります。もし Import maps を利用してライブラリを使用したければ、publish 時に Import maps でマッピングしていた情報をすべてコード上に戻すなど、以下の AST 変換のような事前処理が必要になります。</p>\n<p><a href=\"https://astexplorer.net/#/gist/2ef31923cf9758ae052b01711ea03c0d/131b956bdae82f40e515e84d82d97f41207197a8\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://astexplorer.net/#/gist/2ef31923cf9758ae052b01711ea03c0d/131b956bdae82f40e515e84d82d97f41207197a8</a></p>\n<p>補足ですが、Deno は <a href=\"https://kt3k.github.io/deno_talk_ginza/#31\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Batteries Included 志向</a>でコアが作られているので、Small core を掲げる Node.js よりも 3rd パーティ製のパッケージに頼るケースは多くありません。ただ完全にゼロになることもありえないため、何かしらの 3rd パーティライブラリに頼ることは少なからず発生するでしょう。</p>\n<h2 id=\"パッケージマネージャは不要になるか\" style=\"position:relative;\"><a href=\"#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%81%AF%E4%B8%8D%E8%A6%81%E3%81%AB%E3%81%AA%E3%82%8B%E3%81%8B\" aria-label=\"パッケージマネージャは不要になるか permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>パッケージマネージャは不要になるか？</h2>\n<p>Import maps によっていくつかのニーズを満たすことはできそうだと思いますが、これさえあれば万事解決ってわけではなく、まだ問題は残っていると思います。<br>\nImport maps を利用するツールやユーザがもっと増えユースケースやフィードバックが増えれば、また変わった体験になっていくのかなと思いました。</p>\n<p>個人的に面白い仕様だと思いますし、正しく使えば開発体験が向上すると思うので、もっと使い込んでみます。</p>\n<h2 id=\"さいごに\" style=\"position:relative;\"><a href=\"#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB\" aria-label=\"さいごに permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>さいごに</h2>\n<p>Deno のアップデート通知やイベント告知、技術書展に出品する denobook の執筆などの Deno に関するコミュニケーションは deno-ja の Slack にて行われています。参加は以下の資料をご参照下さい。</p>\n<blockquote>\n<p>— <a href=\"https://scrapbox.io/deno-ja/Slack%E3%81%AE%E5%8F%82%E5%8A%A0%E6%96%B9%E6%B3%95\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Slack の参加方法 - deno-ja</a></p>\n</blockquote>","timeToRead":11,"frontmatter":{"title":"Import mapsでDenoのパッケージのバージョンを管理したい","tags":["TypeScript","Deno"],"date":"December 07, 2019","featuredImage":null}}},"pageContext":{"slug":"/package-management-in-deno-with-import-map/","previous":{"fields":{"slug":"/jsconf-jp-2019/"},"frontmatter":{"title":"JSConf JP 2019スタッフ参戦後記","tags":["JavaScript","JSConf","Community"]}},"next":{"fields":{"slug":"/webegg-summary-2019/"},"frontmatter":{"title":"WEB EGG 2019年アクセス解析＋人気記事の振り返り","tags":null}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}