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 倍,其热启动分发时间为 14.7ms,而 npm 为 329.9ms,pnpm 为 442.7ms。
  • 包执行: nubx 通过消除双重 Node.js 启动惩罚,执行本地二进制文件的速度比 npx 快约 19 倍。

包管理

由 Aube 引擎驱动,nub install 是一个与 pnpm 标志兼容的替代方案。在针对一个拥有 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 扩展接口来提供其增强功能:

  • 转译: 它嵌入了 oxc 库用于预转译。
  • Hooks: 它使用 module.registerHooks()--import/--require 预加载功能来实现自定义转译和解析。
  • Native Addons: 它利用 N-API 原生插件来将基于 Rust 的逻辑集成到 Node.js 进程中。

语言与 API 支持

Nub 为现代 JavaScript 和 TypeScript 特性提供全面的支持:

  • TypeScript 支持: 全面支持 enumnamespace、无扩展名导入以及 tsconfig.json#paths 解析。
  • 现代 APIs: Nub 会在旧版本的 Node.js 上自动 polyfill 诸如 TemporalURLPatternRegExp.escape 等 API,并取消实验性 Node.js 特性的标志 (unflags),例如 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 可以运行在“兼容模式”下,根据 lockfiles 或 package.json 设置检测当前的包管理器(npm、pnpm、Bun 或 Yarn)。在此模式下,它会遵循现有工具的特定配置文件(例如 pnpm-lock.yamlbunfig.toml)和环境变量。

包元数据管理

通过 nub pm shim,Nub 提供了 Corepack 功能的 Rust 原生实现,通过为 npmyarnpnpm 注册全局 shim,确保为给定项目使用正确的包管理器版本。

Sources