概要
JavaScript向けパッケージマネージャーpnpmは8月26日、コア実装をRustで全面的に書き直したバージョン12.0を正式にリリースした。8月上旬に公開されていたリリース候補版が、大きな問題報告なく正式版へと昇格した形となる。開発チームは今回の刷新について「意図的に移行ではない」と位置づけており、コマンド体系や設定ファイル、ロックファイル形式はpnpm 11との互換性を保ったまま、内部実装のみを刷新している。既存プロジェクトはコマンドや設定を変更することなく、そのままアップグレードできる設計だ。
パフォーマンスとアーキテクチャの改善
Rust化による最大の恩恵は、依存関係解決処理の高速化である。大規模な循環依存を含むワークスペースにおいて、ピア依存関係の解決速度が2〜3倍向上し、メモリ使用量は約25%削減されたという。あわせてロックファイルのサイズも大幅に縮小された。Linux環境向けには、packageImportMethod: auto設定時にハードリンクを優先的に採用する変更も加えられており、btrfsなどのファイルシステム上ではインストール時のnode_modules具体化に要する時間がおよそ半分に短縮されるとしている。
互換性への配慮と新機能
破壊的変更としては、Gitへの依存関係がHTTPS URLに正規化される点、pnpm-workspace.yaml内の未認識設定が警告として報告されるようになり、プロジェクトがピン留めしたpnpmバージョンと一致する場合はエラーになる点、engineStrictの挙動が厳密化された点などが挙げられる。一方で新機能も複数追加されており、Node.js・Deno・Bunがプロジェクトのピン留めバージョンに従う「プロジェクト認識グローバルバイナリ」、npmやYarn各種、Bunといった他のパッケージマネージャーそのものをプロビジョニングできる機能、脆弱性対応の代替パッケージに差し替える「レジストリリビジョン」、段階的公開の一括承認機能、そして試験的なリモート副作用キャッシュなどが盛り込まれた。pnpm init実行時に最新版のpnpmを自動的にピン留めする改善も行われている。
導入方法と今後の展望
現時点ではpnpmコマンドのlatestタグは引き続きpnpm 11系を指しているため、12系を試すにはpnpm self-update next-12で専用タグを指定してインストールする必要がある。互換性を保ちながら内部実装をRustに置き換えるという方針は、Node.jsエコシステムで広がるネイティブ実装への回帰の流れとも軌を一にしており、今後latestタグへの昇格が進めば、大規模モノレポを扱う開発者を中心に恩恵が広がりそうだ。