HN 日本語サマリー

← 一覧へ戻る
Web開発

Show HN: Nub – Node.jsのためのBunのようなオールインワンツールキット

Show HN: Nub – A Bun-like all-in-one toolkit for Node.js (github.com)

31 pointsby colinmcd8 コメント

要約

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を登録 ```