node.jsの標準ライブラリ”fs.watch”でファイルに変更が加わることを監視し、アクションするようにする方法についてです。
以下は公式ドキュメント File system | Node.js v16.1.0 Documentation からのサンプルコードです。
少し変更を加えています。
const fs = require('fs');
fs.watch('./file.txt', (eventType, filename) => {
console.log(`event type is: ${eventType}`);
if (filename) {
console.log(`filename provided: ${filename}`);
} else {
console.log('filename not provided');
}
});
これでカレントディレクトリのファイル”./file.txt”の変更を監視、モニターし、変更があればログをする、という動作をするわけですが
今回はとりあえずファイルに動きがあったとき、にアクションをする、
ファイルに動きがあるまで待機、ファイルに動きが出たらスクリプトを続ける、という感じでサンプルを実装します。
以下、コード例です。
極力無駄なコードを省き、シンプルに最低限の動作をするように書きました。
(async function(){
await (new Promise((resolve) => {
fs.watch('./file', (e, f) => { resolve() })
})); // wait for file change
console.log("changed.");
})();
このfs.watchには、filereadsync、のような同期バージョンがないので、promiseを組み合わせて実装します。
“await”でpromiseを待機し、./fileファイルに変更があればresolve()を実行してpromiseを抜け、続けてのconsole.logを実行します。
今回はビルトインのnodejsライブラリで最低限のシンプルなファイル変更待機を実装しましたが、
こういったものを使用してコマンドラインツールにしたい、複雑なものを作りたい、という場合には、
まずこれ以外にも既に存在するライブラリやコマンドラインツール、
例えばbashの”inotifywait”やnodejsライブラリの”nodemon”など、を参照してみることをおすすめしています。