Deno (ディノ) Advent Calendar 3日目の記事です。
今日は dnt
というツールについて紹介します。
dnt
とは
dnt
は Deno 向けのソースコードを Node.js 向けのソースコードに変換するためのツールです。Deno のコアチームメンバーである、David Sherret さんが主に開発しています。GitHub の denoland org 以下にホストされており、位置付け的には Deno 公式の Deno to Node.js の変換ツールです。
使い方
次のような内容の build_npm.ts
を用意します。
import { build } from "https://deno.land/x/dnt/mod.ts";
await build({
entryPoints: ["./mod.ts"],
outDir: "./npm",
package: {
// Node.js package としての package.json の内容を書く
name: "your-package",
version: Deno.args[0],
description: "Your package.",
license: "MIT",
repository: {
type: "git",
url: "git+https://github.com/username/package.git",
},
bugs: {
url: "https://github.com/username/package/issues",
},
},
});
// ビルド後処理。npm パッケージに含めたいファイルをコピーする
Deno.copyFileSync("LICENSE", "npm/LICENSE");
Deno.copyFileSync("README.md", "npm/README.md");
// テストで使いたいファイル/ディレクトリがある場合などもここでコピーする
// ...
これを
deno run -A build_npm.ts
と実行すると、npm
ディレクトリ以下に Node.js 向けに変換されたソースコードが生成されます。
テストコードがある場合は、それも Node.js 環境向けのテストコードに変換され、テストの実行まで行ってくれます。(fixture ディレクトリなどがある場合は、build_npm.ts の最後の部分で適切なパスにコピーしましょう。)
dnt
は型定義ファイルも .d.ts ファイルとして自動的に出力してくれます。Deno のソースコード内に書いた型定義が自然に Node.js 環境からも使えるようになります。
仕組み
URL import で外部ドメインに依存している部分についてはファイルがローカルにダウンロードされ、path がつながるように import を書き直してくれます。
Deno 名前空間は deno.ns という Deno 名前空間の shim を実装している npm モジュールがあり、そちらの機能の呼び出しに置き換えてくれます。(deno.ns 自体も denoland org で開発されています。)
このツールの使い所
すでに Deno 用のツールを作っている場合は、dnt
を使って単純に Node.js サポートを追加することが出来ます。
また、Deno と Node.js 両方に向けたライブラリを書きたい場合に、一旦 Deno で書いて dnt
で変換する事で、両対応のモジュールを作る事ができます。
dnt
は umd と esm のコード両方を自動的に出力できるため、ESM と CJS 両対応したい場合なども使うメリットがあります。
採用例
license_checker
license_checker は以前に自分が作った、ソースコードのライセンスヘッダーがきちんと書かれているかをチェックするための CLI ツールです。もともとは Deno 向けに書いたツールでしたが dnt
で変換をして、Node.js からも使えるようになりました。 @kt3k/license-checker に publish されています。
discordeno
Deno 界隈で人気のある Discord API library です。元々は Deno 用のツールでしたが、dnt
で変換して、npm からも discordeno
という名前で使えるようになっています。
dragjs
dragjs はドラッグ関連の処理を実装したフロントエンド向けのライブラリです。npm からの利用をメインに想定しているツールのようですが、実装は Deno に移行していて、dnt
で変換する事で npm に publish しています。
sidewind
まだマージされていませんが、sidewind という frontend 向けライブラリも dnt
を使って開発環境を Node.js から Deno に移行作業中です。 https://github.com/survivejs/sidewind/pull/44
まとめ
今日は Deno のコードから Node.js のコードを出力できるツールの dnt
を紹介しました。