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チャンネル登録もお忘れなく。それでは、また次の動画でお会いしましょう。