全能 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 本身。
TypeScript 优先的 Node.js
在原生 Node 上运行 .ts、.tsx 和 .jsx,完整支持tsconfig.json、.env 加载以及现代语法和 Web API。
# 运行一个 TypeScript 文件$ nub index.ts# 变更时重启$ nub watch src/server.ts
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.tsListening 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.tsUsing Node.js 26.4.0 (resolved from .node-version)Installed in 9.8sHello world!
性能
可忽略的开销,媲美原生 Node
Nub 通过其原生 Rust 插件在内存中转译每个文件,然后在真实的node 二进制文件上运行。它自身的启动只需几毫秒的 Rust, 被 Node 的启动时间所淹没,因此 .ts 文件的启动速度与原生 node 相当,比 tsx 快约 2.9 倍——后者每次运行都要加载 esbuild 及其加载器钩子。
兼容性
Node 兼容,因为它就是 Node
你的代码由原生 node 二进制文件转译和执行,因此它 运行在真实的 Node 上,而非重新实现。这就是兼容性的来源。
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 功能的标志。
比 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
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 分支以来变更的
比 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
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 下运行
比快 5 倍 的 pnpm
内置的 pnpm 兼容包管理器。它读取你项目已有的锁文件—— pnpm、npm 或 bun——以相同格式写回, 并且开箱即用地防御供应链攻击。由 aube 引擎驱动。
元包管理器
切换包管理器,保留你的锁文件。
Nub 自动检测你当前的包管理器,并就地更新你已有的锁文件。 无需迁移。package-lock.json、pnpm-lock.yaml 和 bun.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
warm frozen install · TanStack Start · 313 deps · macOS
配置兼容性
镜像你的包管理器配置规则
Nub 支持所有列出的配置机制,但根据项目推断的包管理器约定来开关它们。 没有 Nub 特定的配置文件。
| 配置字段 | npm | pnpm | yarn | bun | nub |
|---|---|---|---|---|---|
| workspaces | ● | ● | ● | ● | ● |
| overrides | ● | ○ | ○ | ● | ● |
| resolutions | ○ | ● | ● | ● | ● |
| catalog: | ○ | ● | ○ | ● | ● |
| packageExtensions | ○ | ● | ● | ○ | ● |
| allowBuilds | ○ | ● | ○ | ○ | ● |
| trustedDependencies | ○ | ○ | ○ | ● | ● |
| .npmrc | ● | ● | ● | ● | ● |
默认供应链安全
防御供应链攻击
防御措施开箱即用,无需配置。Nub 将依赖构建脚本视为 deny-by-default, 在每次全新解析时查询 OSV 检查恶意包公告,拒绝发布信任证据减弱的版本, 并暂缓发布不到 minimumReleaseAge(24 小时,与 pnpm 一致)的版本, 以免刚被篡改的版本被拉入。
$ nub add @ledgerhq/connect-kitError: 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 hadprovenance attestation but this version has no trust evidence❌ code=ERR_NUB_TRUST_DOWNGRADE
默认拒绝构建脚本
构建脚本在你允许之前不会运行
安装时的 postinstall 脚本是大多数供应链载荷落地的地方。 Nub 默认跳过它们,指出跳过了什么,并等待 nub approve-builds。只有通过来源证明、公告和冷却期检查后, 精选的默认信任底线才能为某个包担保。
$ nub installWARN 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 # 审查 + 允许,一次性