🔩

dntを使ってDenoのコードからnpmパッケージを作る

2023/07/10に公開

先日こんなツイートを見かけました。
曰く、ESM形式のモジュールをnpmパッケージに変換してくれるようです。
https://twitter.com/deno_land/status/1676264059585560578

自身でメンテナンスしているnpmパッケージでこれを試してみたのでレポートしてみます。

題材となるnpmパッケージについて

esbuild-gas-pluginを題材にしてみました。
Node.js向けのコード(index.ts)と、Deno向けのコード(mod.ts)がありました。
ほぼ同じ実装なので、どちらかのコードに一本化できると嬉しいですね。
https://github.com/mahaker/esbuild-gas-plugin/tree/0.6.0

さっそく使ってみる

というわけで、dntを使ったビルドスクリプトを書いていきましょう。
最終形はこちらです。

このスクリプトを実行すると、npmディレクトリに成果物が出力されます。

$deno run -A build.ts

npmディレクトリの中を見ると、ESMのコード(npm/esm)とCJSのコード(npm/script)、package.jsonが配置されています。
このディレクトリでnpm publishすると、npmに公開することができます。

使ってみたメモ

  • 型定義ファイルを生成するには、declaration: 'separate'を指定する
  • npmパッケージにはshimを同梱するので、サイズがでかくなりがち(npm packして確認)
    • deno_std以外のshimの設定はここを参照してください
  • npmパッケージに必要な依存関係をmappingsで設定する必要があり、若干冗長かも

まとめ

dntを使ってNode.js向けのコードを生成できるようになりました。
Denoのコードに一本化できたのでいい感じですね。

少ないケースとは思いますが、同じような環境で開発している方はぜひ参考にしてみてください!

Discussion