はじめに
Node.jsでサーバーを書いていると、コードを1行直すたびにCtrl+Cで止めてnode server.jsを打ち直す、という作業を繰り返しがちです。数回ならまだしも、これが1日に何十回と発生すると、地味に集中力を削られます。
nodemonは、この「保存するたびに手動で再起動する」作業をなくしてくれるツールです。監視対象のファイルが変更されたことを検知すると、自動でプロセスを再起動してくれます。使い方は驚くほどシンプルで、いつものnodeコマンドをnodemonに置き換えるだけです。
この記事では、nodemonのインストールから基本的な使い方、監視パターンや無視パターンのカスタマイズ、Node.js以外のスクリプトへの応用まで、実践的な使い方を順に紹介していきます。
nodemonとは
nodemonは、Node.jsアプリケーションの開発時に使うファイル監視・自動再起動ツールです。npmで公開されており、コマンドラインツールとしてnodeコマンドの代わりに実行することで、ソースコードの変更を検知するたびにアプリケーションを再起動してくれます。
Express、Koa、Fastifyのようなサーバーフレームワークを使った開発はもちろん、Node.js製のCLIツールやバッチ処理スクリプトの開発でも重宝します。長年にわたって使われ続けているツールで、create-react-app以前からNode.jsのデファクトスタンダードな開発補助ツールの1つとして定着しています。
主な特徴
- 導入の手軽さ -
nodeをnodemonに置き換えるだけで動作を始められ、コードの変更は一切不要 - 柔軟な監視設定 - 監視対象の拡張子・ディレクトリ、無視するパターンを細かく指定できる
- Node.js以外への対応 -
--execオプションを使えば、Python・Rubyなど他言語のスクリプトも監視・自動実行できる - 設定ファイルによる管理 -
nodemon.jsonやpackage.jsonのnodemonConfigにまとめて設定を書ける
インストール
プロジェクトの開発依存として入れておくのが一般的です。
npm install --save-dev nodemon
CLIとしてグローバルに使いたい場合は-gを付けます。
npm install -g nodemon
インストール不要で試したいときは、npx経由でそのまま実行することもできます。
npx nodemon server.js
基本的な使い方
一番シンプルな使い方は、nodeコマンドをそのままnodemonに置き換えることです。
nodemon server.js
これだけで、カレントディレクトリ以下の.jsファイルが監視対象になります。ファイルを保存すると、自動でプロセスが再起動し、コンソールにはこんなログが表示されます。
[nodemon] starting `node server.js`
[nodemon] restarting due to changes...
[nodemon] starting `node server.js`
引数を渡したい場合も、通常のnodeコマンドと同じ書き方で問題ありません。
nodemon server.js --port 8080
package.jsonのscriptsに登録しておけば、チームメンバー全員が同じコマンドで開発サーバーを起動できます。
{
"scripts": {
"dev": "nodemon server.js"
}
}
実行中に手動で再起動したくなったときは、rsと入力してEnterを押すだけです。ファイルを保存しなくても、いつでも明示的に再起動できます。
実践的なユースケース
監視対象・無視パターンのカスタマイズ
デフォルトでは.gitやnode_modulesなどが自動的に無視され、.jsファイルの変更が監視対象になります。実際のプロジェクトでは、テストファイルの変更で再起動してほしくない、逆に.jsonの設定ファイルも監視したい、といったケースが出てきます。そうした調整は--ignoreと-e(--ext)オプションで行います。
# tests配下は無視し、js/jsonファイルを監視する
nodemon --ignore tests/ -e js,json server.js
複数のディレクトリを監視したいときは--watchを重ねて指定します。
nodemon --watch app --watch libs server.js
こうした設定が増えてくると、コマンドラインが長くなって管理しづらくなります。そんなときはnodemon.jsonにまとめておくと、nodemonコマンド1つで同じ設定を再現できます。
{
"watch": ["app", "libs"],
"ext": "js,json",
"ignore": ["*.test.js", "**/fixtures/**"],
"delay": "1000"
}
delayは、変更検知から再起動までの待ち時間(ミリ秒)です。保存を連続して行う編集スタイルの場合、この値を設定しておくと再起動が何度も走るのを防げます。
package.jsonにまとめて設定する
新しく設定ファイルを増やしたくない場合は、package.jsonにnodemonConfigというキーを追加することで、nodemon.jsonと同じ内容を書けます。
{
"name": "my-app",
"scripts": {
"dev": "nodemon"
},
"nodemonConfig": {
"ignore": ["**/*.test.js", "docs/*"],
"delay": 2000
}
}
引数なしでnodemonを実行すると、package.jsonのmainフィールドで指定されたファイルが起動対象になります。設定とエントリーポイントを1ファイルにまとめられるので、リポジトリの見通しがよくなります。
Node.js以外のスクリプトを監視する
nodemonという名前ですが、実は監視・自動実行できるのはNode.jsスクリプトに限りません。--execオプションで実行コマンドを差し替えれば、Pythonスクリプトやシェルスクリプトの開発にも使えます。
# Pythonスクリプトをnodemonで監視する
nodemon --exec "python3" app.py --ext py
同じ拡張子を頻繁に使うなら、execMapで拡張子ごとのデフォルト実行コマンドを登録しておくと、--execの指定を省略できます。
{
"execMap": {
"py": "python3",
"rb": "ruby"
}
}
こうしておけば、nodemon app.pyと打つだけでPythonスクリプトの監視・自動実行が始まります。フロントエンドのビルドスクリプトからバックエンドの補助スクリプトまで、開発中に「保存したら実行し直したい」ものがあれば、言語を問わず同じ感覚で使えるのが便利なところです。
まとめ
nodemonは、nodeコマンドを置き換えるだけで導入できる手軽さと、--ignore・--watch・execMapといったオプションによる柔軟なカスタマイズ性を両立したツールです。今回紹介した内容だけでも、次のような場面で役立ちます。
- サーバーコードの保存のたびに手動再起動する手間をなくしたい
- テストファイルや特定のディレクトリだけ監視対象から外したい
- Node.js以外の言語のスクリプトも同じワークフローで開発したい
まずは既存のプロジェクトでnodeコマンドをnodemonに置き換えるところから試してみてください。nodemon.jsonでの設定管理まで進めば、チーム開発でも同じ監視ルールを共有できるようになります。