📦

JSRが!公開された!

2024/03/01に公開

最近、JSRというワードが話題になっています。
JSRは、JavaScript Registryの略で、次世代JavaScript/TypeScriptのパッケージレジストリらしいです。

npmと何が違う?

npmは、Node Package Managerの略で、その名の通り、Node.js用に開発されたパッケージマネージャー、また、そのパッケージマネージャが使うレジストリです。
その利便性から、Node.js以外の、ブラウザーやほかのランタイムでも用いられています。
例えばsvelteはブラウザ用のパッケージですが、Node.jsのパッケージマネージャーnpmのレジストリに登録されています。

Node.jsのために作られことから、以下のような欠点があります。

  • TypeScript非対応
    • TypeScriptファイルをそのままpublishしたり、ビルドしてpublishすることはできますが、スマートではありません。
  • ESMに追いついていない場合がある
    • CJSのパッケージはたくさんあります

一方、JSRは以下のような特徴があります。

  • ピュアなTypeScriptサポート
    • TypeScriptをそのままpublishできるっぽいです
    • Node.jsなど用に.d.tsも自動で作成してくれます
  • ESM
    • ESMパッケージしか公開できないので、モダンです。

また、決定的な違いとして、役割の違いがあげられます。
npmはパッケージマネージャ/レジストリです。一方JSRはレジストリです。パッケージマネージャの役割を持っていません。

例えば、Node.jsでパッケージ@std/assertをインストールしたいとき、以下のようなコマンドを用います。

npx jsr add @std/assert

「なんだ、パッケージマネージャじゃん」って思ったかもしれません。しかし、このコマンドはパッケージマネージャではありません。

理解するために、手順を見てみます。
まず、コマンド実行で、package.jsonが、以下のようになります。

  "dependencies": {
    "@std/assert": "npm:@jsr/std__assert"
  }

次に、npmなら.npmrc、Bunならbunfig.tomlなどに@jsr:https://npm.jsr.ioに解決するコードを追加します。
最後に、npm iで依存関係をインストールして完成のようです。

jsrコマンドは、npmを用いるときにいい感じにjsrを使えるようにしてくれるラッパーなのです。パッケージマネージャーではありません。
ちなみに、https://npm.jsr.ioはJSRパッケージをnpm用に変換して配信するサーバーのようです。

Denoのために作られた

JSRは、Denoのために作られたらしいです。
次世代https://deno.land/x/*的な立ち位置です。

そのため、DenoにもJSR用のさまざまな機能が搭載されています。

jsr: import

import * as package from 'jsr:@xxx/xxx@version'

のようにしてJSRパッケージをダウンロードして使えます。

deno add *

上のものだと、deno.land/xなどのようにバージョン管理が難しいです。

// deno.json
{
  "imports": {
    "@std/assert": "jsr:@std/assert@^0.218.2"
  }
}

このように、importMapを使ってdeno.land/xのようにできます。
これを簡略化するのがdeno addで、

deno add @std/assert

でいけちゃいます。

deno publish

deno.json

{
  "name": "@scope/package",
  "version": "1.0.0",
  "exports": "./mod.ts"
}

deno publishでいいんです!簡単!
JSRに公開できちゃう!

その他の機能

  • JSDOCから自動でドキュメント生成
  • パッケージスコアリング
  • すごいコンパクトなGitHub Actionsからの自動publish

最後に

JSR、めっちゃやばそうです。
分散型じゃないのがちょっとなーって思いました。
何かpublishしてみたいです

参考

https://myedgetech.com/jsr-new-javascript-package-registry/
https://scrapbox.io/uki00a/jsr
https://jsr.io/docs/using-packages

リンク

https://jsr.io
https://github.com/jsr-io/jsr

GitHubで編集を提案

Discussion