- npmはもともとNode.js用のパッケージマネージャとして2010年に登場し、JavaScriptライブラリの依存関係管理が出発点でした。
npm install -gによるグローバルインストールが普及すると、TypeScriptやESLint、Claude CodeといったCLIツールの配布インフラとしても使われ始めました。- npmは開発ツールのパッケージマネージャとして守備範囲を広げ、パッケージの実体がRustやGoで書かれていても、Node.jsがインストール処理を担うことでnpm経由の配布が成立します。
npmは、JavaScriptと関係ない分野でも、開発ツールのインストール用に使われるようになっているんですね。
1. npmとは?
npmを使っていると、ふとした疑問が浮かんできます。
- 「これってJavaScriptのライブラリを入れるツールじゃなかったっけ?」
- 「インストールしたパッケージがJavaScriptで書かれているとも限らないし、aptやbrewみたいに何でも入れられる気がする」
- 「Node.jsって、JavaScriptをローカルで動かすだけのものなのか?」
npmは、もともとの使い方からかなり用途が広がったツールです。
npmは、Node.js用のパッケージマネージャとして2010年に登場しました1。
当初の目的はシンプルで、JavaScriptのライブラリをプロジェクトにインストールして、バージョンを管理することでした。
1.1. ローカルインストールが基本の姿
npmの設計の中心にあるのは、プロジェクトごとの依存管理です。
Node.js自体も当時はサーバーサイドでJavaScriptを動かすという新しい試みで2、npmはその依存ライブラリを管理するためのツールという位置づけでした。npm installを実行するとプロジェクトディレクトリ内のnode_modulesにパッケージが入り、package.jsonに依存関係が記録されます。
npmはプロジェクト単位での管理が前提になっていて、同じパッケージの異なるバージョンを複数のプロジェクトで並列して持てます。
ただし、一方でnode_modulesがプロジェクトごとに肥大化するという問題もあります3。
2. グローバルインストールという使い方(npm install -g)
npm install -gでグローバルインストールすると、システム全体から呼び出せるCLIツールとして使えます。
この使い方が広まったことで、npmはJavaScriptの依存管理を超えた用途を持ち始めました。
TypeScriptのコンパイラtsc、コードフォーマッタのPrettier、リンタのESLintなどがその例です。
これらはNode.jsランタイムを借りて動きますが、使う側からするとただのコマンドラインツールです。
2.1. 開発ツールの配布インフラになった
フロントエンド開発のツールチェーンがnpm中心に整備されていくにつれ、JavaScriptを書かない開発者もnpmを使う場面が増えていきました。
バンドラ、型チェッカー、テストランナー、コードジェネレータなどの開発環境を整えるには、npmが事実上の入口になりました。
Codex CLIやClaude Codeといった開発者向けAIツールもnpm経由で配布されています4。
パッケージの実体がRustやC++で書かれていても、インストール処理をNode.jsが担うことでnpm経由で配布できます5。
開発者はすでにNode.js環境を持っていることが多いため、配布と更新の仕組みをnpmに乗せるのは便利なのです。
3. aptやbrewとの違い
ただ、npmは、システムライブラリ、カーネル関連、デーモンの管理には踏み込みません。
そこは、aptやbrewなどの領域で、aptでシステムを作り、npmで開発ツールを管理するという使い分けは今も続いています。
npmが変わったのは守備範囲ではなく、そこに集まってくるツールの種類です。
JavaScriptのライブラリ管理という出発点から、開発者がまず手を伸ばすツール配布の場所へと、少しずつ用途が広がってきました6。
- npmはIsaac Z. Schlueterが2010年1月12日に公開しました。PHPのPEARやPerlのCPANに触発されて開発されたもので、当時Node.jsにはデフォルトのパッケージマネージャが存在しませんでした。 – npm – Wikipedia
- Node.jsはRyan Dahlが2009年に公開しました。npmはその翌年2010年1月に登場し、Node.jsコミュニティへの採用が急速に広がりました。 – Brief history and evolution of Node.js
- 複数のNode.jsプロジェクトを持つ開発者が
node_modulesの合計サイズを確認すると、10GB以上に達するケースも報告されています。各プロジェクトが同じパッケージを個別にコピーして持つ構造が原因です。pnpmはグローバルストアへのハードリンクを使ってこの問題を解決し、複数プロジェクト間でのディスク使用量を最大70〜80%削減できます。 – I reclaimed 10GB of disk space from node_modules - Claude Codeは
npm install -g @anthropic-ai/claude-codeでインストールできます。ただしAnthropicは現在、ネイティブバイナリのインストール(curl -fsSL https://claude.ai/install.sh | bash)を推奨しており、npmインストールはNode.js 18以上が必要です。 – @anthropic-ai/claude-code – npm - esbuildはGoで書かれたバンドラですが、
npm install時にプラットフォーム別のネイティブバイナリをoptionalDependenciesとして取得する仕組みを採用しています。RustやGoで書かれたCLIツールをnpmで配布する手法はSentryのCLIなど他のツールにも広まっています。 – esbuild – Getting Started - npmのnode_modulesの肥大化問題を受けて、Yarnやpnpmといったnpmの代替パッケージマネージャが登場しています。pnpmは2017年にZoltan Kochanが開発し、グローバルストアとシンボリックリンクを使って同一パッケージの重複保存を避ける設計になっています。 – JavaScript package managers compared: npm, Yarn, or pnpm?