Nub 介绍

全能 JavaScript 工具包, 增强 Node.js 而非试图取代它

TypeScript 优先的 Node.js 工具链。在你已有的 node 和包管理器上运行 TypeScript 文件、 package.json 脚本和本地 CLI。无需新运行时,无锁定。

查看仓库
$ nub index.ts # TypeScript 优先的 Node.js 运行时
$ nub run dev # 比 pnpm run 快 24 倍
$ nubx prisma generate # 比 npx 快 19 倍
$ nub install # 比 pnpm install 快 5 倍
$ nub watch src/server.ts # 原生监听模式
$ nub pm shim # 内置 Corepack 式垫片
$ nub node install 26 # Node 版本管理器

工具链

Node.js 全能工具包

一个 Rust 二进制文件,运行你的文件和脚本、安装依赖、管理 Node 本身。

nub <file>

TypeScript 优先的 Node.js

在原生 Node 上运行 .ts.tsx.jsx,完整支持tsconfig.json.env 加载以及现代语法和 Web API。

取代tsxts-nodetsconfig-pathsdotenv
# 运行一个 TypeScript 文件
$ nub index.ts
# 变更时重启
$ nub watch src/server.ts
nub <file>

TypeScript 优先的 Node.js

Nub 在原生 Node 之上添加了对 TypeScript、JSX、装饰器、.env 文件、 YAML/TOML 导入以及现代语法和 API 的支持。与 node 逐旗兼容。由 Rust 和 oxc 驱动。

架构

Rust 转译,真实 Node 运行

Nub 使用 oxc (编译为 原生 Node 插件)在内存中转译你的代码, 并在原生 node 二进制文件上运行输出。没有 Nub 运行时,只有真实的 Node。 支持 Node.js 18 LTS 及更新版本。

$ nub app.ts
# oxc 在内存中转译,然后由原生 node 运行
running on node v26.4.0

TypeScript 优先

完整的 TypeScript 支持,不仅仅是类型擦除

近期版本的 Node 支持 类型擦除, 它会移除注解但拒绝不可擦除的语法。Nub 的加载钩子通过原生插件转译每个文件, 因此枚举、参数属性和 Node 不允许的无扩展名导入都能正常工作。

import { Model } from "./base"   // extensionless → ./base.ts

enum Status { Draft, Sent, Paid }

class Invoice extends Model {
  constructor(public status = Status.Draft) {} // parameter property
}

tsconfig

尊重你的 tsconfig.json

Nub 解析你的 tsconfig.json (包括 "extends")并通过 module.registerHooks() 解析钩子将其 paths 注入 Node 自身的解析器。 不再需要 tsconfig-paths,Node.js 与你的编辑器之间也不再不一致。

// tsconfig.json
{
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"],
      "@db": ["src/db/index.ts"]
    }
  }
}

环境变量

自动加载 .env 文件

Nub 读取 .env.env.local .env.[NODE_ENV] 并在 Node 启动前注入。无需 dotenv。通过 ${VAR} 自动展开变量,与 Vite 和 Next.js 一致。

# .env
APP=acme
DATABASE_URL=postgres://localhost/${APP}_dev

# No dotenv. No cross-env. No import "dotenv/config".
$ nub server.ts

现代语法

装饰器、JSX 和 using

Nub 支持装饰器和 JSX,根据你的 tsconfig.json 设置进行转译。完整支持 emitDecoratorMetadata 和显式资源管理,无需构建步骤。

await using db = await connect()    // disposed at scope end

@sealed                             // legacy decorator
class User {}

const view = <Hello name="world" /> // JSX in .tsx

加载器

导入 JSON、YAML 和 TOML

直接导入 .yml.yaml.toml .json5.jsonc 文件。 module.registerHooks() 加载钩子将它们通过 Nub 原生插件中的快速 Rust 解析器路由, 将每个导入解析为纯 JavaScript 对象。(另外,.txt 也可以)

import config from "./config.yaml"   // parsed object
import flags  from "./feature.jsonc" // comments stripped
import pkg    from "./Cargo.toml"    // parsed object
import prompt from "./prompt.txt"    // string

const { host, port } = config        // destructure fields

自动重启

依赖感知的监听模式

node --watch 驱动,Nub 的 watch 命令 监听入口文件或任何间接导入的文件变更。 还添加了 TypeScript/JSX sourcemap 支持,并监听你的 package.json、tsconfig 和 .env 文件。

$ nub watch src/server.ts
Listening on http://localhost:3000
↺ src/db.ts 已变更 — 正在重启
Listening on http://localhost:3000

Node 版本管理

按需自动安装 Node

Nub 读取你的 .node-version.nvmrc engines/devEngines 锁定,并在确切版本上运行你的代码。 如果该版本不在你的机器上,Nub 会从 nodejs.org 下载、校验校验和并即时安装——取代 nvm fnm。你也可以 手动管理版本

$ echo 26 > .node-version
$ nub hello.ts
Using Node.js 26.4.0 (resolved from .node-version)
Installed in 9.8s
Hello world!

性能

可忽略的开销,媲美原生 Node

Nub 通过其原生 Rust 插件在内存中转译每个文件,然后在真实的node 二进制文件上运行。它自身的启动只需几毫秒的 Rust, 被 Node 的启动时间所淹没,因此 .ts 文件的启动速度与原生 node 相当,比 tsx 快约 2.9 倍——后者每次运行都要加载 esbuild 及其加载器钩子。

run a TypeScript file · macOS

node hello.ts44 ms
nub hello.ts44 ms
tsx hello.ts128 ms · 慢 2.9×
查看基准 →

兼容性

Node 兼容,因为它就是 Node

你的代码由原生 node 二进制文件转译和执行,因此它 运行在真实的 Node 上,而非重新实现。这就是兼容性的来源。

Node 25.8
100%
4,368 / 4,368
Nub
98.8%
4,315 / 4,368
Deno 2.8
77.4%
3,380 / 4,368
Bun 1.3.14
40.5%
1,770 / 4,368

Deno 的 Node 兼容性测试集,对照原生 Node 评分。Nub 的失败来自自动启用实验性功能和加载原生插件。
查看基准测试仓库

真正的直接替换

node 逐旗兼容

Nub 确实 node 的直接替代品。每个 V8 和 Node 标志、NODE_OPTIONS、argv、退出 码和信号行为完全一致——Nub 将它们直接转发给它运行的 node。在任何脚本、Dockerfile 或 CI 步骤中将 node 替换为 nub ; 其他什么都不用改。

$ NODE_OPTIONS='--enable-source-maps' nub \ --max-old-space-size=8192 \ --import ./instrument.js \ app.ts --port 3000

无 Nub 特定 API

零锁定

Nub 不是运行时。你的代码 使用原生 node 运行。Nub 只是转译你的代码、填充 缺失的全局 API、设置一些标志,并对 Node 的模块解析进行增量修改以改善 TypeScript 支持。

  • 无 Nub 全局变量
  • 无 nub:* 模块命名空间
  • 无 @nub/* npm 作用域
  • package.json 中无 "nub" 字段
  • 无 nub 命名的锁文件

前向兼容

现代 API 和语法,全面支持

Nub 填充了如 Temporal Worker 等 API, 添加了对如 using 等 新 ECMAScript 语法的支持,并取消了所有实验性 Node.js 功能的标志。

Web Workers
自动填充
Temporal
< 26 填充
URLPattern
< 24 填充
WebSocket
< 22 取消标志
navigator.locks
自动填充
localStorage
自动取消标志
using / await using
转译
node:sqlite
< 23 取消标志
vm.Module
自动取消标志
RegExp.escape
< 24 填充
Promise.try
< 24 填充
Float16Array
< 24 填充
nub run

pnpm run 快 24 倍

npm run pnpm run 的直接替代品,支持生命周期 钩子、npm_* 环境变量和参数转发,无需这些基于 Node 的工具每次调用时的 JS 启动开销。

性能

以 Rust 的速度运行 package.json 脚本

使用 npm run pnpm run 运行的脚本会感觉明显卡顿—— 它们是 Node.js 程序,每次调用都要冷加载包管理器自身的 JavaScript(配置、工作区探测等) 然后才能运行你的脚本——而 Nub 的运行器是一个没有自身启动开销的 Rust 二进制文件。

script dispatch · warm · 50 runs · macOS

nub run14.7 ms
node --run32.2 ms · 慢 2.2×
npm run329.9 ms · 慢 22×
pnpm run442.7 ms · 慢 30×
查看基准 →

pnpm run 的直接替代

pnpm run 逐旗兼容

Nub 接受 pnpm run 的标志,拼写和语义完全相同,甚至包括那些冷门的递归标志。 将 pnpm 替换为 nub ,你的 CI 脚本原样运行,只是更快。

$ nub run build # 普通脚本运行
$ nub run test -- --coverage # 传递参数
$ nub -r --if-present lint # 跳过没有该脚本的包
$ nub -r --parallel --no-bail test # 同时运行,收集所有结果
$ nub -r --resume-from @org/api --stream build # CI 重启,流式输出

工作区

Monorepo 友好

Nub 实现了 pnpm 的 --filter 语法和 -r,从 package.json#workspaces pnpm-workspace.yaml 读取工作区。你现有的 filter 命令原样工作。

$ nub -r run build # 每个包,拓扑排序
$ nub --filter @org/api dev # 单个包
$ nub --filter ...@org/web build # + 其依赖
$ nub --filter "[main]" test # 自 main 分支以来变更的
nubx

npx 快 19 倍

nubx 命令用 Rust 解析 node_modules/.bin 并直接执行二进制文件——包装器中没有 Node 进程。npx pnpm dlx 的直接替代品:运行本地 bin,或从注册表获取未安装的。

性能

让命令感觉瞬间响应

调用原生 CLI 如 esbuild 时,npx 本身(用 JS 编写)会增加明显的 200ms 冷启动延迟,即使运行的 CLI 命令本身是瞬时的。 Nub 遍历 node_modules/.bin 并直接执行二进制文件。

esbuild --version · macOS

nubx esbuild --version11 ms
pnpm exec esbuild --version191 ms · 慢 17×
npx esbuild --version226 ms · 慢 19×
查看基准 →

pnpm exec 的直接替代

pnpm exec 逐旗兼容

nubx nub exec 命令接受 pnpm exec 的标志,nub dlx 匹配 pnpm dlx,包括 shell 模式。将 pnpm 替换为 nub ,你熟悉的命令就能运行。

$ nub exec -r tsc --build # 跨工作区
$ nub exec --parallel vitest # 每个包同时运行
$ nub dlx -p cowsay -c 'cowsay hi | tr a-z A-Z' # dlx shell 模式

解析

兼容任何包管理器

Nub 从 node_modules/.bin 解析本地安装的 CLI,无论它是哪个包管理器安装的——因此你无需切换包管理器即可获得 Nub 的性能。

$ nubx eslint . # 成员的 .bin 优先
$ nubx prisma generate # 然后是工作区根
$ nubx tsc --noEmit # 然后是祖先目录
$ nubx --node some-cli # 在原生 Node 下运行
nub install

比快 5 倍 的 pnpm

内置的 pnpm 兼容包管理器。它读取你项目已有的锁文件—— pnpmnpmbun——以相同格式写回, 并且开箱即用地防御供应链攻击。由 aube 引擎驱动。

元包管理器

切换包管理器,保留你的锁文件。

Nub 自动检测你当前的包管理器,并就地更新你已有的锁文件。 无需迁移。package-lock.jsonpnpm-lock.yamlbun.lock 已验证可往返兼容。

$ nub install # npm package-lock.json → in place
$ nub install # pnpm pnpm-lock.yaml → in place
$ nub install # bun bun.lock → in place

pnpm 的直接替代

直接替换 pnpm 兼容

每个包管理器命令都接受 pnpm 的标志,拼写和语义相同,甚至包括工作区目录等高级功能。 将 pnpm 替换为 nub ,你的命令原样运行。

# 精确锁定 · devDeps · 工作区目录
$ nub add -E -D --save-catalog react
$ nub install --frozen-lockfile --prefer-offline --node-linker hoisted

安装速度

超快安装

与 pnpm 一样,Nub 将包文件保存在全局内容寻址存储中,并链接到 node_modules。 Nub 内嵌了 aube,一个高度优化的 Rust 解析器和链接器。

warm frozen install · TanStack Start · 313 deps · macOS

nub171 ms
bun686 ms · 慢 4×
pnpm3193 ms · 慢 18.7×
npm5316 ms · 慢 31.1×
查看方法论 →

配置兼容性

镜像你的包管理器配置规则

Nub 支持所有列出的配置机制,但根据项目推断的包管理器约定来开关它们。 没有 Nub 特定的配置文件。

配置字段npmpnpmyarnbunnub
workspaces
overrides
resolutions
catalog:
packageExtensions
allowBuilds
trustedDependencies
.npmrc

默认供应链安全

防御供应链攻击

防御措施开箱即用,无需配置。Nub 将依赖构建脚本视为 deny-by-default, 在每次全新解析时查询 OSV 检查恶意包公告,拒绝发布信任证据减弱的版本, 并暂缓发布不到 minimumReleaseAge(24 小时,与 pnpm 一致)的版本, 以免刚被篡改的版本被拉入。

$ nub add @ledgerhq/connect-kit
Error: refusing to add malicious package(s):
- @ledgerhq/connect-kit (MAL-2023-8697:
https://osv.dev/vulnerability/MAL-2023-8697)
❌ code=ERR_NUB_MALICIOUS_PACKAGE
$ nub install # 丢失了来源证明的版本
Error: trust downgrade for nanoid@3.3.14 (trustPolicy=
no-downgrade): earlier published version 3.3.7 had
provenance attestation but this version has no trust evidence
❌ code=ERR_NUB_TRUST_DOWNGRADE

默认拒绝构建脚本

构建脚本在你允许之前不会运行

安装时的 postinstall 脚本是大多数供应链载荷落地的地方。 Nub 默认跳过它们,指出跳过了什么,并等待 nub approve-builds。只有通过来源证明、公告和冷却期检查后, 精选的默认信任底线才能为某个包担保。

$ nub install
WARN ignored build scripts for 1 package(s): esbuild@0.21.5.
Run `nub approve-builds` to review and enable them.
code=WARN_NUB_IGNORED_BUILD_SCRIPTS
$ nub approve-builds # 审查 + 允许,一次性

Node.js 全能工具包

查看仓库