npm(Node Package Manager)は、JavaScriptランタイム環境であるNode.jsのためのパッケージ管理システムであり、世界中の開発者が作成したオープンソースライブラリやツールを共有・利用するためのプラットフォームです。
本記事では、npmの構成や基本的な使い方に加え、実務でつまずきやすい依存関係管理の考え方、そして見落とされがちなセキュリティリスクまでを解説します。
npmとは
npmは、JavaScriptランタイム環境であるNode.jsのためのパッケージ管理システムであり、世界中の開発者が作成したオープンソースライブラリやツールを共有・利用するためのプラットフォームです。2009年にNode.jsとともに登場し、JavaScriptエコシステムの中心的存在として成長しました。
npmは、JavaScriptプロジェクトにおける依存関係の管理や、独自パッケージの公開と共有を効率化します。これにより、開発のスピードと生産性が向上します。
npmの構成
npm CLI
コマンドラインツールとして動作し、パッケージのインストールや管理を行います。Node.jsをインストールすると、npm CLIも自動的にインストールされます。
npmレジストリ
パッケージのオンラインリポジトリで、世界中の開発者がライブラリを共有しています。npm CLIは、このレジストリと通信してパッケージを取得します。
package.json
プロジェクトの依存関係やメタデータ(バージョン、スクリプトなど)を記述するファイルです。プロジェクトの「設計図」にあたり、以降のすべての操作がこのファイルに紐づいていきます。
npmの主な機能
パッケージのインストール
npmを使うことで、公開されているパッケージを簡単にインストールできます。
グローバルインストール(システム全体で利用可能)
npm install -g パッケージ名
ローカルインストール(プロジェクト内で利用可能)
npm install パッケージ名
パッケージのアップデート
既存のパッケージを最新バージョンに更新します。
npm update パッケージ名
パッケージの削除
不要になったパッケージを削除します。
npm uninstall パッケージ名
パッケージリストの確認
インストールされているパッケージを表示します。
npm list
プロジェクトの初期化(npm init)
npmはpackage.jsonというファイルを使って、プロジェクトの依存関係を記録します。
npm init
このコマンドでpackage.jsonが生成され、依存関係が明確になります。
カスタムスクリプト
package.json内にスクリプトを定義し、自動化を簡単に行えます。
“scripts”: { “start”: “node app.js”, “test”: “mocha” }
スクリプトを実行するには以下のようにします。
npm run start
依存関係の管理を理解する
npmを実務で使ううえで、つまずきやすいのが依存関係まわりの考え方です。ここでは特に重要な3つのポイントを解説します。
dependenciesとdevDependenciesの違い
package.jsonでは、依存関係を主にdependenciesとdevDependenciesに分けて管理します。dependenciesはアプリケーションの実行に必要なパッケージ(reactやexpressなど)を登録し、devDependenciesは開発・テスト・ビルド時にしか使わないパッケージ(jestやeslintなど)を登録します。
devDependenciesへの追加は`–save-dev`(短縮形`-D`)オプションで行います。
npm install –save-dev jest
本番環境では`npm install –omit=dev`を使うことで、devDependenciesをスキップしてインストールを軽量化できます。
package-lock.jsonの役割
package-lock.jsonは、依存ツリー内すべてのパッケージについて、実際に解決された正確なバージョンを記録するファイルです。これにより、同じロックファイルからインストールすれば、開発者間や環境が変わっても同じ依存関係ツリーを再現できます。
node_modulesは各自の環境で生成される「生成物」のためGit管理から外し、package.jsonとpackage-lock.jsonの2つをバージョン管理対象にするのが基本です。
npm installとnpm ciの違い
npm installは開発中の依存関係のインストール・更新に使い、必要に応じてpackage-lock.jsonを更新します。一方npm ciは、既存のpackage-lock.jsonをそのまま前提としたクリーンインストール用のコマンドで、package.jsonとの内容が一致しない場合はエラーになります。CI/CDなど、開発環境と同じ依存関係を確実に再現したい場面ではnpm ciを使うのが安全です。
npxとは
npmに同梱されている`npx`は、パッケージをグローバルインストールせずに、その場だけ取得して実行できるコマンドです。
npx create-react-app my-app
一度しか使わないようなCLIツールを毎回グローバルインストールする必要がなく、実行後は環境に残らないため、マシンごとのバージョンのズレも防げます。
npmの用途
- フロントエンド開発:React、Angular、Vue.jsといったフロントエンドフレームワークのパッケージ管理に利用します。
- バックエンド開発:Node.js環境でExpressやNestJSなどのライブラリを管理します。
- 自動化ツール:WebpackやGulpなどのビルドツール、LintやPrettierなどのコード品質ツールの実行に使います。
- テスト:MochaやJestなどのテストフレームワークを簡単に導入できます。
npmのメリット
- 生産性の向上:再利用可能なパッケージを活用することで、開発速度が向上します。
- コミュニティの強力なサポート:多数のオープンソースプロジェクトがnpmで管理されているため、豊富な選択肢があります。
- 依存関係の効率的な管理:package.jsonとpackage-lock.jsonにより、依存関係とそのバージョンを正確に記録できます。
- クロスプラットフォーム対応:Windows、macOS、Linuxなど、あらゆる環境で利用可能です。
npmのデメリット
- パッケージの質にばらつき:多数のパッケージが存在するため、品質やセキュリティに問題がある場合があります。
- 依存関係の複雑化:大規模なプロジェクトでは依存関係が複雑になり、管理が難しくなることがあります。
- セキュリティリスク:npmパッケージがマルウェアに感染している場合、プロジェクト全体に影響を及ぼす可能性があります。
npmと他のツールとの比較
npmとYarn
npmは標準的なツールで、Node.jsとともにインストールされます。Yarnは、Facebook(現Meta)が開発したnpmの代替ツールで、高速性やセキュリティに特化しています。npmと互換性があり、npmの設定ファイルであるpackage.jsonがそのまま使えます。
npmとpnpm
pnpmはnpmに似ていますが、依存関係の共有機能により、ディスク使用量を削減できる点が特徴です。「ディスクの無駄なコピーを減らしたい」「依存関係をより厳密に管理したい」という発想から生まれたツールです。
npmのセキュリティリスク
npmは非常に便利なツールですが、パッケージの利用モデルそのものが攻撃の標的になりやすいという課題を抱えています。具体的にどのようなリスクがあるのかを見ていきましょう。
タイポスクワッティング
人気のあるライブラリに非常によく似た名前のパッケージを、攻撃者が公開する手法です(例:`react-dom`の代わりに`react-domm`)。開発者や自動ビルドシステムが、依存関係を解決する際に誤って悪意のあるパッケージをインストールしてしまう危険があります。
依存関係の混乱(Dependency Confusion)
組織内で使っているプライベートパッケージと同じ名前のパッケージを、攻撃者が公開レジストリに登録する手法です。パッケージマネージャーがバージョン番号などをもとに公開版を優先して解決してしまうと、意図せず攻撃者のパッケージが取り込まれてしまう恐れがあります。
悪意のあるpostinstallスクリプト
npmパッケージには、インストール時に自動実行されるスクリプトを設定できます。攻撃者はこの`postinstall`のような仕組みを悪用し、`npm install`直後に環境変数の収集や認証情報の窃取、マルウェアの展開といった処理を実行させることがあります。
npmパッケージを狙ったサプライチェーン攻撃(2025年)
2025年9月、npmの有名メンテナーアカウントがフィッシングにより侵害され、debug や chalk などの人気JavaScriptライブラリに悪意あるコードが混入しました。さらに同時期には、npmパッケージ間で自己増殖する「Shai-Hulud」ワームも確認され、開発環境や依存パッケージを通じて被害が広がるリスクが問題となりました。
npmを安全に利用するための対策
セキュリティスキャンを実施する
`npm audit`コマンドを使用して、依存関係の脆弱性を検出できます。
npm audit
定期的なアップデートを行う
パッケージとnpm自体を最新バージョンに更新しましょう。新しいバージョンには、既知の脆弱性への修正が含まれていることが多くあります。
信頼できるパッケージのみを使用する
ダウンロード数やコミュニティのレビュー、メンテナンス状況を確認し、信頼性のあるパッケージを選択しましょう。
ロックファイルを活用する
package-lock.jsonを活用し、CI/CD環境ではnpm ciを使うことで、検証済みの依存関係ツリーをそのまま再現できます。
自動実行スクリプトに注意する
見慣れないパッケージを導入する際は、postinstall等のスクリプトが何をしているか確認する習慣を持ちましょう。
よくある質問(FAQ)
npmとNode.jsの違いは何ですか?
Node.jsはJavaScriptをブラウザ外で実行するためのランタイム環境そのものです。一方npmは、そのNode.js向けのパッケージ管理システムであり、Node.jsをインストールすると自動的に同梱されます。両者は別物ですが、セットで使われるのが基本です。
npm installとnpx、どちらを使うべきですか?
プロジェクトで継続的に使うパッケージ(reactやexpressなど)は`npm install`でプロジェクトに組み込みます。一方、`create-react-app`のように一度だけ実行すればよいツールは、環境を汚さない`npx`が向いています。
脆弱性が見つかった場合はどうすればよいですか?
まず`npm audit`の結果を確認し、`npm audit fix`で自動修正できるものは修正します。自動修正できない場合や影響範囲が大きい場合は、該当パッケージの代替や、修正済みバージョンへの手動更新を検討しましょう。
まとめ
npmは、JavaScriptとNode.jsのエコシステムを支える重要なツールであり、開発者が効率的にプロジェクトを管理し、共有するための強力なプラットフォームです。dependenciesとdevDependenciesの使い分けやpackage-lock.jsonの役割を理解することで、再現性の高い開発環境を維持できます。
一方で、タイポスクワッティングやサプライチェーン攻撃といったリスクも存在するため、npm auditの活用や信頼できるパッケージの選定など、日頃からの注意も欠かせません。


























![中小企業の情報瀬キィリティ相談窓口[30分無料]](/wp-content/uploads/2023/07/bnr_footer04.png)


