サードパーティのコードにリンクする

Getting Started セクションで Deno が URL からスクリプトを実行できることを見てきました。 ブラウザの JavaScript と同じく Deno も URL から直接ライブラリをインポートできます。 以下の例ではアサーションライブラリを URL でインポートしています。

test.ts

import { assertEquals } from "https://deno.land/std@$STD_VERSION/testing/asserts.ts";

assertEquals("hello", "hello");
assertEquals("world", "world");

console.log("Asserted! ✓");

以下を実行してみてください。

$ deno run test.ts
Compile file:///mnt/f9/Projects/github.com/denoland/deno/docs/test.ts
Download https://deno.land/std@$STD_VERSION/testing/asserts.ts
Download https://deno.land/std@$STD_VERSION/fmt/colors.ts
Download https://deno.land/std@$STD_VERSION/testing/diff.ts
Asserted! ✓

このプログラムに --allow-net フラグを与えくてもネットワークにアクセスできた点に留意してください。 ランタイムはインポートをダウンロードしてディスクにキャッシュする特別なアクセス権を持っているからです。

Deno は環境変数 DENO_DIR で指定された特別なディレクトリにリモートのインポートをキャッシュします。 DENO_DIR が指定されていなければデフォルトでシステムのキャッシュディレクトリにキャッシュします。 二回目以降の実行ではダウンロードは行われません。 プログラムが変更されていなければ再コンパイルも行われません。 デフォルトのディレクトリは以下のとおりです。

  • Linux/Redox: $XDG_CACHE_HOME/deno または $HOME/.cache/deno
  • Windows: %LOCALAPPDATA%/deno (%LOCALAPPDATA% = FOLDERID_LocalAppData)
  • macOS: $HOME/Library/Caches/deno
  • 何かがうまくいかなければ、$HOME/.deno にフォールバックします

FAQ

モジュールのバージョンを指定してインポートするにはどうすればよいでしょうか?

URL の中にバージョンを指定してください。たとえば、実行されるコードを完全に指定した URL は https://unpkg.com/liltest@0.0.5/dist/liltest.js のようになります。

インポートする URL をあちこちに書くのは大変です

いくつもある URL の一つが微妙に違うバージョンのライブラリにリンクしていたらどうなるでしょうか?

巨大なプロジェクトであちこちに散らばっている URL をメンテナンスするのはエラーのもとになりませんか?

解決策としては、外部ライブラリを中央の deps.ts ファイルにインポートして再エクスポートすることです(Node の package.json ファイルと同じ目的で機能します)。 たとえば、上記のアサーションライブラリを巨大なプロジェクトで使いまわしたいとします。 ライブラリを使うたびに "https://deno.land/std@$STD_VERSION/testing/asserts.ts" と書くよりは、deps.ts ファイルを作ってサードパーティのコードをそこからエクスポートするようにできます。

deps.ts

export {
  assert,
  assertEquals,
  assertStrContains,
} from "https://deno.land/std@$STD_VERSION/testing/asserts.ts";

プロジェクト内で一貫して deps.ts からインポートすれば、同じ URL を何度も参照するのを避けられます。

import { assertEquals, runTests, test } from "./deps.ts";

この設計は、パッケージ管理ソフトウェアや中央集権的なコードリポジトリや不必要なファイル形式によって生み出されるさまざまな複雑さを迂回できます。

変更しうる URL をどのように信頼できますか?

ロックファイルを使うことにより(コマンドラインの --lock フラグを指定します)、URL から取得するコードが最初の開発時から変わらないことを保証できます。 詳しくはここを参照してください。

でも、URL のホストが消えるとどうなりますか?ソースが利用できなくなります

上記と同じように、これは どんな リモート依存システムにおいても直面する問題です。 外部サーバーに依存すると開発時には便利ですが、本番環境では当てになりません。 製品版のソフトウェアは常に依存関係をベンダーすべきです。 Node では node_modules をソース管理に含めることでこの問題を解決します。 Deno では $DENO_DIR の向き先をプロジェクトのローカルディレクトリに指定しておき、同様にソース管理下に置くことで解決できます。

# Download the dependencies.
DENO_DIR=./deno_dir deno cache src/deps.ts

# Make sure the variable is set for any command which invokes the cache.
DENO_DIR=./deno_dir deno test src

# Check the directory into source control.
git add -u deno_dir
git commit