Web開発
Show HN: Nub – Node.jsのためのBunのようなオールインワンツールキット
Show HN: Nub – A Bun-like all-in-one toolkit for Node.js (github.com)
要約
Nubは、Node.jsを置き換えるのではなく拡張する、Rustで書かれた高速なオールインワンツールキットです。TypeScriptファーストのランタイム、npm/pnpm/npxより2.5〜24倍高速なスクリプト実行、パッケージインストール、Nodeバージョン管理などの機能を提供し、Bunのような優れた開発体験をNode.js上で実現します。既存のNode.jsエコシステムとの互換性を保ちつつ、パフォーマンスと開発効率の向上を目指しています。
全文翻訳
Nub
Node.jsを置き換えるのではなく拡張する高速なオールインワンツールキット
ドキュメント • GitHub • 𝕏
純粋なNodeの上にBunのようなDX(開発体験)をRustで構築。
```bash
nub index.ts # TypeScriptファーストのNode.jsランタイム
nub run dev # pnpm run より24倍高速
nubx prisma generate # npx より19倍高速
nub install # pnpm install より2.5倍高速
nub watch src/server.ts # ネイティブのウォッチモード
nub pm shim # Corepackスタイルの組み込みシム
nub node install 26 # Nodeバージョンマネージャー
nub upgrade # 自己更新
```
ファイルやスクリプトを実行し、依存関係をインストールし、Node自体を管理する一つのツール。新しいランタイム、ベンダー固有のAPIサーフェス、ロックインは不要。
**Nubの代替**
| Nub | 代替 |
|---|---|
| `nub <file>` | `node`, `tsx`, `ts-node`, `dotenv-cli` |
| `nub run <script>` | `npm run`, `pnpm run` |
| `nubx` | `npx`, `pnpm dlx` / `exec` |
| `nub install` | `npm`, `pnpm` |
| `nub watch` | `nodemon`, `node --watch`, `tsx watch` |
| `nub node` | `nvm`, `fnm`, `n`, `volta` |
| `nub pm` | `corepack` |
インストール
```bash
# macOS / Linux
curl -fsSL https://nubjs.com/install.sh | bash
# Windows (PowerShell)
irm https://nubjs.com/install.ps1 | iex
# またはnpm経由 (pnpm / yarn global add も動作します)
npm install -g --ignore-scripts=false @nubjs/nub
```
GitHub Actionsでは、`actions/setup-node`の代わりに`nubjs/setup-nub`を使用します。これは1対1の互換性があります。
```diff
- - uses: actions/setup-node@v4
+ - uses: nubjs/setup-nub@v0
```
ファイルランナー — `nub <file>`
ファイルを動かします。`.js`, `.ts`, `.mjs`, `.cjs`, `.mts`, `.cts`, `.jsx`, `.tsx`をサポートします。フラグや変数はNodeと(主にパススルーで)ほぼ互換性があります。
```bash
nub index.ts # TypeScript, JSX, ビルドステップなし
nub --watch app.ts # 同じパス、変更時に再起動
```
これは、Bun/Denoの最高の機能の一部で純粋なNodeを拡張します。
* 🦆 完全なTypeScriptサポート(enum、namespaceを含む)
* 🧭 TypeScriptフレンドリーな解決:拡張子なしインポート、`tsconfig.json#paths`
* ⚛️ JSX / TSX
* 🎂 Decoratorsと`emitDecoratorMetadata`
* 🆕 `using`のようなモダンな構文(必要に応じてトランスパイラでダウンレベル化)
* 🔐 `.env*`の自動ロード — Next.js/Viteと同等
* 🗂️ 一般的なデータ形式(`.yaml`, `.toml`, `.jsonc`, `.json5`, `.txt`)の組み込みローダー
* 🌐 Temporal, Worker, URLPattern, WebSocket, EventSourceのポリフィル(必要な場合)
* 🔥 `node:sqlite`, `vm.Module`, `localStorage`のような実験的機能をアンフラグ化
* ⚡ `tsx`より2.9倍高速な起動
仕組み — Nubは、DenoとBunが構築された当時にはほとんど存在しなかったNodeの拡張サーフェスを活用しています。
* `--import`/`--require`によるプリロード
* `module.registerHooks()`によるトランスパイルと解決
* N-APIネイティブアドオン:Nubは`oxc`を埋め込み、プリトランスパイルを行います
Nodeプロビジョニング
`nub`でファイルを実行すると、プロジェクトが期待するNodeのバージョンが推測され、必要に応じて自動インストールされます。以下の優先順位に従います。
1. `NODE_EXECUTABLE` (上書き)
2. `package.json#devEngines`
3. `.node-version`
4. `.nvmrc`
5. `package.json#engines`
この解決されたNodeのバージョンがインストールされ、そのファイルは(Nubの拡張機能とともに)実行されます。
```bash
$ echo 26 > .node-version
$ nub hello.ts
Using Node.js 26.3.0 (resolved from .node-version)
Installed in 9.8s
Hello world!
```
モダンAPI
モダンAPIはNubの下で箱から出してすぐに動作します。Node.jsの実験的APIはアンフラグ化され、他のものは自動ポリフィルされ(例:Node 25以前のTemporal)、さらに他のものはトランスパイラでダウンレベル化されます(`using`)。
| API | 動作 |
|---|---|
| `Temporal` | Node 26未満でポリフィル、それ以上でネイティブ |
| `URLPattern` | Node 24未満でポリフィル、それ以上でネイティブ |
| `RegExp.escape` | Node 24未満でポリフィル、それ以上でネイティブ |
| `Error.isError` | Node 24未満でポリフィル、それ以上でネイティブ |
| `Promise.try` | Node 24未満でポリフィル、それ以上でネイティブ |
| `Float16Array` | Node 24未満でポリフィル、それ以上でネイティブ |
| `navigator.locks` | Node 24.5未満でポリフィル、それ以上でネイティブ |
| `reportError` | ポリフィル |
| `vm.Module` | アンフラグ化 |
| `ShadowRealm` | アンフラグ化 |
| `Wasm module imports` | Node 24.5未満(22.x系列では22.19)でアンフラグ化、それ以上でネイティブ |
| `WebSocket` | Node 20.10からアンフラグ化、Node 22からネイティブ |
| `EventSource` | Node 20.18からアンフラグ化、それ以上でネイティブ |
| `node:sqlite` | Node 22.5からアンフラグ化、Node 22.13からネイティブ |
| `addon imports` | Node 22.20からアンフラグ化、ネイティブはなし |
ウォッチモード
解決された依存関係グラフと、実行を無効にするグラフ外のファイル(グロブリストを維持する必要がない)によって駆動される変更時の再起動:
```bash
nub watch src/server.ts
nub --watch src/server.ts # 同じパス
```
* 👀 解決された依存関係グラフを自動的に追跡
* 🧷 グラフ外の無効化要因(`.env*`、`tsconfig.json`の拡張チェーン、`package.json`)も監視
* ⚙️ Node独自の`--watch`エンジン上で実行され、デフォルトで出力を保持
完全なランタイムドキュメントはこちらをご覧ください👉。
スクリプトランナー — `nub run`
`npm run`と`pnpm run`のドロップイン代替品。このランナーはJavaScriptの起動を伴わないRustバイナリであるため、ウォームスクリプトを`pnpm run`より約24倍高速にディスパッチします。
```bash
nub run build
nub run -r --filter "@org/*" test # --filterをサポート
```
既存のJavaScriptベースのスクリプトランナーと比較して高速です。
| コマンド | 時間 | 相対速度 |
|---|---|---|
| `nub run` | 14.7 ms | — |
| `npm run` | 329.9 ms | 22倍 |
| `pnpm run` | 442.7 ms | 30倍 |
スクリプトディスパッチ・ウォーム・50回実行・macOS — ベンチマークを見る
* 🚀 瞬時に感じる — `npm`/`pnpm`の300ms以上の検出可能な遅延に対し14ms
* 🔁 完全なライフサイクルサポート — pre/postフックと完全な`npm_*`環境
* 🧰 ローカルの`node_modules/.bin`をPATHに含め、`--`区切りなしで引数を転送
* 🗃️ 完全な`pnpm`ワークスペースサーフェス — `-r`, `--filter`, `--parallel`, `--workspace-concurrency`, `--resume-from`, `--stream`
* 🎯 `pnpm`の`--filter`文法をそのままサポート — グラフ(`...@org/web`)と`changed-since`(`[main]`)セレクタ
完全なスクリプトランナーのドキュメントはこちらをご覧ください👉。
パッケージランナー — `nubx` / `nub dlx`
`npx`と`pnpm dlx`のドロップイン代替品。ローカル優先で、ダウンロードして実行するレジストリフォールバック(`npx`と同じ)を備えています。`npx`のようなJavaScriptベースのツールが支払う、二重Node.jsスプールのパフォーマンスペナルティを排除します。
```bash
nubx eslint . --fix
nubx -y cowsay@1.5.0 "hi" # レジストリからフェッチ ( -y で自動承認)
```
| コマンド | 時間 | 相対速度 |
|---|---|---|
| `nubx esbuild --version` | 11 ms | — |
| `pnpm exec esbuild --version` | 191 ms | 17倍 |
| `npx esbuild --version` | 226 ms | 19倍 |
`esbuild --version`・macOS — ベンチマークを見る
* ⚡ ローカルのbinを`npx`より約19倍高速に実行(ラッパーにNodeなし)
* 🔎 どのパッケージマネージャーがインストールしたかにかかわらず`node_modules/.bin`を解決
* 🌐 インストールされていないbinのレジストリフォールバック — フェッチ、実行、その後破棄
* 🧩 `pnpm exec` / `pnpm dlx`のフラグと完全な互換性、シェルモードを含む
* 🪜 解決チェーンを辿る — メンバー`.bin`、次にワークスペースルート、次に祖先
完全なパッケージランナーのドキュメントはこちらをご覧ください👉。
パッケージマネージャー — `nub install`
NubはAubeエンジンを搭載したパッケージマネージャーです。CLIは、操作記憶のために`pnpm`とフラグ互換性がありますが、
```bash
nub install
nub ci
nub add -E -D --save-catalog react
nub remove lodash
nub update
nub dedupe
```
高速 — JavaScriptベースのパッケージマネージャーが被るコマンドごとのNode.jsブートストラップの遅延を回避します。
| ツール | 時間 | 相対速度 |
|---|---|---|
| `nub` | 1122 ms | — |
| `bun` | 1444 ms | 29%遅い |
| `pnpm` | 2847 ms | 2.5倍 |
| `npm` | 4163 ms | 3.7倍 |
ウォーム・フリーズインストール・create-t3-app・222 deps・macOS — ベンチマークを見る
セキュリティ 🛡️
* デフォルトで`postinstall`をブロック
* デフォルトで解決中に`osv.dev`で既知の悪意あるパッケージバージョンをチェック
* デフォルトでプロベナンスのダウングレードを拒否
* デフォルトで`minimumReleaseAge`は24時間
互換性
プロジェクト内で`nub install`を実行すると、現在のパッケージマネージャー(`package.json#packageManager`または検出されたロックファイルに基づいて)を検出します。その後、そのパッケージマネージャーの設定ファイルと環境変数を尊重する互換モードで実行します。
各現行のマネージャーの下で、Nubはそのツールのブランド設定を読み込み、他のものは読み込みません。中立的な`.npmrc`のカスケードと`npm_config_*`はすべての場合に読み込まれます。
| 現行のマネージャー | 読み込む設定 |
|---|---|
| `npm` | `package-lock.json`, `.npmrc`, `overrides`, `workspaces`, `engines`/`os`/`cpu`/`libc` |
| `pnpm` | `pnpm-lock.yaml`, `pnpm-workspace.yaml`, `.pnpmfile.cjs`, `package.json#pnpm`, `resolutions`, `catalog:`, `.npmrc` |
| `Yarn` (読み取り専用) | `yarn.lock`, `.yarnrc.yml` / `.yarnrc`のサブセット, `YARN_*`, `resolutions`, `packageExtensions`, `.npmrc` |
| `Bun` | `bun.lock`, `bunfig.toml [install]`, `trustedDependencies`, `overrides`, `patchedDependencies`, `catalog:`, `.npmrc` |
| `Nub` | 中立のみ — `.npmrc`, `npm_config_*`, `overrides` / `resolutions` / `catalog` / `workspaces` |
完全なパッケージマネージャーのドキュメントはこちらをご覧ください👉。
パッケージメタマネージャー — `nub pm`
Corepackの仕事をネイティブRustで実現:プロジェクトがピン留めした正確な`pnpm` / `npm` / `yarn`をプロビジョニングして実行します。
```bash
nub pm shim # gloを登録
```