There's a NEW Package Manager!? (Bun Alternative)

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00これはNubです。Nodeを置き換えるのではなく、その上で動作するオールインワンのJavaScriptツールキットです。
00:00:04現在お使いのさまざまなツールを置き換えてくれます。パッケージマネージャーは
00:00:08pnpmの5倍高速で、TSXに取って代わるTypeScriptランナーや
00:00:13Nodeのバージョンマネージャーまで備えています。Bunの最高機能を標準のNode.js上で実現しています。
00:00:17Nubという名前がBunの逆さ読みなのも、おそらくそれが理由でしょう。
00:00:21JavaScriptエンジニアが車輪の再発明を好むのは知っていますが、これはどこかの誰かが作った個人プロジェクトではありません。
00:00:25実はZodの制作者であるColinが開発したもので、彼はtRPCの概念実証を作成し、
00:00:29Bunで働いていた経歴もあります。それではさっそく詳しく見ていきましょう。
00:00:38Nubは1つのRustバイナリで構成され、Mac、Windows、Linuxで動作します。イントロで触れたように、
00:00:44これらは置き換え可能なツールの一部にすぎません。ファイルランナー、スクリプトランナー、
00:00:47パッケージランナー、パッケージマネージャー、そしてNodeバージョンマネージャーが含まれています。1つずつ見ていきましょう。
00:00:52まずはファイルランナーです。これだけでも非常に多くの機能を備えています。ファイルランナーは完全な
00:00:56TypeScriptをサポートしており、Nodeのような単なる型除去(Type Stripping)ではないため、TSXやts-nodeといったツールを置き換えられます。
00:01:02ここにあるTypeScriptファイルにはEnumやNamespace、パラメータ
00:01:06プロパティが含まれており、通常Nodeでは実行できません。単にNubを使って
00:01:11実行したいファイルを指定すれば、Nodeでは失敗するようなファイルも問題なく動作します。
00:01:15NubをNodeに置き換えてみると、サポートされていないTypeScript構文のエラーが返され、
00:01:20NamespaceやEnumが処理できないことがわかります。ファイルランナーはdotenvのようなツールも置き換え可能で、
00:01:24環境変数を自動的にインポートします。.envファイルや.env.local、Node環境変数用ファイルに対応し、
00:01:29自動変数展開機能まであります。ここには、他の環境変数で構成された
00:01:33変数があります。データベースのユーザー名とホスト名が設定されています。
00:01:37このファイルをNubで実行すると、それらの環境変数を自動でインポートし、
00:01:41他の環境変数の値を使ってヘルスチェックURLを構築しているのがわかります。
00:01:46また、表示されているAPIキーが、こちらの.envにあるものと一致しないことにも気づくでしょう。
00:01:50これは.env.localが常に優先されるためで、そこではAPIキーが
00:01:54「Better Stackをチャンネル登録する」に設定されているからです。AIや開発者向けニュースの最新情報を手に入れるなら、
00:01:58ぜひチャンネル登録してください。本当に励みになります。次に「nub src/index.tsx」を
00:02:02実行してみると、すべて正常に動作しているのが確認できます。これが私の
00:02:07「Nub Kitchen Sink」デモです。このファイルのコードでは、Nubファイルランナーが提供する多数の機能を使用しています。
00:02:12まず一つ目として、JSONファイルをはじめ、YAMLや
00:02:15HTML、さらにはテキストファイルまで直接インポートでき、tsconfig-pathsのようなツールの代わりにもなります。
00:02:20ここでtsconfigに設定した「@config」などのパスエイリアスも、Nodeによって
00:02:24適切に解決されるように処理してくれます。さらに「service」や「sealed」のようなデコレータもサポートしています。
00:02:29JSXもサポートされており、tsconfigの設定に基づいて適切にトランスパイルされます。明示的なリソース管理を行うための
00:02:34「using」キーワードのようなモダンな構文も使えます。それらに加えて、
00:02:38Web WorkersやTemporalなど、最新APIの数々を幅広くサポートしています。それらを未サポートの
00:02:43Nodeバージョン向けに自動でポリフィルしてくれるほか、LocalStorageサポートなどの実験的
00:02:48Node機能のフラグも自動的に解除してくれます。これはファイルランナーが誇る機能の
00:02:52ほんの一部にすぎませんが、Nodeとの完全なフラグ互換性がある点にも触れておきたいと思います。
00:02:56というのも、最終的にはNodeを実行しているだけなので、フラグをそのまま引き渡すだけだからです。つまり
00:03:01スクリプトがNode非対応の機能を使っていないなら、NubをNodeに置き換えてもまったく
00:03:06同じ結果が得られます。ちなみに、これらすべては速度のオーバーヘッドがほぼゼロで行われます。
00:03:10可能な限りNodeに近い速度を目指しており、公式ドキュメントによれば、Nubファイルを
00:03:14実行するのにかかる時間はNodeと全く同じとのことです。正直なところ、BunはNodeを置き換える
00:03:19ネイティブランタイムであり、NubはNodeの上に構築されているため、Bunより速くなることはありません。
00:03:24実際に自分のMacでベンチマークを実行し、どちらが速いか試してみました。見やすく整理して
00:03:28結果を確認すると、私の環境ではNodeが一番速いという結果になりました。Nubと完全な
00:03:31同速ではなく、Nubが少し遅れをとりましたが、TSXは両者よりもさらに遅い結果でした。
00:03:36ファイルランナーの話はここまでにして、2つ目の機能であるNodeバージョンマネージャーに移りましょう。NVMや
00:03:41fnmが必要だった時代は終わりました。Nubでは、プロジェクト内に.node-versionファイルがあるか、.nvmrcや
00:03:46package.jsonで定義されていれば、NubがNode.jsから必要なバージョンを自動的にインストールしてくれます。
00:03:52現在このプロジェクトは最新のNode 26を使用していますが、このファイルを編集して「24」などの
00:03:56値に変更し、Nubで再実行すると、そのNodeバージョンを自動で取得してくれます。期待通りの
00:04:02一般的な管理コマンドもすべて備わっており、Nodeバージョンのインストール、インストール済み
00:04:06一覧の表示、アンインストールが可能です。さらに、そのNodeバージョンファイルを
00:04:10書き出してくれるバージョン固定機能(pinning)もあります。実にシンプルですね。それでは次の3つの機能へ
00:04:15進みましょう。ここではNubがpnpmやBunを置き換えることができます。まずは3つ目の機能である
00:04:20パッケージマネージャーです。pnpmよりも5倍高速であると謳われていますが、pnpmもすでに
00:04:25超高速だと思っていました。使い方は想像通りで、「nub install」でパッケージをインストールできます。ただ、非常に素晴らしいのは
00:04:31既存のロックファイルをそのまま引き継げる点です。以前のプロジェクトでBunやpnpmを使っていた場合でも、
00:04:36Nubは独自のロックファイルを作るのではなく、それらの既存ロックファイルを更新します。そのため、必要に応じて
00:04:41ツール同士を簡単に切り替えることができます。pnpmとの互換性についても同様です。Nubのあらゆる
00:04:46パッケージ管理コマンドは、pnpmのワークスペースカタログのような高度な
00:04:51機能も含め、pnpmと全く同じです。フラグも完全に同一なので、pnpmからNubへの置き換えは問題なく行えるはずです。
00:04:57また、npmやBun、Yarnをお使いの場合でも、それらのパッケージマネージャーの設定オプションがそのまま読み込まれます。
00:05:02速度に関する主張については、公式ベンチマークでNubがウォーム状態のフローズン
00:05:06インストールで最速を記録し、1,168個のパッケージのインストールに346ミリ秒しかかかりませんでした。私の環境でも
00:05:13212個のユニークパッケージに解決される14個の直接依存関係でテストを行いましたが、ベンチマーク通りNubが
00:05:19最速であることが証明されました。Nubのインストール時間は136ミリ秒、Bunが2番手で239ミリ秒、
00:05:25pnpmとnpmは実際には1秒以上かかりました。ですから、この圧倒的な速さに関する主張は
00:05:30私の環境でも正しかったようです。このパッケージマネージャーはセキュリティ面でも
00:05:35pnpmの良いところを取り入れており、デフォルトで最低公開経過時間が24時間に設定されているほか、承認されない限り
00:05:40ビルドスクリプトを実行しないため、大半のShai Hulud攻撃から安全に保護されます。パッケージマネージャーの
00:05:45もう一つの素晴らしい要素はパッケージの実行機能です。これが4つ目の機能であり、見出しとしては
00:05:49npxよりも19倍高速とされています。「nubx」コマンドはnode_modules内のbinフォルダを
00:05:54直接解決するため、Rust内でバイナリを直接実行します。つまりラッパー内にNodeプロセスが
00:05:59存在しないため、それらのnode_modulesへ直接アクセスする形になり、どのパッケージマネージャーでも動作します。
00:06:03Nubの他の多くのコマンドと同様、dlxコマンドを含めて「pnpm exec」と
00:06:07完全なフラグ互換性があります。Macでベンチマークを実行したところ、esbuildの実行時間において
00:06:12pnpmの423msに対してNubは169msと実際に最速であり、速度についての主張には十分な根拠があると言えます。
00:06:20パッケージマネージャーに必要な最後の機能はスクリプトランナーです。どうやらこれは
00:06:24「pnpm run」の24倍高速で、ライフサイクルフック、npm環境変数、
00:06:29引数の転送に対応しています。npmやpnpmを使う場合、これらは毎回Node.jsプログラムを立ち上げ、
00:06:34各パッケージマネージャーのJavaScriptをロードしますが、Nubは起動プロセスなしで
00:06:38自身のRustバイナリを使用するだけです。ローカルのベンチマークでも「nub run」が実際には最も高速でしたが、
00:06:43ドキュメントで見られるほど大差はありませんでした。また、この動画で言うのは
00:06:474回目になりますが、このコマンドもpnpmと完全なフラグ互換性があり、
00:06:51pnpmのモノレポ機能もサポートしている点は注記しておきます。これら直近の3つの機能に関して
00:06:56特に強調したいのは、Nubがゼロから作ったわけではないという点です。内部では、Miseの
00:07:00作者でもあるjdx氏が開発した「obe」というパッケージマネージャーが使われています。
00:07:04彼が他のライブラリに組み込めるパッケージマネージャーを作成し、Colinが彼と協力して
00:07:08これをNubに採用したため、決してコードを盗用したわけではありません。以上がNubの目玉機能ですが、
00:07:13公式のsetup-nodeを置き換える互換用GitHub Actionなど、
00:07:17まだまだ掘り下げるべき点はたくさんあります。まさにNode周辺のあらゆる作業を
00:07:21劇的に簡単にするためだけに作られたと言えます。ですが、ここで一つ疑問が残ります。「私自身、実際に
00:07:26これを使うだろうか?」という問いです。特定の状況であれば答えは「イエス」です。正直に言うと、私は
00:07:31かなりのBunヘビーユーザーですが、開発中に互換性の問題に遭遇したことはありません。新しい
00:07:35Rust移植版が出たことで移行を考えるかもしれませんが、それ以外の用途ではpnpmを使いますし、
00:07:40pnpmが極端に遅いと感じたこともありません。また、Nodeのバージョン管理には
00:07:44Miseを使っているので、そのあたりの機能を必要とするイメージも湧きませんが、
00:07:48TSXを置き換えるファイルランナー機能は欲しくなるかもしれません。ただ、自分にとって最高のユースケースとなるのは
00:07:52使い捨ての新しい仮想マシンを導入するときでしょう。テストのために素早く仮想マシンを立ち上げることがありますが、
00:07:57手軽にNode環境を準備したい場合、Nubは最も完成度の高いパッケージであり、
00:08:01最も素早く簡単に始められる方法だと思います。ですから、Nubを日常的に使わない理由は
00:08:05単に自分の従来習慣に拘っているからにすぎません。みなさんがパッケージマネージャーに
00:08:08何を使っているか、そしてNubのようなツールを検討しているか、あるいはRustで再構築された
00:08:12Bunからの乗り換えを考えているかなど、ぜひ下のコメント欄で教えてください。
00:08:16チャンネル登録もお忘れなく。それでは、また次の動画でお会いしましょう。

Key Takeaway

NubはNode.js上で動作するRust製の単一バイナリツールキットであり、既存のロックファイルやpnpmの互換性を維持したまま、136msという高速なパッケージインストールと完全なTypeScriptサポートを提供する。

Highlights

  • NubはNode.jsを置き換えるのではなく、その上で動作する1つのRustバイナリで構成されたオールインワンのJavaScriptツールキットである。

  • Zodの作者であるColin氏が開発したNubは、TSXを使わずにTypeScriptのEnumやNamespace、パラメータプロパティを処理できるファイルランナーを備えている。

  • ベンチマークテストにおいて、14個の直接依存関係(212個のユニークパッケージ)のインストールにかかった時間はNubが136msであり、Bunの239msや1秒以上を要したpnpm・npmを抑えて最速となった。

  • NubのパッケージマネージャーはpnpmやBunなどの既存のロックファイルを保持して更新するため、他のツールからの移行や相互運用が容易である。

  • 「nubx」コマンドはRust内でnode_modules内のバイナリを直接実行し、esbuildの実行速度でpnpm(423ms)を上回る169msを記録する。

Timeline

Nubの概要と開発背景

  • NubはNode.jsの上で動作し、パッケージマネージャーやTypeScriptランナー、Nodeバージョンマネージャーを統合したツールキットである。
  • Zodの制作者でありtRPCの概念実証やBunでの開発経験を持つColin氏によって開発された。

JavaScriptエコシステムにおけるツールの乱立を解消するため、Bunの主要機能を標準のNode.js環境下で実現する目的で構築されている。単一のRustバイナリとして提供され、Mac、Windows、Linuxのクロスプラットフォームで動作する。

TypeScriptと環境変数を直接処理するファイルランナー機能

  • ファイルランナーは型除去にとどまらない完全なTypeScriptサポートを提供し、TSXやts-nodeを不要にする。
  • .envや.env.localからの環境変数自動読み込みおよび自動変数展開に対応している。
  • JSON、YAML、HTML、テキストファイルの直接インポートやパスエイリアス、デコレータ、最新JavaScript構文をポリフィル付きで実行できる。

Node.js標準では実行できないEnumやNamespace、パラメータプロパティを含むコードをそのまま実行可能である。.env.localの値を最優先で読み込む仕組みや、tsconfig.jsonのパスエイリアス解決も標準で備えている。Node.jsとのフラグ互換性を保ちながら、オーバーヘッドを最小限に抑えた速度で動作する。

自動切り替えに対応したNodeバージョンマネージャー

  • プロジェクト内の.node-version、.nvmrc、package.jsonを読み取り、必要なNode.jsバージョンを自動取得する。
  • 手動でのインストール、一覧表示、アンインストール、バージョン固定コマンドを備える。

NVMやfnmなどの外部ツールを個別に導入する必要がなくなる。設定ファイルに記載されたバージョンに基づいて適切なNode.jsバイナリを即座にセットアップし、実行環境を統一する。

高速パッケージマネージャーと高い互換性

  • 212個のユニークパッケージに解決される依存関係のテストにおいて、136msで処理を完了し最速を記録した。
  • 既存のpnpmやBunのロックファイルを上書きせずそのまま更新する。
  • 24時間の最低公開経過時間設定と承認制のビルドスクリプト実行により、サプライチェーン攻撃を防ぐ。

pnpmのワークスペースカタログや各種コマンドフラグと完全な互換性を持つ。既存のロックファイルを破壊しないため、既存プロジェクトへの導入や他ツールとの併用が円滑に行える。Shai Huludなどの悪意あるパッケージ実行攻撃に対する防御策も標準で組み込まれている。

パッケージ実行(nubx)とスクリプトランナー

  • 「nubx」はRust内でnode_modulesのbinを直接呼び出し、esbuildの実行で169msを記録した。
  • スクリプトランナー「nub run」はNode.jsプロセスを毎回立ち上げずにRustバイナリから直接実行するため高速に動作する。
  • これらの機能の内部では、Miseの作者が開発したパッケージマネージャー「obe」が組み込まれている。

ラッパー内にNodeプロセスを挟まないため、npxやpnpm execよりもオーバーヘッドが少ない。モノレポ機能やライフサイクルフック、引数の転送などpnpmと同等の機能を高速に実行できる。

Nubのユースケースと総合評価

  • 一時的な仮想マシン環境やテスト環境の即時構築において最も効率的な選択肢となる。
  • 既存のpnpmやMise、Bunの運用フローを置き換えるかどうかが導入の判断基準となる。

単一のバイナリを入れるだけでNodeのバージョン管理からパッケージ管理、TS実行まで完結するため、新しい開発環境やクリーンなVMの立ち上げ時に最大の利便性を発揮する。

Community Posts

View all posts