デザインについての学習メモブログ

npm入門:Node.jsパッケージ管理の基礎

記事内に広告が含まれています。

npm入門:Node.jsパッケージ管理の基礎

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なしの開発:

すべてのコードを自分で書く必要があるため、開発コストが高くなります。

JavaScript
// すべてのコードを自分で書く必要がある
function fetchData(url) {
  //↓↓↓↓↓  ここに全ての処理を書く  ↓↓↓↓↓↓↓↓↓↓

    // HTTP通信のコードを一から"様々な処理"を実装...
    // エラーハンドリング、リトライ処理など"数10行"も自分で書く...
  
  //↑↑↑↑↑  ここに全ての処理を書く  ↑↑↑↑↑↑↑↑↑↑
}

npmを使った開発:

特定の機能を簡単に実装できるライブラリ簡単に組み込めるにで、開発コストを大幅に削減できます。

JavaScript
// 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をインストールすると自動的に一緒にインストールされます。

インストール確認:

Bash
# Node.jsのバージョン確認
node -v
# => v20.10.0(例)

# npmのバージョン確認
npm -v
# => 10.2.3(例)

バージョンNoが表示されていれば、インストール済みである。

2.2 npmのアップデート

npmを最新版にアップデートする方法です。

Bash
# npmを最新版にアップデート
npm install -g npm@latest

# 特定のバージョンにアップデート
npm install -g npm@9.8.1

2.3 npmの設定確認

Bash
# 現在の設定を確認
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の作成

Bash
# 対話形式で作成
npm init

# デフォルト設定で作成(質問をスキップ)
npm init -y

フォルダー内をプロジェクトとして管理できる状態になる。

生成される基本的なpackage.json:

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(プロジェクト名)

JSON
{
  "name": "my-awesome-project"
}
  • 小文字のみ、スペース不可
  • ハイフンやアンダースコアは使用可能

version(バージョン)

JSON
{
  "version": "1.0.0"
}
  • セマンティックバージョニング(後述)に従う

オプションだが重要なフィールド:

description(プロジェクトの概要説明)

JSON
{
  "description": "素晴らしいプロジェクトの説明"
}

main(エントリーポイント)

JSON
{
  "main": "index.js"
}

パッケージをrequireしたときに読み込まれるファイル

scripts(スクリプト)

JSON
{
  "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(本番用の依存関係)

JSON
{
  "dependencies": {
    "express": "^4.18.2",
    "axios": "^1.6.0"
  }
}

* 「5. 依存関係の管理」で詳しく解説

devDependencies(開発用の依存関係)

JSON
{
  "devDependencies": {
    "nodemon": "^3.0.1",
    "jest": "^29.7.0"
  }
}

テストや開発に便利なライブラリ(後述)などを指定する

* 「5. 依存関係の管理」で詳しく解説

3.4 セマンティックバージョニング

npmではセマンティックバージョニング(SemVer)を使用します。

書式: MAJOR.MINOR.PATCH(例: 1.4.2

  • MAJOR(メジャー): 互換性のない変更
  • MINOR(マイナー): 後方互換性のある機能追加
  • PATCH(パッチ): 後方互換性のあるバグ修正

バージョン指定記号:

JSON
{
  "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"      // 最新版(非推奨)
  }
}

推奨: キャレット(^)を使用

JSON
{
  "dependencies": {
    "express": "^4.18.2"
  }
}

これは 4.18.2 以上 5.0.0 未満のバージョンを許可します。

4. npmコマンド基礎

4.1 パッケージのインストール

基本的なインストール:

Bash
# 本番用の依存関係としてインストール
npm install express

# 短縮形
npm i express

# 複数同時にインストール
npm install express axios dotenv
  • express:Webサービス(Webアプリ)のフレームワークのパッケージ
  • axios:HTTP通信のためのパッケージ
  • dotenv(ドットエンブ):環境変数を .env ファイルから読み込むためのパッケージ

「9. よく使うパッケージの紹介」で詳しく解説

開発用の依存関係としてインストール:

Bash
npm install --save-dev nodemon
# または
npm install -D nodemon

–save-dev-Dオプションをつける事で開発用の依存関係となり、本番用には含まれない

特定のバージョンをインストール:

Bash
# 完全一致
npm install express@4.18.2

# バージョン範囲指定
npm install express@^4.18.0
npm install express@~4.18.0

4.2 パッケージのアンインストール

Bash
# パッケージを削除
npm uninstall express

# 短縮形
npm un express

# 開発用依存関係から削除
npm uninstall --save-dev nodemon

nodemon(ノードモン)

ソースコードを変更すると、Node.js アプリを自動で再起動してくれるパッケージ

「9. よく使うパッケージの紹介」で詳しく解説

4.3 パッケージの更新

Bash
# すべてのパッケージを更新
npm update

# 特定のパッケージを更新
npm update express

# 最新版にアップデート(メジャーバージョンも含む)
npm install express@latest

4.4 インストール済みパッケージの確認

Bash
# インストール済みパッケージのリスト
npm list

# トップレベルのみ表示(推奨)
npm list --depth=0

# グローバルにインストールされたパッケージ
npm list -g --depth=0

# 古くなったパッケージを確認
npm outdated

4.5 パッケージ情報の確認

Bash
# パッケージの詳細情報を表示
npm show express

# 利用可能なバージョンを確認
npm show express versions

# パッケージのドキュメントを開く
npm docs express

# パッケージのGitHubページを開く
npm repo express

5. 依存関係の管理

5.1 dependencies と devDependencies

dependencies(本番環境で必要)

  • アプリケーションの動作に必要なパッケージ
  • 例: express, axios, mongoose
Bash
npm install express

mongoose(モングース)

MongoDB を便利に扱うための ODM(Object Data Modeling)ライブラリ。

devDependencies(開発環境でのみ必要)

  • 開発やテストにのみ必要なパッケージ
  • 例: nodemon, jest, webpack
  • Jest: JavaScript のテストフレームワーク。
  • webpack: 複数のJS・CSS・画像などを1つのファイルにまとめるビルドツール。
Bash
npm install --save-dev nodemon

本番環境へのデプロイ時:

Bash
# devDependenciesをインストールしない
npm install --production

# または環境変数で指定
NODE_ENV=production npm install

5.2 peerDependencies

プラグインやライブラリを作成する際に使用します。

JSON
{
  "peerDependencies": {
    "react": "^18.0.0"
  }
}

これは「このパッケージを使うには、React 18以上が必要です」という宣言です。

5.3 依存関係のツリー構造

Bash
# 依存関係のツリーを表示
npm list

# 特定のパッケージの依存関係を確認
npm list express

# なぜこのパッケージがインストールされているか
npm why lodash

出力例:

Bash
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 不要な依存関係のクリーンアップ

Bash
# 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フィールドに、よく使うコマンドを登録できます。

基本的な例:

Bash
{
  "scripts": {
    "start": "node index.js",
    "dev": "nodemon index.js",
    "test": "jest"
  }
}

実行方法:

Bash
npm start      # startは特別(npm run不要)
npm run dev    # その他はnpm runが必要
npm test       # testも特別(npm run不要)

6.2 実践的なscripts例

JSON
{
  "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 ライフサイクルスクリプト

特定のタイミングで自動実行されるスクリプトです。

接頭辞による自動実行:

JSON
{
  "scripts": {
    "prebuild": "echo 'ビルド前の処理'",
    "build": "webpack",
    "postbuild": "echo 'ビルド後の処理'"
  }
}

npm run buildを実行すると:

  1. prebuildが実行される
  2. buildが実行される
  3. postbuildが実行される

主なライフサイクル:

  • preinstall / install / postinstall
  • prestart / start / poststart
  • pretest / test / posttest
  • prestop / stop / poststop

6.4 スクリプト内で環境変数を使う

cross-envを使った環境変数設定:

Bash
npm install --save-dev cross-env
JSON
{
  "scripts": {
    "dev": "cross-env NODE_ENV=development nodemon index.js",
    "prod": "cross-env NODE_ENV=production node index.js"
  }
}

複数コマンドの連結:

JSON
{
  "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フォルダインストールされます。

Bash
npm install express

特徴:

  • プロジェクトごとに独立したバージョンを管理
  • node_modulesフォルダに保存
  • package.jsonに記録される
  • 推奨される方法

7.2 グローバルインストール

システム全体で使えるようにインストールします。

Bash
npm install -g nodemon

特徴:

  • コマンドラインツールをどこからでも実行可能
  • システム全体で1つのバージョンを共有
  • package.jsonに記録されない

グローバルインストールすべきパッケージ:

Bash
# 開発ツール
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コマンド(推奨)

グローバルインストールせずにコマンドを実行できます。

Bash
# グローバルインストール不要で実行
npx create-react-app my-app
npx cowsay "Hello World"

# ローカルにインストールされたパッケージを実行
npx nodemon index.js

npxのメリット:

  • グローバル汚染を避けられる
  • 常に最新版を使える
  • バージョン指定が簡単
Bash
# 特定バージョンを実行
npx typescript@4.9.0 --version

8. package-lock.jsonの役割

8.1 package-lock.jsonとは

package-lock.jsonは、インストールされたパッケージの正確なバージョンツリーを記録するファイルです。

8.2 なぜ必要なのか

問題: package.jsonだけでは不十分

JSON
{
  "dependencies": {
    "express": "^4.18.0"
  }
}

この場合、4.18.0から5.0.0未満のどのバージョンもインストール可能です。

  • 開発者Aは 4.18.2 をインストール
  • 開発者Bは 4.19.0 をインストール → 異なる環境で動作が変わる可能性

解決: package-lock.json

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 ベストプラクティス

必ずバージョン管理に含める:

Bash
git add package-lock.json
git commit -m "Add package-lock.json"

削除して再生成する場合:

Bash
rm package-lock.json
npm install

CI/CD環境では:

Bash
# package-lock.jsonを厳密に守る
npm ci

npm ciの特徴:

  • package-lock.jsonを厳密に再現
  • node_modulesを削除してクリーンインストール
  • 本番デプロイに推奨

9. よく使うパッケージの紹介

9.1 Webフレームワーク

Express(最も人気)

Bash
npm install express
Bash
const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(3000);

9.2 HTTP通信

Axios

Bash
npm install axios
JavaScript
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

Bash
npm install dotenv
JavaScript
require('dotenv').config();

const dbPassword = process.env.DB_PASSWORD;

9.4 日付処理

Day.js(軽量)

Bash
npm install dayjs
const dayjs = require('dayjs');

console.log(dayjs().format('YYYY-MM-DD'));

9.5 バリデーション

Joi

Bash
npm install joi
JavaScript
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

Bash
npm install lodash
JavaScript
const _ = require('lodash');

const array = [1, 2, 3, 4, 5];
const doubled = _.map(array, n => n * 2);

9.7 開発ツール

Nodemon(自動再起動)

Bash
npm install --save-dev nodemon
JSON
{
  "scripts": {
    "dev": "nodemon index.js"
  }
}

ESLint(コード品質チェック)

Bash
npm install --save-dev eslint
npx eslint --init

10. トラブルシューティング

10.1 よくあるエラーと解決方法

エラー: EACCES: permission denied

権限エラーです。sudoを使わずに解決します。

Bash
# npmのグローバルインストール先を変更
mkdir ~/.npm-global
npm config set prefix '~/.npm-global'

# .bashrcまたは.zshrcに追加
export PATH=~/.npm-global/bin:$PATH

# 設定を再読み込み
source ~/.bashrc

エラー: npm ERR! code ELIFECYCLE

スクリプトの実行エラーです。

Bash
# 詳細なログを確認
npm run <script-name> --verbose

# キャッシュをクリア
npm cache clean --force

# 再インストール
rm -rf node_modules package-lock.json
npm install

エラー: Cannot find module

モジュールが見つからないエラーです。

Bash
# 特定のパッケージを再インストール
npm install <package-name>

# すべて再インストール
npm install

10.2 キャッシュの問題

Bash
# キャッシュの確認
npm cache verify

# キャッシュのクリア
npm cache clean --force

10.3 バージョンコンフリクト

Bash
# 依存関係の問題を確認
npm ls <package-name>

# 重複パッケージを確認
npm dedupe

10.4 ネットワークの問題

Bash
# レジストリを変更(中国など)
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 デバッグモード

Bash
# 詳細なログを表示
npm install --loglevel verbose

# すべてのログを表示
npm install --loglevel silly

まとめ

npmは、Node.js開発において不可欠なツールです。この記事で学んだ内容を整理しましょう。

重要なポイント:

基礎知識

  • npmはパッケージ管理ツール
  • package.jsonでプロジェクトを管理
  • セマンティックバージョニングの理解

実践的なスキル

  • npm installでパッケージをインストール
  • dependenciesdevDependenciesの使い分け
  • npm scriptsで開発を効率化
  • npxでグローバルインストール不要に

ベストプラクティス

  • package-lock.jsonをバージョン管理に含める
  • ローカルインストールを優先
  • セマンティックバージョニングを守る
  • CI/CDではnpm ciを使用

トラブルシューティング

  • キャッシュクリアで多くの問題が解決
  • npm installの再実行は基本
  • ログを確認して原因を特定

npmをマスターすることで、Node.js開発の生産性が大きく向上します。

この記事を参考に、実際のプロジェクトでnpmを活用してみてください!

次のステップ:

  • Node.js入門シリーズでNode.jsの基礎を学ぶ
  • Express入門シリーズでWebアプリ開発に挑戦
  • 実際にプロジェクトを作ってnpmを使ってみる