モジュールのインポートとエクスポート

この節で学ぶこと

  • import を使うとモジュールを導入し使用できます。ローカルファイルシステムにあってもリモートにあってもどこにあるモジュールでもインポートできます。
  • インポートは URL かファイルシステムのパスで指定します
  • export を使うとモジュールの一部を指定して、そのモジュールをインポートしたいユーザーがアクセスできるようになります

概要

Deno はデフォルトでモジュールのインポート方法を標準化しています。JavaScript でも TypeScript でも ECMAScript 6 の import/export 標準仕様に従ってインポートできます。

モジュール解決にはブラウザに似た方法を採用しています。とはつまり、ファイル名は完全な形で指定する必要があるということです。ファイル拡張子は省略できませんし、index.js の例外的な挙動もありません。

import {
  add,
  multiply,
} from "./arithmetic.ts";

依存関係も直接インポートできます。パッケージ管理が間に入ることはありません。 ローカルモジュールとリモートモジュールは全く同じやり方でインポートできます。 以下の例でお見せするとおり、ローカルでもリモートでもモジュールのインポートに全く同じ機能性が提供されています。

ローカルのインポート

次の例では add 関数と multiply 関数がローカルの arithmetic.ts モジュールからインポートされています。

Command: deno run local.ts

/**
 * local.ts
 */
import { add, multiply } from "./arithmetic.ts";

function totalCost(outbound: number, inbound: number, tax: number): number {
  return multiply(add(outbound, inbound), tax);
}

console.log(totalCost(19, 31, 1.2));
console.log(totalCost(45, 27, 1.15));

/**
 * Output
 *
 * 60
 * 82.8
 */

リモートのインポート

上のローカルインポートの例では add メソッドと multiply メソッドがローカルに保存された arithmetic モジュールからインポートされていました。同じ機能性がリモートモジュールから add メソッドと multiply メソッドをインポートするときにも提供されます。

この例では Rambda モジュールがバージョン番号付きで参照されています。 JavaScript モジュールが TypeScript モジュールに直接インポートされている点にも留意してください。 Deno ではこういったことが問題なく行なえます。

Command: deno run ./remote.ts

/**
 * remote.ts
 */
import {
  add,
  multiply,
} from "https://x.nest.land/ramda@0.27.0/source/index.js";

function totalCost(outbound: number, inbound: number, tax: number): number {
  return multiply(add(outbound, inbound), tax);
}

console.log(totalCost(19, 31, 1.2));
console.log(totalCost(45, 27, 1.15));

/**
 * Output
 *
 * 60
 * 82.8
 */

エクスポート

上のローカルインポートの例では add 関数と multiply 関数がローカルに保存された arithmetic モジュールからインポートされていました。これを可能にするためには、arithmetic モジュールに保存された関数がエクスポートされている必要があります。

そのためには、以下でお見せするように export キーワードを関数シグニチャの前に付けるだけです。

/**
 * arithmetic.ts
 */
export function add(a: number, b: number): number {
  return a + b;
}

export function multiply(a: number, b: number): number {
  return a * b;
}

どんな関数、クラス、定数、変数も、外部モジュールからアクセスできるようにするにはエクスポートする必要があります。export キーワードを宣言に前に付けるか、あるいはファイルの下部に export 文を書くことによりエクスポートできます。