Deno でのコーディングは、Node.js とほぼ同様の書き方で行えますが、いくつか押さえておきたいポイントがあるのでまとめておきます。
Web Platform APIs
- Web ブラウザーで使える JavaScript の標準 API、例えば fetch API や、それに付随する Request や Response インタフェースをデフォルトで使用することができます。
- これは、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.sh や Skypack 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 しておき、他のファイルからはそれをインポートして使用します。
こうすることで、アプリケーション内で使用するモジュールのバージョンを揃えることができます。
同様に、開発中のみ使用する依存関係は、dev_deps.ts
という名前のファイルにまとめるのが慣例です。