Chapter 10

依存モジュールを一元管理しよう

uki00a
uki00a
2021.05.05に更新

例えば、std/path/mod.tsのv0.94.0が2つのファイルからimportされていたとします。

a.ts
import * as path from "https://deno.land/std@0.94.0/path/mod.ts";
b.ts
import * as path from "https://deno.land/std@0.94.0/path/mod.ts";

std/path/mod.tsをv0.95.0にアップデートしたいとします。

この場合、a.tsb.tsの両方のファイルのimport文を修正する必要があります。

2ファイルくらいなら問題ないですが、こういったimport文が数百・数千といったファイルに分散していると、アップデートがとても大変です。

もし、一部のファイルで更新が漏れていたりすると、バグの原因にもなりかねません。

この章では、こういった問題に対処するために、依存モジュールを一元管理する方法について2つほど紹介します。

deps.ts

この手法では、deps.tsという名前のファイルを用意し、すべての依存モジュールをそこで管理します。

例えば、次のような内容でdeps.tsというファイルを用意します。

deps.ts
export * as path from "https://deno.land/std@0.94.0/path/mod.ts";
export { ensureDir } from "https://deno.land/std@0.94.0/fs/ensure_dir.ts";
export { default as marked } from "https://cdn.skypack.dev/marked@1.2.7?dts";

依存モジュールを利用する際は、必ずこのdeps.ts経由でimportします。

import { ensureDir, path } from "./deps.ts";

await ensureDir(path.resolve("dist"));

こうすることで、例えばstd/path/mod.tsをv0.95.0にアップデートしたい場合、deps.tsのみを編集するだけで済みます。

これにより、依存関係の管理の手間が軽減されます。

Import maps

Import mapsはWICGで提案されている機能であり、Denoはこの機能をサポートしています。

Import mapsを利用したいときは、次のような内容のJSONファイルを用意します。

import_map.json
{
  "imports": {
    "std/path": "https://deno.land/std@0.94.0/path/mod.ts",
    "std/fs/ensure_dir": "https://deno.land/std@0.94.0/fs/ensure_dir.ts",
    "marked": "https://cdn.skypack.dev/marked@1.2.7?dts"
  },
  "scopes": {}
}

このようなファイルを用意しておくことで、アプリケーションからは以下のようにして依存モジュールを読み込むことができます。

import * as path from "std/path";
import { ensureDir } from "std/fs/ensure_dir";
import marked from "marked";

DenoにImport mapsを認識してもらうためには、--importmapオプションでImport mapsファイルへのパスを指定する必要があります。

$ deno run --importmap import_maps.json sample.ts

これにより、Denoは指定されたImport mapsファイルの内容を元にimport文の解決を行うようになります。

deps.tsと同様に、std/path/mod.tsをv0.95.0にアップデートしたい場合、import_maps.jsonのみを編集するだけで済みます。

deps.tsとImport mapsのどちらを使えばいいの?

用途に応じて使い分けるのがよいと思います。

  • 自分でサードパーティモジュールを書くときはdeps.tsで管理する
  • アプリケーションの依存関係はImport mapsで管理する

理由

Import mapsは1つのDenoプロセスにつき1ファイルしか指定できません。

そのため、サードパーティモジュールを書く際の依存関係の管理には向きません。

ですので、Import mapsはアプリケーション開発をするときのみ使用するようにしましょう。

ポイント

  • deps.tsやImport mapsを使用して、依存モジュールを一元管理しましょう。
  • 用途に応じてdeps.tsとImport mapsを使い分けましょう。