Node.js開発において、npmは欠かせないツールです。
世界最大のソフトウェアレジストリであるnpmを使いこなすことで、開発効率が飛躍的に向上します。
この記事では、npmの基礎から実践的な使い方まで、体系的に解説していきます。
💡この記事でわかる事
- npmとは何か
- npmのインストールと確認
- package.jsonの理解
- npmコマンド基礎
- 依存関係の管理
- npm scriptsの活用
- グローバル vs ローカルインストール
- package-lock.jsonの役割
- よく使うパッケージ
Contents
1. npmとは何か
1.1 npmの正式名称と役割
npm(Node Package Manager)は、Node.jsのパッケージ管理ツールです。
主な役割:
- パッケージのインストール: 他の開発者が作った便利なコードを簡単に導入
- 依存関係の管理: プロジェクトに必要なライブラリを自動管理
- バージョン管理: パッケージのバージョンを統一
- スクリプトの実行: よく使うコマンドを登録して実行
1.2 npmレジストリ
npmレジストリは、世界中の開発者が公開しているパッケージ(ライブラリ)の保管場所です。
数字で見るnpm:
- 300万以上のパッケージが公開されている(2024年時点)
- 毎週数千の新しいパッケージが追加される
- 世界中で毎日数十億回ダウンロードされる
1.3 なぜnpmが必要なのか
npmなしの開発:
すべてのコードを自分で書く必要があるため、開発コストが高くなります。
// すべてのコードを自分で書く必要がある
function fetchData(url) {
//↓↓↓↓↓ ここに全ての処理を書く ↓↓↓↓↓↓↓↓↓↓
// HTTP通信のコードを一から"様々な処理"を実装...
// エラーハンドリング、リトライ処理など"数10行"も自分で書く...
//↑↑↑↑↑ ここに全ての処理を書く ↑↑↑↑↑↑↑↑↑↑
}
npmを使った開発:
特定の機能を簡単に実装できるライブラリを簡単に組み込めるにで、開発コストを大幅に削減できます。
// 1行でHTTP通信ライブラリを導入
const axios = require('axios');
// 数行でデータ取得が完成
axios.get('https://api.example.com/data')
.then(response => console.log(response.data))
.catch(error => console.error(error));
ライブラリが変えれば、かなり行数を書く事になるが、ライブラリがあると4行だけですむ
2. npmのインストールと確認
2.1 Node.jsと一緒にインストールされる
npmは、Node.jsをインストールすると自動的に一緒にインストールされます。
インストール確認:
# Node.jsのバージョン確認
node -v
# => v20.10.0(例)
# npmのバージョン確認
npm -v
# => 10.2.3(例)
バージョンNoが表示されていれば、インストール済みである。
2.2 npmのアップデート
npmを最新版にアップデートする方法です。
# npmを最新版にアップデート
npm install -g npm@latest
# 特定のバージョンにアップデート
npm install -g npm@9.8.1
2.3 npmの設定確認
# 現在の設定を確認
npm config list
# グローバルインストール先を確認
npm config get prefix
# キャッシュの場所を確認
npm config get cache
3. package.jsonの理解
3.1 package.jsonとは
package.jsonは、Node.jsプロジェクトの設定ファイルです。
プロジェクトの名前、バージョン、依存パッケージなどの情報を管理します。
3.2 package.jsonの作成
# 対話形式で作成
npm init
# デフォルト設定で作成(質問をスキップ)
npm init -y
フォルダー内をプロジェクトとして管理できる状態になる。
生成される基本的なpackage.json:
{
"name": "my-project",
"version": "1.0.0",
"description": "プロジェクトの説明",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "あなたの名前",
"license": "ISC"
}
3.3 package.jsonの主要フィールド
必須フィールド:
name(プロジェクト名)
{
"name": "my-awesome-project"
}
- 小文字のみ、スペース不可
- ハイフンやアンダースコアは使用可能
version(バージョン)
{
"version": "1.0.0"
}
- セマンティックバージョニング(後述)に従う
オプションだが重要なフィールド:
description(プロジェクトの概要説明)
{
"description": "素晴らしいプロジェクトの説明"
}
main(エントリーポイント)
{
"main": "index.js"
}
パッケージをrequireしたときに読み込まれるファイル
scripts(スクリプト)
{
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"test": "jest",
"build": "webpack"
}
}
ターミナルから実行するコマンドのエイリアスです。
例えば、
“node index.js”を実行したければ、”npm run start“
“nodemon index.js”を実行したければ、”npm run dev“
のように”覚えやすいコマンド“で実行できるようになる。(「6. npm scriptsの活用」で詳しく解説)
dependencies(本番用の依存関係)
{
"dependencies": {
"express": "^4.18.2",
"axios": "^1.6.0"
}
}
* 「5. 依存関係の管理」で詳しく解説
devDependencies(開発用の依存関係)
{
"devDependencies": {
"nodemon": "^3.0.1",
"jest": "^29.7.0"
}
}
テストや開発に便利なライブラリ(後述)などを指定する
* 「5. 依存関係の管理」で詳しく解説
3.4 セマンティックバージョニング
npmではセマンティックバージョニング(SemVer)を使用します。
書式: MAJOR.MINOR.PATCH(例: 1.4.2)
- MAJOR(メジャー): 互換性のない変更
- MINOR(マイナー): 後方互換性のある機能追加
- PATCH(パッチ): 後方互換性のあるバグ修正
バージョン指定記号:
{
"dependencies": {
"package1": "1.0.0", // 完全一致(exactly)
"package2": "^1.0.0", // マイナー・パッチは更新可(1.x.x)
"package3": "~1.0.0", // パッチのみ更新可(1.0.x)
"package4": ">=1.0.0", // 1.0.0以上
"package5": "*", // 最新版(非推奨)
"package6": "latest" // 最新版(非推奨)
}
}
推奨: キャレット(^)を使用
{
"dependencies": {
"express": "^4.18.2"
}
}
これは 4.18.2 以上 5.0.0 未満のバージョンを許可します。
4. npmコマンド基礎
4.1 パッケージのインストール
基本的なインストール:
# 本番用の依存関係としてインストール
npm install express
# 短縮形
npm i express
# 複数同時にインストール
npm install express axios dotenv
- express:Webサービス(Webアプリ)のフレームワークのパッケージ
- axios:HTTP通信のためのパッケージ
- dotenv(ドットエンブ):環境変数を .env ファイルから読み込むためのパッケージ
「9. よく使うパッケージの紹介」で詳しく解説
開発用の依存関係としてインストール:
npm install --save-dev nodemon
# または
npm install -D nodemon
–save-devか-Dオプションをつける事で開発用の依存関係となり、本番用には含まれない
特定のバージョンをインストール:
# 完全一致
npm install express@4.18.2
# バージョン範囲指定
npm install express@^4.18.0
npm install express@~4.18.0
4.2 パッケージのアンインストール
# パッケージを削除
npm uninstall express
# 短縮形
npm un express
# 開発用依存関係から削除
npm uninstall --save-dev nodemon
nodemon(ノードモン)
ソースコードを変更すると、Node.js アプリを自動で再起動してくれるパッケージ
「9. よく使うパッケージの紹介」で詳しく解説
4.3 パッケージの更新
# すべてのパッケージを更新
npm update
# 特定のパッケージを更新
npm update express
# 最新版にアップデート(メジャーバージョンも含む)
npm install express@latest
4.4 インストール済みパッケージの確認
# インストール済みパッケージのリスト
npm list
# トップレベルのみ表示(推奨)
npm list --depth=0
# グローバルにインストールされたパッケージ
npm list -g --depth=0
# 古くなったパッケージを確認
npm outdated
4.5 パッケージ情報の確認
# パッケージの詳細情報を表示
npm show express
# 利用可能なバージョンを確認
npm show express versions
# パッケージのドキュメントを開く
npm docs express
# パッケージのGitHubページを開く
npm repo express
5. 依存関係の管理
5.1 dependencies と devDependencies
dependencies(本番環境で必要)
- アプリケーションの動作に必要なパッケージ
- 例: express, axios, mongoose
npm install express
mongoose(モングース)
MongoDB を便利に扱うための ODM(Object Data Modeling)ライブラリ。
devDependencies(開発環境でのみ必要)
- 開発やテストにのみ必要なパッケージ
- 例: nodemon, jest, webpack
- Jest: JavaScript のテストフレームワーク。
- webpack: 複数のJS・CSS・画像などを1つのファイルにまとめるビルドツール。
npm install --save-dev nodemon
本番環境へのデプロイ時:
# devDependenciesをインストールしない
npm install --production
# または環境変数で指定
NODE_ENV=production npm install
5.2 peerDependencies
プラグインやライブラリを作成する際に使用します。
{
"peerDependencies": {
"react": "^18.0.0"
}
}
これは「このパッケージを使うには、React 18以上が必要です」という宣言です。
5.3 依存関係のツリー構造
# 依存関係のツリーを表示
npm list
# 特定のパッケージの依存関係を確認
npm list express
# なぜこのパッケージがインストールされているか
npm why lodash
出力例:
my-project@1.0.0
├── express@4.18.2
│ ├── accepts@1.3.8
│ ├── body-parser@1.20.1
│ └── cookie@0.5.0
└── axios@1.6.0
5.4 不要な依存関係のクリーンアップ
# package.jsonに記載されていないパッケージを削除
npm prune
# すべて削除して再インストール
rm -rf node_modules package-lock.json
npm install
package-lock.json:
依存パッケージの「正確なバージョン」を固定するファイル。(npm install したときに自動生成)
「8. package-lock.jsonの役割」で詳しく解説
6. npm scriptsの活用
6.1 npm scriptsとは
package.jsonのscriptsフィールドに、よく使うコマンドを登録できます。
基本的な例:
{
"scripts": {
"start": "node index.js",
"dev": "nodemon index.js",
"test": "jest"
}
}
実行方法:
npm start # startは特別(npm run不要)
npm run dev # その他はnpm runが必要
npm test # testも特別(npm run不要)
6.2 実践的なscripts例
{
"scripts": {
"start": "node dist/index.js",
"dev": "nodemon src/index.js",
"build": "tsc",
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
"lint": "eslint src/**/*.js",
"lint:fix": "eslint src/**/*.js --fix",
"format": "prettier --write \"src/**/*.js\"",
"clean": "rm -rf dist",
"prebuild": "npm run clean",
"postinstall": "npm run build"
}
}
6.3 ライフサイクルスクリプト
特定のタイミングで自動実行されるスクリプトです。
接頭辞による自動実行:
{
"scripts": {
"prebuild": "echo 'ビルド前の処理'",
"build": "webpack",
"postbuild": "echo 'ビルド後の処理'"
}
}
npm run buildを実行すると:
prebuildが実行されるbuildが実行されるpostbuildが実行される
主なライフサイクル:
preinstall/install/postinstallprestart/start/poststartpretest/test/posttestprestop/stop/poststop
6.4 スクリプト内で環境変数を使う
cross-envを使った環境変数設定:
npm install --save-dev cross-env
{
"scripts": {
"dev": "cross-env NODE_ENV=development nodemon index.js",
"prod": "cross-env NODE_ENV=production node index.js"
}
}
複数コマンドの連結:
{
"scripts": {
"build": "npm run clean && npm run compile",
"build:parallel": "npm run clean & npm run compile",
"build:series": "npm run clean; npm run compile"
}
}
&&: 前のコマンドが成功したら次を実行&: 並列実行;: 前のコマンドの結果に関わらず次を実行
7. グローバル と ローカルインストール
7.1 ローカルインストール(デフォルト)
プロジェクトのnode_modulesフォルダにインストールされます。
npm install express
特徴:
- プロジェクトごとに独立したバージョンを管理
node_modulesフォルダに保存- package.jsonに記録される
- 推奨される方法
7.2 グローバルインストール
システム全体で使えるようにインストールします。
npm install -g nodemon
特徴:
- コマンドラインツールをどこからでも実行可能
- システム全体で1つのバージョンを共有
- package.jsonに記録されない
グローバルインストールすべきパッケージ:
# 開発ツール
npm install -g nodemon # ファイル変更を監視して自動再起動
npm install -g pm2 # プロセスマネージャー
npm install -g http-server # 簡易HTTPサーバー
npm install -g create-react-app # Reactアプリの雛形生成
# ビルドツール
npm install -g typescript # TypeScriptコンパイラ
npm install -g webpack-cli # Webpack CLI
# リンター・フォーマッター
npm install -g eslint # JavaScriptリンター
npm install -g prettier # コードフォーマッター
7.3 npxコマンド(推奨)
グローバルインストールせずにコマンドを実行できます。
# グローバルインストール不要で実行
npx create-react-app my-app
npx cowsay "Hello World"
# ローカルにインストールされたパッケージを実行
npx nodemon index.js
npxのメリット:
- グローバル汚染を避けられる
- 常に最新版を使える
- バージョン指定が簡単
# 特定バージョンを実行
npx typescript@4.9.0 --version
8. package-lock.jsonの役割
8.1 package-lock.jsonとは
package-lock.jsonは、インストールされたパッケージの正確なバージョンツリーを記録するファイルです。
8.2 なぜ必要なのか
問題: package.jsonだけでは不十分
{
"dependencies": {
"express": "^4.18.0"
}
}
この場合、4.18.0から5.0.0未満のどのバージョンもインストール可能です。
- 開発者Aは
4.18.2をインストール - 開発者Bは
4.19.0をインストール → 異なる環境で動作が変わる可能性
解決: package-lock.json
{
"name": "my-project",
"version": "1.0.0",
"lockfileVersion": 3,
"packages": {
"node_modules/express": {
"version": "4.18.2",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
"integrity": "sha512-..."
}
}
}
すべての開発者が同じバージョンをインストールできます。
8.3 ベストプラクティス
必ずバージョン管理に含める:
git add package-lock.json
git commit -m "Add package-lock.json"
削除して再生成する場合:
rm package-lock.json
npm install
CI/CD環境では:
# package-lock.jsonを厳密に守る
npm ci
npm ciの特徴:
- package-lock.jsonを厳密に再現
- node_modulesを削除してクリーンインストール
- 本番デプロイに推奨
9. よく使うパッケージの紹介
9.1 Webフレームワーク
Express(最も人気)
npm install express
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000);
9.2 HTTP通信
Axios
npm install axios
const axios = require('axios');
axios.get('https://api.example.com/data')
.then(response => console.log(response.data))
.catch(error => console.error(error));
9.3 環境変数管理
dotenv
npm install dotenv
require('dotenv').config();
const dbPassword = process.env.DB_PASSWORD;
9.4 日付処理
Day.js(軽量)
npm install dayjs
const dayjs = require('dayjs');
console.log(dayjs().format('YYYY-MM-DD'));
9.5 バリデーション
Joi
npm install joi
const Joi = require('joi');
const schema = Joi.object({
email: Joi.string().email().required(),
age: Joi.number().min(0).max(120)
});
const { error, value } = schema.validate({ email: 'test@example.com', age: 25 });
9.6 ユーティリティ
Lodash
npm install lodash
const _ = require('lodash');
const array = [1, 2, 3, 4, 5];
const doubled = _.map(array, n => n * 2);
9.7 開発ツール
Nodemon(自動再起動)
npm install --save-dev nodemon
{
"scripts": {
"dev": "nodemon index.js"
}
}
ESLint(コード品質チェック)
npm install --save-dev eslint
npx eslint --init
10. トラブルシューティング
10.1 よくあるエラーと解決方法
エラー: EACCES: permission denied
権限エラーです。sudoを使わずに解決します。
# npmのグローバルインストール先を変更
mkdir ~/.npm-global
npm config set prefix '~/.npm-global'
# .bashrcまたは.zshrcに追加
export PATH=~/.npm-global/bin:$PATH
# 設定を再読み込み
source ~/.bashrc
エラー: npm ERR! code ELIFECYCLE
スクリプトの実行エラーです。
# 詳細なログを確認
npm run <script-name> --verbose
# キャッシュをクリア
npm cache clean --force
# 再インストール
rm -rf node_modules package-lock.json
npm install
エラー: Cannot find module
モジュールが見つからないエラーです。
# 特定のパッケージを再インストール
npm install <package-name>
# すべて再インストール
npm install
10.2 キャッシュの問題
# キャッシュの確認
npm cache verify
# キャッシュのクリア
npm cache clean --force
10.3 バージョンコンフリクト
# 依存関係の問題を確認
npm ls <package-name>
# 重複パッケージを確認
npm dedupe
10.4 ネットワークの問題
# レジストリを変更(中国など)
npm config set registry https://registry.npmmirror.com
# デフォルトに戻す
npm config set registry https://registry.npmjs.org
# プロキシ設定
npm config set proxy http://proxy.example.com:8080
npm config set https-proxy http://proxy.example.com:8080
10.5 デバッグモード
# 詳細なログを表示
npm install --loglevel verbose
# すべてのログを表示
npm install --loglevel silly
まとめ
npmは、Node.js開発において不可欠なツールです。この記事で学んだ内容を整理しましょう。
重要なポイント:
基礎知識
- npmはパッケージ管理ツール
- package.jsonでプロジェクトを管理
- セマンティックバージョニングの理解
実践的なスキル
npm installでパッケージをインストール-
dependenciesとdevDependenciesの使い分け - npm scriptsで開発を効率化
-
npxでグローバルインストール不要に
ベストプラクティス
- package-lock.jsonをバージョン管理に含める
- ローカルインストールを優先
- セマンティックバージョニングを守る
- CI/CDでは
npm ciを使用
トラブルシューティング
- キャッシュクリアで多くの問題が解決
-
npm installの再実行は基本 - ログを確認して原因を特定
npmをマスターすることで、Node.js開発の生産性が大きく向上します。
この記事を参考に、実際のプロジェクトでnpmを活用してみてください!
次のステップ:
- Node.js入門シリーズでNode.jsの基礎を学ぶ
- Express入門シリーズでWebアプリ開発に挑戦
- 実際にプロジェクトを作ってnpmを使ってみる


























