Deno 新開發的 JSR,一個新的 JS 註冊表,支持 TS 併兼容 np

前言

年前發現 Deno 搞了一個叫 JSR[1] 的東西,全稱是 JavaScript Registry,一個新的 JS 註冊表,像 npm 一樣。出於好奇加入了 waitlist,最近收到了郵件可以用了,今天試了一下,寫篇文章記錄。

Why JSR?

首先看了下文檔的 Why JSR[2] 部分,我還是比較認同的,總結一下:

爲什麼有了 npm 還要做 JSR?

JSR 現在的特點:

在 JSR 上發佈第一個包

接下來我要在 JSR 上發佈我的第一個包。

首先,創建 mod.ts 文件,寫入以下代碼:

/**
 * Returns true if the number is odd, false otherwise.
 * @param num The number to check.
 * @returns True if the number is odd, false otherwise.
 * @example
 * isOdd(3); // true
 * isOdd(4); // false
 */
export function isOdd(num: number): boolean {
  return num % 2 !== 0;
}

上面我們用 TS 寫了一個 isOdd 函數,有類型,有註釋,有 example。

然後我們創建 deno.json文件,根據文檔上說,應該是 jsr.json,這是描述當前包的 metadata 的文件,類似 package.json。

但是好像有 bug,執行 deno publish,報錯找不到 deno.json。好吧,這裏我們就先用 deno.json

{
  "name""@liruifengv/is-odd",
  "version""1.0.0",
  "exports""./mod.ts"
}

上面就是 deno.json 的內容,exports 是入口文件,name 這裏分兩個部分,scope 和 包名,這裏我用了我的用戶名 @liruifengv,scope 類似 npm 的組織,需要在 jsr.io 上創建,目前試用階段,每個賬號最多創建 3 個 scope。

接下來執行 deno publish。會跳轉到 JSR 的網站上,再次確認 scope 和包名,然後點擊 Create。

發佈中發佈授權

再次點擊 Approve 授權,就發佈成功啦。

發佈成功

在 jsr.io 查看剛發佈的包

查看我剛發佈的 is-odd[3] 包。

這是根據 mod.ts 自動生成的文檔。

is-odd 文檔

在 Deno 中使用

在 Deno 項目中使用剛發佈的包。

創建一個 example.ts 文件,寫入以下代碼:

import { isOdd } from "jsr:@liruifengv/is-odd@1";

console.log(isOdd(1))

然後執行 deno run example.ts,輸出 true,成功。

在 Node 中使用

在 Node 項目中使用剛發佈的包。

創建一個 node-example 文件夾,執行 npm init -y,初始化一個 Node 項目。

創建 .npmrc 文件,寫入以下內容:

@jsr:registry=https://npm.jsr.io

解釋一下,目前只有 Deno 原生支持 JSR。所以 JSR 做了一個 npm 兼容層 [4],指定 @jsr 下的包從 JSR 註冊表中獲取。

運行以下命令安裝:

npm install @jsr/liruifengv__is-odd@1

我們在 JSR 上的包叫做 @liruifengv/is-odd,轉換過來就是 @jsr/liruifengv__is-odd。加入了 @jsr 前綴,scope 用 __ 代替 /

創建個 node-example.js 文件,寫入以下代碼:

import { isOdd } from "@jsr/liruifengv__is-odd";

console.log(isOdd(1))

執行 node node-example.js,輸出 true,成功。

打開 node_modules 找到了 @jsr/liruifengv__is-odd 包,裏面有 mod.js 和 mod.d.ts。果然是自動轉換了。

總結

Node 的成功很大程度上是因爲 npm,npm 上現在有兩百多萬個包。JSR 的願景非常的好,希望 JSR 能夠成功,推動 JS 的生態,目前看來還有很多路要走。

引用鏈接

[1] JSR: https://jsr.io/
[2] Why JSR: https://jsr.io/docs/why
[3] is-odd: https://jsr.io/@liruifengv/is-odd
[4] npm 兼容層: https://jsr.io/docs/npm-compatibility

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/k7pNE5wOWtnhEb-XX3Kdng