Deno 新開發的 JSR,一個新的 JS 註冊表,支持 TS 併兼容 np
前言
年前發現 Deno 搞了一個叫 JSR[1] 的東西,全稱是 JavaScript Registry,一個新的 JS 註冊表,像 npm 一樣。出於好奇加入了 waitlist,最近收到了郵件可以用了,今天試了一下,寫篇文章記錄。
Why JSR?
首先看了下文檔的 Why JSR[2] 部分,我還是比較認同的,總結一下:
爲什麼有了 npm 還要做 JSR?
-
• ESM 模塊現在已經成爲標準,CommonJS 正在逐漸被取代。
-
• 越來越多的 Node 和瀏覽器之外的 JS 運行時出現,以 Node 爲中心的包註冊表將會不再適用。
-
• TS 目前已經成爲事實標準,需要一個對 TS 支持更好的現代化註冊表。
JSR 現在的特點:
-
• 原生 TS 支持。開發者可以直接上傳 TS 代碼,對於像 Deno 這樣原生支持 TS 的運行時,會直接使用 TS 文件。對於 Node 這樣的缺乏 TS 原生支持的環境,JSR 會將代碼自動轉換爲 JS 並生成
.d.ts
,不需要開發者配置額外的構建步驟。同時在 JSR 的網站上自動根據 TS 類型和註釋生成文檔。 -
• 只支持 ESM。不支持 CommonJS。
-
• 跨運行時支持。JSR 不是爲 Node 或 Deno 而生,而是爲所有 JS 運行時而生。
-
• 兼容 npm。JSR 做了個 npm 兼容層,可以很方便地在 Node 項目中使用。
在 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
自動生成的文檔。
在 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