10
2

More than 1 year has passed since last update.

dnt というツールについて

Last updated at Posted at 2021-12-02

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 を紹介しました。

10
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
2