Node 之父新作:一個全新的 NPM 下載源工具!
在前端開發(fā)中,使用第三方 npm 模塊可以顯著提高我們的工作效率。我們既可以創(chuàng)建并分享自己的模塊到 npm 倉庫,供其他開發(fā)者使用,也可以從倉庫中獲取他人的模塊以加快開發(fā)進程。
然而,在中國大陸,由于特定的網(wǎng)絡(luò)限制,從 npm 倉庫下載模塊經(jīng)常異常緩慢,甚至直接失敗。一個常見的解決方法是切換到如淘寶或騰訊等鏡像源。
在離開 Node 官方團隊后,“Node 之父”開發(fā)了一個新的 JavaScript 運行時環(huán)境 Deno,該環(huán)境在多個方面對 Node 進行了改進。最近,針對 npm 倉庫中的長期問題,他提出了一個名為 JSR(JS 下載源)的全新方案。
“這不是另一個 npm 包管理器!”“Node 之父”這樣強調(diào)。讓我們通過查閱“Node 之父”在 Deno 官方博客上的文章,了解一下這個與 npm 倉庫競爭的新項目 JSR。
在最近幾年,新的包管理器如yarn和pnpm已經(jīng)增強了npm包的下載體驗。然而,作為JavaScript生態(tài)系統(tǒng)基石的npm注冊源本身的發(fā)展幾乎處于停滯狀態(tài),其最近一次顯著更新是幾年前引入的“files”標(biāo)簽。盡管JavaScript語言發(fā)展迅速,其分發(fā)模式卻顯得相對落后。
在我創(chuàng)建Node的時代,JavaScript尚無統(tǒng)一的模塊系統(tǒng),導(dǎo)致npm注冊源及Node默認采用require語法和CJS模塊,這一模塊系統(tǒng)無法在瀏覽器中使用,具有根本性缺陷。大約在2015年,JavaScript采納了ES模塊和import語法。盡管如今大多數(shù)JavaScript代碼都采用ES模塊,其分發(fā)路徑仍然復(fù)雜,特別是在涉及到TypeScript時。
為解決這些問題,JSR應(yīng)運而生,它不僅僅是另一個npm包管理器,而是一種旨在改變JavaScript和TypeScript代碼在服務(wù)器、瀏覽器和各種工具間共享方式的革命性下載源。JSR通過簡化開發(fā)者長期面臨的復(fù)雜性,從根本上改善了代碼的分發(fā)方式。它專注于ES模塊,并優(yōu)先支持TypeScript,消除了繁瑣的package.json配置和tsconfig編譯選項的困擾。
JSR還通過包評分系統(tǒng)鼓勵最佳實踐,類似于Dart社區(qū)在pub.dev中的做法,為包含詳盡JSDoc文檔的每個導(dǎo)出符號的包提供更高的評分。與Go和Rust等其他現(xiàn)代編程生態(tài)系統(tǒng)一樣,JSR提供開箱即用的自動化文檔生成功能。
JSR本質(zhì)上是一個新的registry,不僅僅是npm的另一個客戶端。它不要求開發(fā)者放棄現(xiàn)有的npm內(nèi)容或完全切換到一個全新的JS模塊生態(tài),而是旨在補充現(xiàn)有的npm注冊源。它允許依賴npm包,專為TypeScript優(yōu)化,并且只支持ES模塊。適用于Deno和基于npm的項目如Node、Bun等,且完全開源免費。
你可以像這樣安裝軟件包:
# 基于 npm:
npx jsr add xxx
# 基于 deno:
deno add xxx
JSR包能夠集成到依賴npm的現(xiàn)有軟件系統(tǒng)中,因為JSR自身作為一個npm下載源分發(fā)與npm兼容的tarball文件。這使得JSR包能夠被包括在任何使用npm、yarn或pnpm的項目中,并且可以與私有下載源無縫集成。這種方式的npm tarball分發(fā)被認為是非常優(yōu)秀的。
在Deno環(huán)境中,我們特別重視安全性,把它作為JavaScript開發(fā)的首要考量。雖然沒有下載源能夠完全監(jiān)控所有發(fā)布的代碼,但JSR通過提高發(fā)布者的透明度和確保發(fā)布過程的安全性,提供了一種更為安全的方法。
JSR還通過整合OIDC令牌和GitHub Actions,利用供應(yīng)鏈安全技術(shù)來創(chuàng)建高級的、可驗證的代碼來源證明,并將其保存在Sigstore中。這樣不僅保證了代碼的真實性,也加強了對開發(fā)者責(zé)任的信任和確立。
JavaScript作為廣泛使用的編程語言,其普遍性和易用性為其贏得了大量的使用者。一個中心化的社區(qū)對于JavaScript是必要的,開發(fā)者可以在這里共享他們的成果,而不會感到過于復(fù)雜。
我們堅信,JavaScript將繼續(xù)在軟件開發(fā)領(lǐng)域保持其核心地位,而JSR的設(shè)計正是為了支持這種持久的相關(guān)性。盡管JSR不是一個傳統(tǒng)的包管理器,它提供了一種新的方法來管理和保護代碼,致力于成為一個穩(wěn)定且具有前瞻性的平臺,旨在加強和保護JavaScript開發(fā)。
因此,JSR不僅僅是生態(tài)系統(tǒng)中的另一個工具,更是一種徹底改變我們?nèi)绾畏职l(fā)JavaScript和TypeScript代碼的根本性變革。