Nub: 一款由 Rust 驅動的 Node.js 全方位工具包

Nub: 一款由 Rust 驅動的 Node.js 全方位工具包

Nub 是一款使用 Rust 編寫的高速全方位工具包,它旨在增強現有的 Node.js 執行環境,而非取代它。其目標是提供類似 Bun 或 Deno 的開發者體驗 (DX)——提供內建的 TypeScript 支援、高效能的套件管理器,以及整合的版本管理——同時保持與現有 Node.js 生態系統的完全相容性,並避免特定供應商的 API 鎖定。

高效能工具與基準測試

Nub 使用 Rust 二進位檔取代了數個常見的 JavaScript 工具,以消除與啟動 Node.js 程序相關的啟動延遲。這在整個開發生命週期中帶來了顯著的效能提升。

腳本與套件執行

Nub 的腳本執行器 (nub run) 與套件執行器 (nubx) 被設計為 npm runpnpm runnpxpnpm dlx 的直接替代方案。

  • 腳本分派: nub runpnpm run 快約 24 倍,比 npm run 快約 22 倍;在熱啟動分派時間方面,nub run 為 14.7ms,而 npm 為 329.9ms,pnpm 為 442.7ms。
  • 套件執行: nubx 透過消除雙重 Node.js 啟動的開銷,執行本地二進位檔的速度比 npx 快約 19 倍。

套件管理

由 Aube 引擎驅動,nub installpnpm 的相容性替代方案。在針對一個擁有 222 個依賴項的專案進行熱凍結安裝 (warm frozen install) 的基準測試中,Nub 的表現優於其他管理器:

Tool Time Relative Performance
Nub 1122 ms
Bun 1444 ms 29% slower
pnpm 2847 ms 2.5× slower
npm 4163 ms 3.7× slower

TypeScript 優先的 Node.js 執行環境

Nub 允許開發者直接執行 .ts.tsx.js.jsx 檔案,無需額外的建置步驟。其啟動速度比 tsx 快 2.9 倍。

技術實作

Nub 利用現代 Node.js 的擴充介面來提供其增強功能:

  • 轉譯 (Transpilation): 它內嵌了 oxc 函式庫用於預轉譯。
  • Hooks: 它使用 module.registerHooks()--import/--require 預載功能來進行自定義轉譯與解析。
  • 原生擴充 (Native Addons): 它利用 N-API 原生擴充來將 Rust 邏輯整合到 Node.js 程序中。

語言與 API 支援

Nub 提供對現代 JavaScript 與 TypeScript 特性的全面支援:

  • TypeScript 支援: 完全支援 enumnamespace、無副檔名匯入 (extensionless imports) 以及 tsconfig.json#paths 解析。
  • 現代 API: Nub 會在較舊的 Node 版本上自動為 TemporalURLPatternRegExp.escape 等 API 提供 Polyfill,並將實驗性 Node.js 特性(如 node:sqlitevm.ModuleWebSocket)設為非實驗性狀態。
  • 環境變數管理: 內建自動載入 .env* 的功能,提供與 Next.js 與 Vite 相當的體驗。

整合式 Node.js 生態系統管理

Nub 將數個零散的工具整合進單一二進位檔中,同時管理專案依賴項與 Node.js 執行環境本身。

Node 版本管理

Nub 的功能類似於 nvmfnm 的版本管理器。它可以透過 nub node install 手動配置版本,或是從 .node-version.nvmrcpackage.json#enginespackage.json#devEngines 自動推斷所需的 Node 版本並即時安裝。

套件管理器相容性

Nub 可以運行在「相容模式」(compat-mode) 下,根據 lockfiles 或 package.json 設定來偵測現有的套件管理器(npm、pnpm、Bun 或 Yarn)。在此模式下,它會遵循現有工具的特定設定檔(例如 pnpm-lock.yamlbunfig.toml)與環境變數。

套件元數據管理 (Package Meta-Management)

透過 nub pm shim,Nub 提供了一個 Corepack 功能的 Rust 原生實作,透過為 npmyarnpnpm 註冊全域 Shim,以確保在特定專案中使用正確版本的套件管理器。

Sources