webpack の watch オプション的なことを手製のプログラムでする方法を紹介します。ファイルが変化する度、何かをしたい、という挙動は常に最新版のファイルを元にした変換後のファイルが欲しい、常に最新版のファイルをアップロードしたい、などといった需要があります。
これは次の様に fs.watch を使って実装するのが楽です。
const fs = require("fs");
/**
* 多重実行防止機能付きのファイル監視関数
* @param {String} tgt
* @param {()} callback
*/
function watch(tgt, callback) {
// 起動したことをコンソールに伝える
console.log('run replace.js watch mode')
/** @var {Boolean} callback が二重に動くことを防止するための変数 */
let lock = false;
// @see https://nodejs.org/api/fs.html#fs_fs_watch_filename_options_listener
fs.watch(tgt, {}, async () => {
if (lock) {// lock がかかっている時は動作しない
return;
}
lock = true;// 本筋に入ったら lock をかける
try {
// 渡された関数を実行
await callback();
} finally {
// 渡された関数がどうなろうと lock を解除する
lock = false;
}
});
}
watch(__dirname + "\\package.json", () => console.log('change package.json'))
Node.js の fs.watch メソッドが強力ですので、それを使うのが便利です。
File system | Node.js v18.0.0 Documentation##
これはファイルないしディレクトリのパスを渡して、そのパスの部分を監視して変化を通知します。上記のプログラムではそれに加えて無暗に処理が走らない様にしています。これによりファイルの読み書きが衝突しません。もし非同期実行実行で問題ないのであれば方がこの lock は不要です。