Bunに乗り換えずにNode.jsを高速で便利にする方法
BunとDenoエンジンは、おなじみのJS開発体験を刷新しました。ネイティブのTypeScriptサポート、即座にテストを起動できる機能、リアクティブなパッケージマネージャーが新しい品質基準を設定しています。しかし、実際の本番環境を新しいランタイムに移行する準備ができている人は多くありません。特定のC++アドオン、モジュールの動作の微妙な違い、蓄積されたレガシー,使得大多数プロジェクトはクラシックなNode.jsにとどまっています。
Nubプロジェクトチームは、異なるアプローチを取ることを決意しました。別の隔離されたランタイムを作成するのではなく、標準的なNodeを強化するRustでユーティリティを書きました。
アイデアの内容
開発者はプロジェクトに多くのユーティリティを導入することが一般的です:TypeScript実行用に4〜5つ、Node.jsバージョン管理用に6〜7つ、パッケージ用に8つ、環境変数用に9つです。その結果、スクリプトを起動すると、コードが実行を開始する前に数百ミリ秒の遅延が発生します。
Nubはこれらのすべての機能を1つのRustバイナリに統合しています。このツールは開発者とNode.jsの間の透過的なレイヤーとして機能します。内部ではV8と標準モジュールはそのままですが、周囲のすべてのツールはコンパイルされたコードのパフォーマンスで動作します。
0TypeScriptの実行と自動バージョン選択
10コマンドは、ビルドツールの設定なしで11、12、13、14、15などのフォーマットを実行します。
内部では、高速なOxc Rustパーサーを使用しています。トランスパイルと正しいパス解決(16や拡張子なしのインポートを含む)のために、Nubは最新のNode.js拡張ポイントを活用しています:17プリロードと18メカニズムです。
バージョン管理に関連する興味深い側面があります。ファイルを起動すると、Nubは19ファイル、20、または22の21セクションをチェックします。要求されたNodeバージョンがローカルで入手できない場合、ユーティリティはそれをキャッシュにダウンロードし、そのバージョンでコードを実行します。
1Nubはまた、新しいNode.js機能の実験的フラグを自動的に削除します。23、24、または25での作業では、CLIフラグを指定する必要なく即座に動作します。
スクリプトの高速化とバイナリの起動
26または27が呼び出されるたびに、完全なNode.jsプロセスが起動して28を読み取り、適切なシェルスクリプトを呼び出します。JS環境の初期化を待つことが明確なボトルネックとなっています。
29はRustで書かれているため、JavaScriptの初期化フェーズがありません。スクリプトは即座に取得されます。
開発者のベンチマークでは、30を通じてスクリプトをホット起動するのに約14ミリ秒かかります。比較すると、31は約330ミリ秒、32は440ミリ秒を超えています。
33ユーティリティも同様に動作し、34と35を置き換えます。36からバイナリを呼び出すとき、追加の中間Node.jsプロセスを作成しないため、37より約19倍高速です。
2パッケージがローカルで入手できない場合、38はレジストリからダウンロードし、実行し、一時的に作成されたファイルを削除します。
パッケージマネージャーとCorepackサポート
39コマンドは依存関係の取得を処理します。Aubeエンジンに基づいて構築されており、既存のロックファイルとの互換モードで動作できます。
40を持つプロジェクトに入ると、Nubはpnpm設定を尊重し、41を読み取り、競合なしで依存関係グラフを構築します。42または43を持つプロジェクトにも同じことが当てはまります。
パッケージインストール時のいくつかのセキュリティ機能:
- デフォルトで44スクリプトの自動ブロック。
- グラフ解決中にosv.dev脆弱性データベースに対するパッケージバージョンのチェック。
- サプライチェーン攻撃から保護するための24時間の最小リリース年齢制限。
複数のパッケージマネージャーバージョンで作業するための45コマンドが利用可能です。46、47、48のグローバルシムを作成します。これはバージョン25からNode.jsから削除されたCorepackの便利な代替品であり、47、48のグローバルシムを作成します。これはバージョン25からNode.jsから削除されたCorepackの便利な代替品であり、47、48のグローバルシムを作成します。これはバージョン25からNode.jsから削除されたCorepackの便利な代替品です。
実践的な使用方法
このツールはプロジェクト構造を変更したり、既存のインフラを諦めたりする必要はありません。グローバルにインストールして、クイックデバッグやローカルCLIユーティリティの実行にのみ使用できます。
3GitHub Actionsパイプラインでは、標準の49が50に置き換えられます。これは一貫したインターフェースを提供し、高速なキャッシュと依存関係のインストールを通じてビルドステップの実行を加速します。
まとめ
Nubは、Bunの利便性を評価しているがNode.jsを離れる技術的な制約に直面しているチームにとって、堅実な妥協点であることがわかります。このユーティリティは散らばったCLIツールのコレクションを統合し、日常的なコマンドを高速化し、1行もコードを書き換える必要はありません。
このプロジェクトは非常に新しいですが、GitHubで約3.8kのスターを獲得しています。少なくとも即座の51実行と便利な必要なNode.jsバージョンの自動ダウンロードのために、試してみる価値があります。
関連プロジェクト