JSRが!公開された!
最近、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してみたいです
参考
リンク
Discussion