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 run、pnpm run、npx 和 pnpm dlx 的即插即用替代方案。
- 脚本分发:
nub run比pnpm 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 支持: 全面支持
enum、namespace、无扩展名导入以及tsconfig.json#paths解析。 - 现代 APIs: Nub 会在旧版本的 Node.js 上自动 polyfill 诸如
Temporal、URLPattern和RegExp.escape等 API,并取消实验性 Node.js 特性的标志 (unflags),例如node:sqlite、vm.Module和WebSocket。 - 环境管理: 内置自动
.env*加载功能,提供与 Next.js 和 Vite 的同等体验。
集成的 Node.js 生态系统管理
Nub 将几个碎片化的工具整合进一个单一的二进制文件中,同时管理项目依赖和 Node.js 运行时本身。
Node 版本管理
Nub 的作用类似于 nvm 或 fnm 的版本管理器。它可以通过 nub node install 手动配置版本,或者根据 .node-version、.nvmrc、package.json#engines 或 package.json#devEngines 自动推断所需的 Node 版本并即时安装。
包管理器兼容性
Nub 可以运行在“兼容模式”下,根据 lockfiles 或 package.json 设置检测当前的包管理器(npm、pnpm、Bun 或 Yarn)。在此模式下,它会遵循现有工具的特定配置文件(例如 pnpm-lock.yaml 或 bunfig.toml)和环境变量。
包元数据管理
通过 nub pm shim,Nub 提供了 Corepack 功能的 Rust 原生实现,通过为 npm、yarn 和 pnpm 注册全局 shim,确保为给定项目使用正确的包管理器版本。