今さらだけど npm って何なの?
(ライブラリと開発ツール)

  • 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

npmは Node.js の付属品だった 2009 Node.js 誕生 2010 npm 公開(1月12日) 依存 管理 ライブラリのバージョン管理 ローカルインストール Project A node_modules/ Project B node_modules/ package.json package.json 異なるバージョンを並列管理できる プロジェクトごとに肥大化する

当初の目的はシンプルで、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 install -g <package> CLIツール例 tsc(TypeScript) Prettier ESLint Claude Code なぜnpm経由? Node.js ランタイム 実体がRust/Go製でも npm経由で配布できる 使う側からすると $ prettier . $ eslint src/ $ claude ただのコマンド ラインツール

この使い方が広まったことで、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で開発ツールを管理するという使い分けは今も続いています。

apt / brew vs npm の棲み分け apt / Homebrew 担当領域 システムライブラリ カーネル関連 デーモン管理 OS標準ツール 例:curl, git, nginx, python3 システム全体に影響する OS管理者が使うレイヤー sudo が必要なことも多い 役割分担 npm 担当領域 開発ツール JSライブラリ CLIツール AIツール配布 例:tsc, eslint, claude 開発者が最初に手を伸ばす プロジェクト単位で管理 守備範囲は変わらず拡張中

npmが変わったのは守備範囲ではなく、そこに集まってくるツールの種類です。
JavaScriptのライブラリ管理という出発点から、開発者がまず手を伸ばすツール配布の場所へと、少しずつ用途が広がってきました6

  1. npmはIsaac Z. Schlueterが2010年1月12日に公開しました。PHPのPEARやPerlのCPANに触発されて開発されたもので、当時Node.jsにはデフォルトのパッケージマネージャが存在しませんでした。 – npm – Wikipedia
  2. Node.jsはRyan Dahlが2009年に公開しました。npmはその翌年2010年1月に登場し、Node.jsコミュニティへの採用が急速に広がりました。 – Brief history and evolution of Node.js
  3. 複数のNode.jsプロジェクトを持つ開発者がnode_modulesの合計サイズを確認すると、10GB以上に達するケースも報告されています。各プロジェクトが同じパッケージを個別にコピーして持つ構造が原因です。pnpmはグローバルストアへのハードリンクを使ってこの問題を解決し、複数プロジェクト間でのディスク使用量を最大70〜80%削減できます。 – I reclaimed 10GB of disk space from node_modules
  4. 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
  5. esbuildはGoで書かれたバンドラですが、npm install時にプラットフォーム別のネイティブバイナリをoptionalDependenciesとして取得する仕組みを採用しています。RustやGoで書かれたCLIツールをnpmで配布する手法はSentryのCLIなど他のツールにも広まっています。 – esbuild – Getting Started
  6. npmのnode_modulesの肥大化問題を受けて、Yarnやpnpmといったnpmの代替パッケージマネージャが登場しています。pnpmは2017年にZoltan Kochanが開発し、グローバルストアとシンボリックリンクを使って同一パッケージの重複保存を避ける設計になっています。 – JavaScript package managers compared: npm, Yarn, or pnpm?