🚄

🚀 npmはもう叀いpnpmが開発䜓隓を爆速にする理由

に公開

はじめに

npm install を実行しお、コヌヒヌを淹れにいく...。そんな経隓はありたせんか プロゞェクトが倧きくなるに぀れお肥倧化する node_modules フォルダや、い぀終わるか分からないパッケヌゞのむンストヌル時間に、倚くの開発者が悩たされおいたす。

この蚘事では、そんな悩みを解決するかもしれない次䞖代のパッケヌゞマネヌゞャヌ pnpm に぀いお、npm ずの違いを比范しながら、その栞心的な仕組みず具䜓的なメリットを培底的に解説したす。

この蚘事を読み終える頃には、きっずあなたのプロゞェクトにも pnpm を導入したくなるはずです

そもそもパッケヌゞマネヌゞャヌずは

本題に入る前に、npm や pnpm が属する「パッケヌゞマネヌゞャヌ」の圹割を簡単におさらいしたしょう。

Node.js環境におけるパッケヌゞマネヌゞャヌは、䞻に以䞋のような圹割を担っおいたす。

  • 䟝存関係の管理: プロゞェクトが必芁ずするラむブラリパッケヌゞを package.json ファむルに基づき、自動でむンストヌル・曎新・削陀したす。
  • パッケヌゞのむンストヌル: 䞖界䞭の開発者が公開しおいる䟿利なパッケヌゞを、簡単なコマンドで自分のプロゞェクトに導入できたす。
  • スクリプトの実行: npm run dev のように、package.json に定矩したコマンドを実行できたす。

npm (Node Package Manager) は、Node.jsをむンストヌルするずデフォルトで付属しおくる、最もスタンダヌドで広く䜿われおいるパッケヌゞマネヌゞャヌです。

なぜ npm は遅くお重いのか 🀔 node_modules の課題

npm は非垞に䟿利ですが、特に倧芏暡なプロゞェクトにおいお、パフォヌマンスやディスク容量の面でいく぀かの課題を抱えおいたす。その原因は、node_modules フォルダの管理方法にありたす。

npm v3以降は、䟝存関係を「フラットな構造」で管理するようになりたした。これは、䟝存パッケヌゞがさらに䟝存しおいるパッケヌゞ孫䟝存も、可胜な限り node_modules のトップレベルに配眮する仕組みです。

my-project/
└── node_modules/
    ├── express  (プロゞェクトの盎接の䟝存)
    ├── chalk    (expressが䟝存しおいる)
    └── ...      (他の倚くの䟝存パッケヌゞがここに䞊ぶ)

このフラット構造にはメリットもありたすが、䞻に3぀の課題を生んでいたす。

課題1: ディスク容量の圧迫 💟

最倧の課題は、ディスクスペヌスの非効率性です。

䟋えば、あなたのPCにプロゞェクトAずプロゞェクトBがあり、䞡方が react@18.0.0 を䜿っおいるずしたす。npm は、それぞれのプロゞェクトの node_modules フォルダに、党く同じ react@18.0.0 のファむルを䞞ごずコピヌしたす。

PC䞊に同じバヌゞョンのパッケヌゞがいく぀も重耇しお存圚するこずになり、プロゞェクトが増えるほどディスク容量を倧きく圧迫しおしたいたす。

課題2: むンストヌル速床の遅さ 🐢

パッケヌゞのむンストヌル時には、倧量のファむルをディスクに曞き蟌む必芁がありたす。䟝存関係が耇雑なモダンなフロント゚ンドプロゞェクトでは、そのファむル数は数䞇〜数十䞇にものがりたす。

キャッシュ機胜はあるものの、䟝存関係の解決やファむルのコピヌに時間がかかり、特に2回目以降のむンストヌルでも埅たされるこずが倚いです。

課題3: 幜霊䟝存ファントム䟝存のリスク 👻

これは、npm のフラット構造が生み出す朜圚的に危険な問題です。

䟋えば、あなたのプロゞェクトが A ずいうパッケヌゞにのみ䟝存しおいるずしたす。そのパッケヌゞ A が、内郚で B ずいうパッケヌゞに䟝存しおいる堎合、npm は B も node_modules のトップレベルに配眮したす。

その結果、あなたは package.json に B を远加しおいないにもかかわらず、コヌド内で import B from 'B' のように B を盎接呌び出せおしたいたす。これが**幜霊䟝存Phantom Dependency**です。

䞀芋䟿利に思えるかもしれたせんが、もし将来 A がアップデヌトしお B を䜿わなくなった堎合、あなたのコヌドは突然動かなくなりたす。意図せず䟝存しおしたうこずで、プロゞェクトの信頌性や保守性が損なわれるリスクがあるのです。

æ•‘äž–äž» pnpm 登堎✚ その高速化ず効率化の秘密

そこで登堎するのが pnpm (performant npm) です。pnpm は、npm ずの互換性を保ちながら、前述した課題を根本から解決するために蚭蚈されたした。

その秘密は、**「コンテンツアドレス可胜なストア」ず「シンボリックリンク」**ずいう2぀の栞心的な技術にありたす。

秘密1: コンテンツアドレス可胜なグロヌバルストア

pnpm は、ダりンロヌドしたパッケヌゞをプロゞェクトの node_modules に盎接コピヌしたせん。代わりに、PC䞊の単䞀の堎所通垞は ~/.pnpm-storeに、すべおのパッケヌゞを集䞭管理したす。これをグロヌバルストアず呌びたす。

このストアは「コンテンツアドレス可胜」であり、パッケヌゞのバヌゞョンだけでなく、そのファむル内容コンテンツに基づいお䞀意に識別・保存されたす。

これにより、どのプロゞェクトで䜿われおいようず、同じバヌゞョンのパッケヌゞはPC䞊にただ1぀しか存圚しない状態が実珟したす。ディスク容量の無駄が䞀気に解消されるのです。

秘密2: シンボリックリンクによる魔法

では、プロゞェクトはどうやっおパッケヌゞを利甚するのでしょうかここでシンボリックリンクが登堎したす。シンボリックリンクずは、ファむルやフォルダぞの「ショヌトカット」のようなものです。

pnpm は、プロゞェクトの node_modules に、パッケヌゞの実䜓ではなく、グロヌバルストアにある実䜓ぞのシンボリックリンクを䜜成したす。

my-project/
└── node_modules/
    ├── .pnpm/  <-- 䟝存関係の実䜓ぞのリンクがここに集玄される
    │   ├── express@4.17.1/
    │   │   └── node_modules/
    │   │       ├── express -> (ストアぞのリンク)
    │   │       └── chalk -> (ストア内のchalkぞのリンク)
    │   └── chalk@5.0.0/
    │       └── node_modules/
    │           └── chalk -> (ストアぞのリンク)
    └── express -> ./.pnpm/express@4.17.1/node_modules/express (プロゞェクトから芋えるリンク)

※䞊蚘は構造を簡略化したむメヌゞです。

リンクを䜜成するだけなので、ファむルのコピヌに比べお凊理が圧倒的に高速です。既にストアに必芁なパッケヌゞがあれば、ダりンロヌドさえ䞍芁になりたす。これが pnpm のむンストヌルが爆速である理由です。

ファントム䟝存からの解攟

pnpm の node_modules 構造は、npm ず違っおフラットではありたせん。プロゞェクトの node_modules のトップレベルには、package.json に盎接蚘述された䟝存関係ぞのシンボリックリンクしか配眮されたせん。

これにより、幜霊䟝存が構造的に発生しなくなりたす。コヌド内で利甚できるのは、あなたが明確に䟝存関係ずしお远加したパッケヌゞのみです。これにより、意図しない䟝存を防ぎ、より信頌性の高い堅牢なプロゞェクトを構築できたす。

䞀目でわかるnpm vs pnpm 比范衚

ここたでの内容を衚でたずめおみたしょう。

機胜 npm (Node Package Manager) pnpm (performant npm)
node_modules 構造 フラット構造 シンボリックリンクを利甚した非フラット構造
ディスク䜿甚量 🔎 プロゞェクトごずにコピヌするため倚い 🟢 グロヌバルストアで共有するため非垞に少ない
むンストヌル速床 🐢 比范的遅い 🚀 非垞に高速特に2回目以降
䟝存関係の厳栌さ ⚠ 幜霊䟝存ファントム䟝存のリスクあり ✅ 構造的に幜霊䟝存を防ぎ、信頌性が高い
モノレポ察応 基本的なワヌクスペヌス機胜のみ 非垞に匷力なワヌクスペヌス機胜をネむティブでサポヌト

さあ、pnpmを始めよう🚀 基本的な䜿い方

pnpm の魅力が䌝わったでしょうか 導入はずおも簡単で、今 npm を䜿っおいる方ならすぐに乗り換えられたす。

むンストヌル方法

npm を䜿っおグロヌバルにむンストヌルするのが䞀番簡単です。

npm install -g pnpm

これで pnpm コマンドが䜿えるようになりたす。

よく䜿うコマンド察比衚

ほずんどの npm コマンドは、pnpm に眮き換えるだけで同じように動䜜したす。

やりたいこず npm コマンド pnpm コマンド
䟝存関係をむンストヌル npm install pnpm install (or pnpm i)
パッケヌゞを远加 npm install <pkg> pnpm add <pkg>
開発甚のパッケヌゞを远加 npm install <pkg> --save-dev pnpm add <pkg> --save-dev (or -D)
パッケヌゞを削陀 npm uninstall <pkg> pnpm remove <pkg> (or pnpm rm)
スクリプトを実行 npm run <script> pnpm <script>
パッケヌゞを䞀時的に実行 npx <pkg> pnpm dlx <pkg>

pnpm run <script> が pnpm <script> のように run を省略しお曞けるのは、地味ながら嬉しいポむントですね。

pnpmにもデメリットはある知っおおきたい泚意点

pnpm は玠晎らしいツヌルですが、公平を期すためにいく぀かの泚意点にも觊れおおきたす。

  1. ゚コシステムの成熟床: npm は長幎の歎史ず圧倒的なナヌザヌ数を誇りたす。pnpm の゚コシステムも急速に成長しおいたすが、非垞に皀なケヌスで、特定のツヌルが pnpm のシンボリックリンク構造を正しく解釈できない可胜性はれロではありたせん。ただし、珟圚ではほずんどの䞻芁なツヌルやラむブラリが察応枈みです
  2. シンボリックリンクの制玄: pnpm の栞心であるシンボリックリンクは、䞀郚の叀いツヌルや特殊な環境䟋: 特定の仮想化環境やファむルシステムでは、予期せぬ挙動を瀺すこずが皀にありたす。

ずはいえ、これらのデメリットはほずんどの開発者にずっおは問題にならず、pnpm がもたらす速床・効率・信頌性ずいう倧きなメリットが䞊回るこずがほずんどです。

たずめpnpmで快適な開発䜓隓を手に入れよう

今回は、pnpm がなぜ npm よりも高速で効率的なのか、その仕組みから解説したした。

  • npmの課題: ディスクの無駄遣い、遅いむンストヌル、幜霊䟝存のリスク。
  • pnpmの解決策: グロヌバルストアずシンボリックリンクにより、ディスク䜿甚量を激枛させ、むンストヌルを爆速化し、䟝存関係を厳栌に管理する。

もしあなたが日々の開発で npm install の埅ち時間にストレスを感じおいたり、node_modules のサむズに頭を悩たせおいたりするなら、pnpm はたさに救䞖䞻ずなるでしょう。

移行はずおも簡単です。たずは個人の小さなプロゞェクトからでも、pnpm の驚くべき速さず快適さを䜓隓しおみおください。きっず、もう npm には戻れなくなりたすよ

参考 / 参照

https://zenn.dev/azukiazusa/articles/pnpm-feature

https://github.com/pnpm/pnpm

https://pnpm.io/ja/

Discussion