A. 一番メジャーなnpmの問題を解決するため
JavaScriptを使う開発者であれば、一度は「パッケージマネージャー多すぎないか...?」と思ったことがあると思います。
npm、yarn、pnpmなど、Node.js上で動作するものだけでもいくつか存在しますし、最近ではNode.js以外のJavaScriptランタイム用のパッケージマネージャーも登場しています。
本記事では、これらのパッケージマネージャーがどれくらい存在するのか、そしてそれぞれが解決しようとしている問題について説明します。
1. どんなパッケージマネージャーがあるのか?
改めてどんなパッケージマネージャーがあるのかをご紹介
Node.jsで動くパッケージマネージャー
- npm
- yarn
- pnpm
Node.jsで動かないパッケージマネージャー
- bun
- deno
これらのパッケージマネージャーの特徴について詳しく見ていきます。
2. こんだけ多くのパッケージマネージャーがあるのって、npmがそんなにダメなの?
最も有名なパッケージマネージャーといえば、npmです。多くのNode.js開発者が使っているツールだが、
2010年にnpmがリリースされて以降、いくつかの問題が指摘されていました。
過去のnpmの問題点
- インストール速度の遅さ: 2017年まで、パッケージの並列インストールができなかった。
-
依存関係の壊れやすさ:
package-lock.json
の導入(2017年)以前は、インストール順によって依存関係が壊れることがあった。 - セキュリティ対策の脆弱さ: 2018年まで、パッケージのハッシュチェックやスクリプト実行の制御機能が不十分だった。
- オフライン利用の困難さ: 2017年まではキャッシュを利用してオフラインでインストールすることができなかった。
これらの問題は現在ではほとんど解決されていますが、それでも他のパッケージマネージャーが利用されているのは問題が概ね改善される2017年あたりまではnpmではないアプローチをよく採用されていたからでした。
3. yarnの台頭
yarnはMeta(旧Facebook)が開発したパッケージマネージャーです。ReactなどMetaの製品群で公式サポートされたことがあり、現在でも一定以上のユーザーから支持されています。yarnの大きなメリットは、npmの持っていたいくつかの問題(特にパッケージの並列インストールや依存関係の管理)を解決した点です。
4. pnpmとは?
pnpmは、npmのnode_modules
ディレクトリ構造に関連する問題を改善するために登場したパッケージマネージャーです。
pnpmの特徴
- パッケージ間で共通する依存パッケージはシンボリックリンクを使用して解決する。
- npmに似たディレクトリ構造だが、シンボリックリンクを使うことでnpmの依存関係に関する問題を避けている。
- Node.jsのバージョン管理機能も備えている。
このように、pnpmはnpmの課題を克服し、より効率的な依存関係の管理を提供しています。
5. bunとdenoは?
bunとdenoは、Node.jsとは異なるJavaScriptランタイムをベースにしています。それぞれ独自の特徴を持ち、Node.jsの限界を克服しようとしています。
Deno
- Node.jsの開発者が、Node.js設計時の反省点を踏まえて作り直したもの。
- TypeScriptをJavaScriptへのトランスパイルなしに実行できる。
- ファイル操作やネットワークアクセスが制御出来るようになっていてセキュリティ機能が強化されている。
- 現在の標準であるESModulesにのみ対応している。
bun
- bunは、Node.jsのTypeScriptサポートと実行速度を改善することを目指している。
- 2023年9月にv1.0.0がリリースされたばかりの新しいプロジェクトである。
6. 結局どれを使えばいいのか?
現在では、npmの多くの問題が解決されているため、npmでも十分に使えます。しかし、プロジェクトによってはyarnやpnpmを選択する理由があります。
- npm: 広くサポートされており、多くのプロジェクトで使用されている。
- yarn: Reactプロジェクトなどで公式サポートされていたため、一部のユーザーはyarnを好んでいる。
- pnpm: 複雑な依存関係管理が必要なプロジェクトでは、pnpmが有力な選択肢となる。
- deno: セキュリティを重視する環境や、TypeScriptをネイティブに扱いたい場合に向いている。
- bun: 高速な実行が求められる新しいプロジェクトで、今後の成長が期待される。
まとめ
JavaScriptのパッケージマネージャーは、各々の特性や歴史を持ち、時代のニーズに合わせた選択が求められてきました。なのでそのニーズの数だけ、パッケージマネージャーがあるというのが答えです。
過去、npmで槍玉に挙げられていた大きな問題は現在解消しており、ほとんどの場合でnpmが第一選択肢となるでしょう。