💭

pnpmについて調べたらパッケージマネージャの歴史に行き着いた

2023/01/26に公開

pnpmとは?

pnpm(Performant npm)はJavaScriptのパッケージマネージャで、npmと同様にJavaScriptのパッケージをインストールしたり、依存関係を管理するために使用されます。
pnpmはパフォーマンスやディスク使用量の削減、インストール済みパッケージのフォルダー構造の改善などで、npmに比べ有利な点があります。

pnpmがnpmよりも優れた点

pnpmはnpmと比較して、パフォーマンスの向上、ディスク使用量の削減、インストール済みパッケージのフォルダー構造の改善などが行われています。
pnpmは、同じパッケージを複数のプロジェクトで共有することで、ディスク使用量を削減することができます。
また、pnpmは、npmとは異なり、同じバージョンのパッケージを複数のプロジェクトで使用する場合にも、特定のプロジェクトのフォルダーにパッケージをインストールすることで、各プロジェクト間の依存関係の衝突を防ぐことができます。

結局メジャーなパッケージマネージャはどれを選んだらいいのか

npm,yarn,pnpmそれぞれ特徴やメリデメがあるはずです。
後発のパッケージマネージャたちはnpmに対して不満なところがあるからそれを克服しているはずです。
なので、今回はそれぞれ特徴と歴史を見ながら選定の理由を見つけていこうと思います。

歴史から振り返るnpm,yarn,pnpm

npmはJavaScriptのパッケージマネージャです。
JavaScriptの歴史年表があるのでそれを見ながら過去から現在に向かってnpm,yarn,pnpmについて掘り下げてみましょう。
https://www.jetbrains.com/ja-jp/lp/javascript-25/

npm

npmはNode Package Managerの略です。
開発元であるnpm Inc.は2014年に設立し、2020年にGitHubに買収されました。
2010年頃にはnpm以外にもパッケージマネージャはいくつか存在していました。
しかし、Node.jsの一般化によって2015年頃にnpmがもっとの人気のあるパッケージマネージャになったのです。

yarn

yarnとは、2016年にリリースされたnpmと互換性のある新しいパッケージマネージャです。
yarnはFaecbookによって開発され現在でのメンテナンスが続いています。(v1,v2,v3があります)
yarnの特徴は

  • npmに比べて高速
    • インストール済みのパッケージをローカルにキャッシュする
    • パラレルダウンロード
    • 依存関係解決アルゴリズムがnpm以上に高速
  • 独自のシンタックスを持つ
  • lock file機能
  • tree shaking

が挙げられます。これらはnpmが持つ問題を解決するためにFacebook社が作ったのものです。
npmの問題とは以下のものです。

  • 依存関係の不整合
    • 大規模なプロジェクトでは、多数のパッケージが依存しあっているため、依存関係の不整合が発生する可能性が高くなります
  • 依存関係の追跡
    • パッケージの依存関係が複雑に絡み合っているため、依存関係の追跡が困難になります
    • この結果、パッケージ由来のバグの検知が行いにくくなります
  • 不要な依存関係
    • 大規模なプロジェクトでは、不要な依存関係が多く存在し、それらを管理することが困難になります
  • バージョンの競合
    • 大規模なプロジェクトでは、複数のバージョンのパッケージが存在し、それらのバージョンの競合が発生する可能性があります

yarnの歴史

yarn v1は2016年にリリースされ、JavaScriptのパッケージマネージャとして人気を博しました。

yarn v2は2020年にリリースされ、Yarn v1の後継バージョンとなりました。yarn v3は2021年にリリースされ、yarn v2のアップグレードバージョンです。
yarn v2では、パフォーマンスの向上、インストール済みパッケージのフォルダー構造の改善、Workspacesという新機能の追加などが行われました。
yarn v3では、パフォーマンスの改善、インストール済みパッケージのフォルダー構造の改善、インストール済みパッケージのサイズの削減、TypeScriptに対応、WebAssemblyに対応などが行われました。

pnpm

pnpmは2016年に最初のリリースがされました。
以下のような特徴があります。

  • シングルストア
  • フォルダ隔離
  • セットアップ時間の短縮
  • 高速なインストール

npmの問題点を克服したと思われていたyarnですが、それでも問題がありました。

pnpmはそれらを解決しつつ、よりパフォーマンスが高いパッケージマネジメントを実現するために開発されています。
ここで疑問がyarnとpnpmどちらが優れているのかという疑問がわきます。
pnpmのほうが厳格に依存関係の整理やインストール済みのパッケージのフォルダ構造を作ります。pnpmのほうがより大規模の開発には向いていると言えるでしょう。

まとめ

3つのメジャーなパッケージマネージャについて歴史とともにその特徴や問題をみてきました。
結局どれを選定するのかと言うのは難しい問題です。
ですが、ここで上げた問題点とメリットを天秤にかけプロジェクトに何が最適なのかの理由付けの一助に慣ればとお思いました。

今回パッケージマネージャの比較をしたくて上記のようなことを調べました。
結局私はpnpmを採用しています。

参考資料

https://www.jetbrains.com/ja-jp/lp/javascript-25/
https://blog.ikeryo1182.com/yarn-and-npm
https://www.npmjs.com/
https://yarnpkg.com/
https://pnpm.io/ja/

株式会社ZOZO

Discussion