まくろぐ
更新: / 作成:

Deno でのコーディングは、Node.js とほぼ同様の書き方で行えますが、いくつか押さえておきたいポイントがあるのでまとめておきます。

Web Platform APIs

  • Web ブラウザーで使える JavaScript の標準 API、例えば fetch API や、それに付随する RequestResponse インタフェースをデフォルトで使用することができます。
  • これは、Chrome や Firefox などのブラウザ上で動作する JavaScript で使える API と同様の API を使えるということです。もちろん、Deno の実行環境はブラウザではないので、セキュリティモデルなどに微妙に違いがありますが、インタフェースが統一されているので学習コストが低いです。

Web Platform API の一覧は、こちらを参照してください。

Deno APIs / Built-in APIs

  • JavaScript 標準ではない、組み込みの API (Deno API) は、Deno という namespace 以下のメソッド/プロパティとして提供されています。Deno が提供している API ということが一目でわかります。下記は、コマンドライン引数を参照するときの例です。
    Deno.argv[0]     // Deno の場合
    process.argv[0]  // Node の場合
    
  • Deno API 呼び出し時に発生するエラーは、Deno.errors namespace に定義されています。
  • Deno API には、まだ安定版 (stable) になっていないものがあり、それらを使う場合は、deno run 実行時に --unstable オプションを指定します。

Deno namespace の API の一覧は、こちらを参照してください。

Standard Library (standard modules)

  • Deno は Deno namespace 以下のグローバルな Deno API 以外にも、様々な標準ライブラリ(std モジュール)を提供しています。
  • std モジュールは、使用時に明示的なインポートが必要です(一方で、Deno API は何もインポートせずに呼び出せます)。
  • Deno の std モジュールは、Golang の std ライブラリ を参考に実装されています。

Deno の標準モジュールの一覧は、こちらを参照 してください。

npm モジュール

  • npm モジュールは、npm specifier というフォーマット (npm:xxx) でインポート可能です。さらに、型定義が DefinitelyTyped で提供されている場合は、コメントで @deno-types ディレクティブを使って指定できます。
    // @deno-types="npm:@types/express@^4.17";
    import express from "npm:express@^4.17";
    const app = express();
    
  • npm モジュールのインポート方法として、esm.shSkypack CDN といった CDN を利用する方法もあります。
    import React from "https://esm.sh/react@~16.13.0";
    import React from "https://cdn.skypack.dev/react@~16.13.0";
    

deno.land レジストリ

Deno ランタイムに組み込まれていないモジュールは、deno.land レジストリで管理されています。 下記モジュールが重要です。

  • deno.land/std
    • Deno の標準ライブラリ (Deno standard library) です。
    • 使用例:
      import { copy } from "https://deno.land/std@0.168.0/fs/copy.ts";
      
  • deno.land/x
    • 3rd パーティモジュールはここで管理されています。
    • 実際には、コードがある場所にリダイレクトしているだけです。
  • deno.land/std/node
    • 従来の Node API をエミュレートするためのモジュールが、標準ライブラリとして提供されています。例えば、std/node/global.ts は、Node のグローバル変数 process を提供します。
    • (2023-12 追記)node:... 形式によるインポートがサポートされたことにより、Node.js 互換レイヤーである std/node ライブラリは削除されました。

mod.ts と deps.ts

mod.ts

モジュールのエントリポイントとなるファイル名には、慣例として mod.ts が使用されます。これは Rust にインスパイアされたものです。 逆に、index.ts のような名前は避けるべきだとされています。

deps.ts

アプリケーションがインポートするモジュールを一箇所でまとめて定義しておきたい場合は、deps.ts という名前のファイルが使われます。 このファイルで、アプリケーションが使用するメソッドを re-export しておき、他のファイルからはそれをインポートして使用します。 こうすることで、アプリケーション内で使用するモジュールのバージョンを揃えることができます。

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

同様に、開発中のみ使用する依存関係は、dev_deps.ts という名前のファイルにまとめるのが慣例です。

関連記事

まくろぐ
サイトマップまくへのメッセージ