Node.jsでDenoの標準モジュールセットをlodash的に使うと便利かもしれない

DenoからNode.js向けのパッケージを使うという記事は山ほど見るが、Node.js(や、バンドラーを噛ませたブラウザー環境)からDeno向けのパッケージを使うという記事はあまり見かけないので書いておく。

うまく使うとそこそこ便利だと思う。

Denoの標準モジュールセット

Denoはコアチームによって監査されDenoで動くことが保証された標準モジュールセットを提供している

Denoでは、例えばこんな感じで標準モジュールセットを使うことができる。

import { copy } from "https://deno.land/std@0.94.0/fs/copy.ts";

copy("log.txt", "log-old.txt");

Denoの標準モジュールセットには比較的高レイヤーなツールも含まれている。例えば std/datetime には format という関数が含まれていて、Date型のオブジェクトを好みの形式の文字列に変換できる。Node.jsは標準ではこのような機能は持っていないため、自作するか、date-fnsmoment.js といったサードパーティ製のライブラリを使うことになる。Denoの標準モジュールセットからは、他にも csv や dotenv、オブジェクト比較の equal など、「まぁ自分で作ったりサードパーティのライブラリ入れたりしても良いんだけど、自分用のツールをサクッと作りたいだけなのに面倒だなぁ」的な機能が多数提供されていて、良い感じである。

Denoの標準モジュールセットはDenoの公式ドキュメント内のサンプルコードに必ずと言って良いほど出てくるので、Denoが生きている間は突然提供が停止される可能性は極めて低いだろうし、「コアチームによって監査」されているということなのでセキュリティリスクも高くは無いだろう。

しかも、Denoの標準モジュールセットのほとんどはNode.jsからも使えるようになっている(Deno独自の機能に依存しているものが少ない)。

JSR

話は変わって JSR。JSRはJavaScriptライブラリのレジストリ(JavaScript Registry)で、Denoが提供している。2024年3月1日にパブリックベータになったので、今では誰でも使うことができる。

JSRはnpmと連携して使うことができる。JSR自体はパッケージ管理システムではなく、単純な「公開パッケージ置き場」なので、npmに対して「@jsrから始まるパッケージはJSRから取りに行ってくださいね」的なことを教えてやれば、npmは素直にJSRからパッケージを取ってきてくれるようになる。さらに、この設定すらも自前で書く必要は無く、JSRが提供している jsr というパッケージを npm 経由で使うことで、ユーザーは何も考えずに JSR からパッケージを取得して npm の依存関係に追加することができる。

npx jsr add @luca/flag
# .npmrc に勝手に JSR の設定が追加される
# package.json や package-lock.json も npm install したときと同様に更新される

JSR と Denoの標準モジュールセット

JSRからは、Denoの標準モジュールセットも配信されている。

npx jsr add @std/datetime
import { format } from "@std/datetime";

const now = new Date();
console.log(format(now, "yyyy/MM/dd HH:mm:ss"));

これによって、「実行環境はNode.jsなんだけど、Denoの便利な標準モジュールセットを使いたいんだよなぁ」という欲求が満たされる。

これまで、Denoの標準モジュールセットのような「ちょっとした便利ツール」としては lodash や Radash、関数型プログラミングが好きな人には Ramda.js あたりが使われてきた。しかし lodash は2016年から開発が止まっているし、他のツールも安心安全とは言えない。

JSRの登場によってDenoの標準モジュールセットをあらゆる環境から使えるようになったので、この問題が現時点では解決したと言えるかもしれない。