Claude の支援を受けて作成したチュートリアルです。セキュリティ上の理由により、zipファイルの添付は許可していません。サンプルファイルが必要なメンバーは、Teams にて私まで連絡をください。
Node.js開発において、コードを変更するたびに手動でサーバーを再起動するのは面倒ですよね。Nodemonは、この問題を解決する開発者必須のツールです。この記事では、Nodemonの基本から応用まで、実践的な例を交えて詳しく解説します。
目次
1. Nodemonとは?
Nodemonは、Node.jsアプリケーションの開発時に使用する監視ツールです。ファイルの変更を自動的に検出し、アプリケーションを再起動してくれます。
主な特徴
- 🔄 自動再起動: ファイル変更時に自動的にNode.jsプロセスを再起動
- ⚙️ カスタマイズ可能: 監視対象や無視するファイルを細かく設定可能
- 🎯 軽量: 最小限のオーバーヘッドで動作
- 🚫 設定不要: デフォルト設定ですぐに使用開始可能
2. インストール方法
Nodemonは、グローバルまたはプロジェクトローカルにインストールできます。
グローバルインストール
システム全体で使用する場合:
npm install -g nodemon
ローカルインストール(推奨)
プロジェクト単位で管理する場合:
npm install --save-dev nodemon
package.jsonへのスクリプト追加
{
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
}
}
3. 基本的な使い方
コマンドラインでの使用
通常のNode.js実行:
node app.js
Nodemonを使用した実行:
nodemon app.js
NPMスクリプトでの使用
npm run dev
基本的なコマンドラインオプション
# 詳細モードで実行
nodemon --verbose app.js
# 特定の拡張子を監視
nodemon --ext js,json app.js
# 特定のディレクトリを監視
nodemon --watch src --watch config app.js
# 再起動の遅延を設定(ミリ秒)
nodemon --delay 2500 app.js
4. 実践例
例1: シンプルなNode.jsアプリケーション
app.js
console.log('Nodemonチュートリアルへようこそ!');
console.log('現在時刻:', new Date().toLocaleString('ja-JP'));
// このファイルを編集して保存すると、自動的に再実行されます!
const message = 'ここを編集してみてください';
console.log('メッセージ:', message);
実行方法:
nodemon app.js
例2: Express.jsサーバー
server.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json({
message: 'Nodemon + Express.js サーバー',
timestamp: new Date().toISOString(),
tip: 'このファイルを編集すると自動的に再起動します!'
});
});
app.listen(PORT, () => {
console.log(`サーバーが http://localhost:${PORT} で起動しました`);
});
例3: 環境変数を使用した開発
.env
NODE_ENV=development
PORT=3000
DEBUG=app:*
app.js
require('dotenv').config();
console.log('環境:', process.env.NODE_ENV);
console.log('ポート:', process.env.PORT);
5. 高度な設定
nodemon.json設定ファイル
プロジェクトのルートディレクトリにnodemon.json
を作成:
{
"watch": ["src", "config"],
"ext": "js,json,html",
"ignore": ["*.test.js", "node_modules/*"],
"delay": "1000",
"env": {
"NODE_ENV": "development"
},
"execMap": {
"js": "node",
"ts": "ts-node"
},
"events": {
"restart": "echo 'アプリケーションが再起動されました'",
"start": "echo 'アプリケーションが開始されました'"
}
}
設定オプションの詳細
オプション | 説明 | 例 |
---|---|---|
watch | 監視するディレクトリ | ["src", "lib"] |
ext | 監視する拡張子 | "js,json,ts" |
ignore | 無視するパターン | ["*.test.js", "logs/*"] |
delay | 再起動の遅延(ミリ秒) | "2500" |
env | 環境変数 | {"NODE_ENV": "dev"} |
exec | 実行コマンド | "node --inspect" |
legacyWatch | 古いファイルシステム用 | true |
TypeScriptプロジェクトの設定
{
"watch": ["src"],
"ext": "ts,json",
"ignore": ["*.spec.ts"],
"exec": "ts-node",
"env": {
"NODE_ENV": "development"
}
}
デバッグモードの設定
{
"exec": "node --inspect",
"ext": "js,json",
"env": {
"DEBUG": "*"
}
}
6. トラブルシューティング
よくある問題と解決方法
1. Nodemonが変更を検出しない
原因: ファイルシステムの監視制限
解決方法:
{
"legacyWatch": true,
"pollingInterval": 1000
}
2. 再起動が頻繁すぎる
原因: 一時ファイルやログファイルの変更
解決方法:
{
"ignore": ["*.log", "temp/*", ".git/*"],
"delay": "2500"
}
3. 特定のファイルが監視されない
原因: デフォルトの拡張子設定
解決方法:
nodemon --ext js,json,html,css app.js
4. ENOSPC エラー(Linux)
原因: ファイル監視の上限
解決方法:
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
7. ベストプラクティス
1. package.jsonスクリプトの活用
{
"scripts": {
"dev": "nodemon",
"dev:debug": "nodemon --inspect",
"dev:verbose": "nodemon --verbose",
"test:watch": "nodemon --exec 'npm test'"
}
}
2. 適切な無視設定
{
"ignore": [
".git",
"node_modules/**/node_modules",
"*.log",
"logs/*",
"coverage/*",
".nyc_output/*"
]
}
3. 環境別設定
nodemon.development.json
{
"env": {
"NODE_ENV": "development",
"DEBUG": "*"
},
"verbose": true
}
nodemon.production.json
{
"env": {
"NODE_ENV": "production"
},
"verbose": false
}
4. プロジェクト構造の例
project/
├── src/
│ ├── index.js
│ ├── routes/
│ └── models/
├── config/
├── tests/
├── nodemon.json
├── package.json
└── .gitignore
まとめ
Nodemonは、Node.js開発の生産性を大幅に向上させる素晴らしいツールです。基本的な使い方から高度な設定まで、プロジェクトのニーズに合わせて柔軟にカスタマイズできます。
重要なポイント
- ✅ 開発環境でのみ使用(本番環境では使用しない)
- ✅ プロジェクトごとにローカルインストール推奨
- ✅ 適切な無視設定で不要な再起動を防ぐ
- ✅ package.jsonスクリプトで統一的な開発環境を構築
参考リンク
サンプルコードのダウンロード: この記事で使用したすべてのサンプルコードは、下記のリンクからダウンロードできます。
📥 サンプルコードをダウンロード(nodemon-tutorial-samples.zip)
このチュートリアルが、あなたのNode.js開発をより効率的にする助けになれば幸いです。Happy Coding! 🚀