ソースコードはここで見つけることができます: https://github.com/aelassas/watcher
Node.js アプリケーションで作業する場合、変更を加えた後にサーバーを再起動する必要があることがよくあります。そうですね、ソース コードに変更を加えるたびにサーバーを手動で再起動しなければならないとしたら、面倒です。ありがたいことに、変更が検出されたときにサーバーを自動的に再起動できるユーティリティがいくつかあります。そして最も有名なのはノデーモンです。 nodemon は、ディレクトリ内のファイルの変更が検出されたときにノード アプリケーションを自動的に再起動することで、Node.js ベースのアプリケーションの開発を支援するツールです。このヒントの目的は、車輪の再発明ではなく、Node.js アプリケーションの変更を監視し、わずか数行のコードでサーバーを自動的に再起動する独自のユーティリティを作成する方法を示すことです。
最初のステップは、Node.js プロジェクトを初期化することです:
npm init
次に、モジュールを type: として設定して ES6 のサポートを追加するために、package.json
を更新する必要があります。{ "name": "watcher", "type": "module", "version": "1.0.0", "author": "Akram El Assas" }
次に、開発依存関係をインストールします。
npm i -D @types/node
次のように、単純な Web サーバー server.js を作成します。
import { createServer } from 'http' const PORT = 8888 createServer((_, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }) res.write('Hello World!') res.end() }).listen(PORT) console.log('HTTP server is running on Port', PORT)
次に、次のコマンドを使用して、サーバーの親フォルダーとそのサブフォルダーで変更が検出されるたびにサーバーを再起動するためにウォッチャーを作成します。
node watcher.js server.js
ウォッチャーは変更が検出されるたびにサーバーを再起動します。
何よりもまず、コマンドライン引数を取得する必要があります。 Node.js では、process.argv を通じてコマンドライン引数にアクセスできます。 process.argv プロパティは、Node.js プロセスの起動時に渡されたコマンドライン引数を含む配列を返します。最初の要素は execPath になります。 2 番目の要素は、実行される JavaScript ファイルへのパスになります。残りの要素は追加のコマンドライン引数になります。
次のコマンドを実行すると:
node watcher.js server.js
process.argv は次のようになります:
[ 'C:\Program Files\nodejs\node.exe', 'C:\dev\watcher\src\watcher.js', 'server.js' ]
最初の要素は、Node.js 実行可能ファイルへのパスです。 2 番目の要素は、watcher.js へのパスです。そして最後の要素は server.js です。したがって、最初と 3 番目の要素を次のように宣言することでコードを開始できます。
npm init
次に、指定されたファイルを引数として使用して Node.js を起動する子プロセスを開始する関数を作成する必要があります。この場合は server.js です。これを行うには、child_process モジュールの spawn メソッドを使用します。 child_process.spawn() メソッドは、引数にコマンドライン引数を指定して、指定されたコマンドを使用して新しいプロセスを生成します。 spawn メソッドを使用する利点は、pipe メソッドを使用して子プロセスの stdout と stderr を親プロセスにリダイレクトできることです。パイプ メソッドは、書き込み可能なストリームを読み取り可能なストリームにアタッチするために使用されます。その結果、フロー モードに切り替わり、接続された書き込み可能なストリームにすべてのデータがプッシュされます。関数のソース コードは次のようになります:
{ "name": "watcher", "type": "module", "version": "1.0.0", "author": "Akram El Assas" }
まず、指定されたファイル引数を使用して子 Node.js プロセスを生成します。次に、子プロセスの stdout と stderr をパイプメソッドを使用して親プロセスにリダイレクトします。次に、子プロセスが閉じられると、同じ終了コードで親プロセスを終了します。 process.exit() メソッドは、コードの終了ステータスと同期してプロセスを終了するように Node.js に指示します。コードが省略された場合、exit は成功コード 0 または process.exitCode の値 (設定されている場合) を使用します。 Node.js は、すべての exit イベント リスナーが呼び出されるまで終了しません。そして最後に、子プロセスを返します。
ここで、ファイルの親フォルダーとそのサブフォルダーに対する変更を検出する必要があります。そして、JavaScript ファイルに関連する変更が検出されるたびに、子プロセスを強制終了し、子プロセスを再度生成します。これを行うには、fs/promises モジュールの watch メソッドを使用します。 fs/promises.watch() メソッドは、ファイル名の変更を監視する非同期イテレータを返します。ここで、ファイル名はファイルまたはディレクトリです。ファイルの親フォルダーにウォッチャーを作成します。次に、ウォッチャーを反復処理します。 node_modules フォルダーを無視し、JavaScript ファイルで変更が検出されるたびに、次のように子プロセスを強制終了し、再度生成します。
npm i -D @types/node
subprocess.kill() メソッドは子プロセスにシグナルを送信します。引数が指定されていない場合、プロセスには SIGTERM シグナルが送信されます。 SIGKILL シグナルはキャッチ、ブロック、無視できないため、子プロセスが強制的に停止されます。利用可能なシグナルのリストについては、signal(7) を参照してください。
それだけです!わずか数行のコードで独自のノードモンを完成させました。
最後に重要なことですが、次のように起動スクリプトと開発スクリプトを package.json に追加する必要があります。
import { createServer } from 'http' const PORT = 8888 createServer((_, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }) res.write('Hello World!') res.end() }).listen(PORT) console.log('HTTP server is running on Port', PORT)
アプリケーションを開始するには、次のコマンドを入力するだけです:
node watcher.js server.js
ここでアプリケーションを実行し、server.js に変更を加えると、サーバーは自動的に再起動されます。サーバーを手動で停止および起動する必要はなくなりました。
わずか数行のコードで独自のノードモンをセットアップしました。 watcher.js のソース コード全体は次のようになります:
npm init
これは単なる単純な例ですが、ビデオ ファイルの変更を監視し、変更が検出されるたびに変換の子プロセス (ffmpeg) が起動される他の状況も想像できます。
次のような他のオプションを実装することもできます。
以上が数行のコードで独自のノードモンを構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。